詳解redis集群的三種方式
Redis三種集群方式:主從復(fù)制,哨兵模式,Cluster集群。
主從復(fù)制
基本原理
當(dāng)新建立一個(gè)從服務(wù)器時(shí),從服務(wù)器將向主服務(wù)器發(fā)送SYNC命令,接收到SYNC命令后的主服務(wù)器會(huì)進(jìn)行一次BGSAVE命令,在執(zhí)行期間,會(huì)將所有命令寫入緩沖區(qū)中,當(dāng)BGSAVE命令執(zhí)行完畢之后會(huì)將生成的RDB文件發(fā)送給從服務(wù)器,從服務(wù)器使用這個(gè)文件加載數(shù)據(jù)到內(nèi)存中,之后主服務(wù)器會(huì)以Redis命令協(xié)議的格式將緩沖區(qū)的命令發(fā)送給從服務(wù)器。此后每次主服務(wù)執(zhí)行命令都會(huì)同步給從服務(wù)器。即使有多個(gè)從服務(wù)器向主服務(wù)器發(fā)送SYNC命令,主服務(wù)器也只會(huì)執(zhí)行一個(gè)BGSAVE命令,就可以處理接下來的同步請(qǐng)求。一個(gè)主服務(wù)器可以擁有多個(gè)從服務(wù)器,而從服務(wù)器也可擁有從服務(wù)器,從而形成一個(gè)圖狀結(jié)構(gòu),復(fù)制功能不會(huì)阻塞主服務(wù)器,即使有一個(gè)或多個(gè)同步請(qǐng)求,主服務(wù)器依然能處理命令請(qǐng)求。
持久化開關(guān)
當(dāng)配置了主從復(fù)制模式時(shí)需要開啟主服務(wù)器的持久化功能,如果將主服務(wù)器的持久化功能關(guān)閉,主服務(wù)器一旦重啟,所有從服務(wù)器的數(shù)據(jù)將會(huì)丟失,即使配置了Sentinel模式,如果主服務(wù)器自動(dòng)拉起進(jìn)程比較快,以至于在Sentinel模式下還未選舉出新的主服務(wù)器,主服務(wù)的啟動(dòng)也會(huì)造成子服務(wù)器的數(shù)據(jù)丟失。
配置
配置一個(gè)主從復(fù)制模式,只需要使用Slaveof命令即可,在conf配置文件中添加或者是在redis中執(zhí)行命令。
SLAVEOF host port
哨兵模式
基本原理
Redis的Sentinel系統(tǒng)用于管理多個(gè)Redis,主要執(zhí)行以下三件事:
監(jiān)控:Sentinel會(huì)不斷的檢查主從服務(wù)器運(yùn)行狀態(tài)
提醒:當(dāng)某個(gè)Redis服務(wù)器出現(xiàn)故障,可通過API或者其他應(yīng)用程序發(fā)送通知
自動(dòng)故障遷移:當(dāng)一個(gè)主服務(wù)器不能正常工作時(shí),Sentinel會(huì)進(jìn)行一次故障自動(dòng)遷移,會(huì)將失效主服務(wù)器的從服務(wù)器選舉出一個(gè)新的主服務(wù)器,剩下的從服務(wù)器將會(huì)自動(dòng)連接復(fù)制選舉出來的新服務(wù)器的數(shù)據(jù)。
Redis的Sentinel系統(tǒng)是一個(gè)分布式的系統(tǒng),可以在系統(tǒng)中配置一個(gè)或多個(gè)Sentinel。
啟動(dòng)
使用redis-sentinel啟動(dòng)
redis-sentinel sentinel.confy
也可以使用redis-server來啟動(dòng)
redis-server sentinel.conf --sentinelyy
以上兩種方式都可以啟動(dòng)sentinel,啟動(dòng)sentinel必須指定配置文件,否則無法啟動(dòng):
配置
一個(gè)sentinel.conf文件最少需要一句配置:
sentinel monitor mymaster 127.0.0.1 6379 2
監(jiān)視一個(gè)別名叫做mymaster的主機(jī),地址是127.0.0.1,端口是6379,將這個(gè)主服務(wù)器判斷為失效至少需要2個(gè)sentinel同意。
無論設(shè)置多少個(gè)sentinel同意判斷一個(gè)主服務(wù)器的失效,都需要系統(tǒng)中多個(gè)Sentinel支持才能進(jìn)行故障遷移,而只有少數(shù)sentinel正常運(yùn)行的時(shí)候,是無法進(jìn)行故障遷移。
故障遷移
當(dāng)一個(gè)Sentinel發(fā)現(xiàn)主服務(wù)器下線時(shí),稱為主觀下線,只有多個(gè)Sentinel都發(fā)現(xiàn)主服務(wù)下線,并相互之間通過命令進(jìn)行交流判斷主服務(wù)器下線時(shí),稱為客觀下線。只有對(duì)主服務(wù)器進(jìn)行客觀下線時(shí),會(huì)選舉出領(lǐng)頭Sentinel,選舉出之后,會(huì)進(jìn)行新的主服務(wù)器投票選舉,選舉出一個(gè)從服務(wù)器升級(jí)為主服務(wù)器。并向被選中的從服務(wù)器發(fā)送Slaveof no one命令,讓其變?yōu)橹鞣?wù)器,通過發(fā)布訂閱的功能,將新的配置廣播給其他Sentinel進(jìn)行更新,并向下線的主服務(wù)器發(fā)送Slaveof命令,讓其復(fù)制新的主服務(wù)器,當(dāng)所有從服務(wù)器都已經(jīng)開始復(fù)制新的主服務(wù)器時(shí),領(lǐng)頭Sentinel終止本次故障遷移。
當(dāng)一個(gè) Redis 實(shí)例被重新配置是,無論是被設(shè)置成主服務(wù)器、從服務(wù)器、又或者被設(shè)置成其他主服務(wù)器的從服務(wù)器 ,Sentinel 都會(huì)向被重新配置的實(shí)例發(fā)送一個(gè)
CONFIG REWRITE
命令, 從而確保這些配置會(huì)持久化在硬盤里。
Cluster集群
之前的主從復(fù)制,哨兵模式都難以再現(xiàn)擴(kuò)容,而Redis cluster集群實(shí)現(xiàn)了對(duì)Redis的水平擴(kuò)容,即啟動(dòng)N個(gè)Redis節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)又可以有自己的從服務(wù)器,將數(shù)據(jù)均勻分布的存儲(chǔ)在這N個(gè)結(jié)點(diǎn)上,每個(gè)節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù)的1/N。Redis cluster集群就是一個(gè)可以在多個(gè)Redis節(jié)點(diǎn)之間進(jìn)行數(shù)據(jù)共享的設(shè)施;Redis cluster集群采用的是無中心化配置,即節(jié)點(diǎn)A無法處理,會(huì)將請(qǐng)求轉(zhuǎn)發(fā)只節(jié)點(diǎn)B進(jìn)行處理。
鍵分布模型
Redis集群中的鍵空間被分割為16384個(gè)槽位。每個(gè)主節(jié)點(diǎn)負(fù)責(zé)16384中槽位的一部分,Redis使用CRC16 算法進(jìn)行槽位分配。為了保證高可用,cluster模式也引入了主從復(fù)制模式,一個(gè)主節(jié)點(diǎn)對(duì)應(yīng)一個(gè)或多個(gè)從節(jié)點(diǎn),當(dāng)主節(jié)點(diǎn)發(fā)生宕機(jī)時(shí),可進(jìn)行故障轉(zhuǎn)移,將子節(jié)點(diǎn)升級(jí)為主節(jié)點(diǎn)。
配置cluster集群
Redis 集群由多個(gè)運(yùn)行在集群模式(cluster mode)下的 Redis 實(shí)例組成, 實(shí)例的集群模式需要通過配置來開啟,以下是一個(gè)包含了最少選項(xiàng)的集群配置文件示例:
port 7000 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes
cluster-enabled:打開集群模式
cluster-config-file:節(jié)點(diǎn)配置文件名,無須人為修改, 它由 Redis 集群在啟動(dòng)時(shí)創(chuàng)建, 并在有需要時(shí)自動(dòng)進(jìn)行更新
cluster-node-timeout:節(jié)點(diǎn)失聯(lián)時(shí)間,當(dāng)超過此毫秒,集群將自動(dòng)切換主從節(jié)點(diǎn)。
要讓集群正常運(yùn)作至少需要三個(gè)主節(jié)點(diǎn),而每個(gè)主節(jié)點(diǎn)都應(yīng)該正確配置一個(gè)或者多個(gè)從節(jié)點(diǎn)。
啟動(dòng)集群
使用redis-cli --cluster create命令將節(jié)點(diǎn)合并成一個(gè)集群
redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
--cluster-replicas 1 這個(gè)指的是從機(jī)的數(shù)量,表示我們希望為集群中的每個(gè)主節(jié)點(diǎn)創(chuàng)建一個(gè)從節(jié)點(diǎn)。
進(jìn)入集群模式只需要使用redis-cli -c命令
redis-cli -c -p 7000
無中心話節(jié)點(diǎn),所以進(jìn)入任意一個(gè)端口號(hào)的主節(jié)點(diǎn)即可。
到此這篇關(guān)于redis集群的三種方式的文章就介紹到這了,更多相關(guān)redis集群內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解利用redis + lua解決搶紅包高并發(fā)的問題
本篇文章主要介紹了利用redis + lua解決搶紅包高并發(fā)的問題 ,詳細(xì)的講訴了需求分析和方案,有興趣的可以了解一下。2016-11-11分布式鎖為什么要選擇Zookeeper而不是Redis?看完這篇你就明白了
Zookeeper的機(jī)制可以保證分布式鎖實(shí)現(xiàn)業(yè)務(wù)代碼簡(jiǎn)單,成本低,Redis如果要解決分布式鎖的問題,對(duì)于一些復(fù)雜的情況,很難解決,成本較高,這篇文章重點(diǎn)給大家介紹分布式鎖選擇Zookeeper 而不是Redis的理由,一起看看吧2021-05-05Redis教程(四):Hashes數(shù)據(jù)類型
這篇文章主要介紹了Redis教程(四):Hashes數(shù)據(jù)類型,本文講解了Hashes數(shù)據(jù)類型概述、相關(guān)命令列表和命令使用示例等內(nèi)容,需要的朋友可以參考下2015-04-04使用redis實(shí)現(xiàn)延遲通知功能(Redis過期鍵通知)
這篇文章主要介紹了使用redis實(shí)現(xiàn)延遲通知功能(Redis過期鍵通知)的相關(guān)知識(shí),本文通過實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-09-09redis啟動(dòng)和退出命令行簡(jiǎn)單操作步驟
Redis是一種鍵值存儲(chǔ)數(shù)據(jù)庫(kù),用戶可以使用它來存儲(chǔ)和檢索大量的鍵值數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于redis啟動(dòng)和退出命令行的相關(guān)資料,需要的朋友可以參考下2024-03-03Redis數(shù)據(jù)庫(kù)分布式設(shè)計(jì)方案介紹
大家好,本篇文章主要講的是Redis數(shù)據(jù)庫(kù)分布式設(shè)計(jì)方案介紹,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01