redis主從,哨兵,cluster叢集
阿新 • • 發佈:2022-04-21
redis主從,哨兵,cluster叢集
一,redis主從複製
1.主從複製概念
主從複製:將一臺redis伺服器的資料,複製到其他的redis伺服器上;
其中,前者為主資料庫,後者為從資料庫,主資料庫可以進行讀寫操作,當寫操做導致資料變化時自動將資料同步給從資料庫,而從資料庫一般是隻讀的,並接收主資料同步過來的資料。一個主資料庫可以擁有多個從資料庫,而一個從資料庫只能擁有一個主資料庫。
2.主從複製作用
高可用基石:主從複製是哨兵和叢集能夠實施的基礎; 資料冗餘:實現了資料的熱備份,是持久化之外的一種資料冗餘方式; 故障恢復:當主節點出現問題時,可以由從節點提供服務,實現快速的故障恢復,也是一種服務的冗餘; 負載均衡:在主從複製的基礎上,配合讀寫分離,可以由主節點提供寫服務,由從節點提供讀服務,分擔伺服器負載;尤其是在寫少讀多的場景下,通過多個從節點分擔讀負載,可以大大提高Redis伺服器的併發量。
3.主從複製流程
1.若啟動一個Slave機器程序,則它會向Master機器傳送一個sync_command命令,請求同步連線 2.無論是第一次連線還是重新連線,Master機器都會啟動一個後臺程序,將資料快照(RDB)儲存到資料檔案中(執行rdb操作),同時Master還會記錄修改資料的所有命令並快取在資料檔案中。(完全備份) 3.後臺程序完成快取操作之後,Master機器就會向Slave機器傳送資料檔案,Slave端機器將資料檔案儲存到硬碟上,然後將其載入到記憶體中,接著Master機器就會將修改資料的所有操作一併傳送給Slave端機器。 若Slave出現故障導致宕機,則恢復正常後會自動重新連線。 4.Master機器收到slave端機器的連線後,將其完整的資料檔案傳送給Slave端機器,如果Mater同時收到多個slave發來的同步請求則Master會在後臺啟動一個程序以儲存資料檔案,然後將其傳送給所有的Slave端機器,確保所有的Slave端機器都正常。
二,哨兵模式
1.哨兵原理
哨兵的核心功能:在主從複製的基礎上,哨兵引入了主節點的自動故障轉移
哨兵(sentinel):是一個分散式系統,用於對主從結構中的每臺伺服器進行監控,當出現故障時通過投票機制選擇新的JMaster並將所有Slave連線到新的Master。所以整個執行哨兵的叢集的數量不得少於3個節點。
2.哨兵作用
叢集監控:負責監控Redis master和slave程序是否正常工作; 訊息通知:如果某個Redis例項有故障,那麼哨兵負責傳送訊息作為告警通知給管理員; 故障轉移:如果master 節點掛掉了,會自動轉移到slave 節點上(offset 段偏移量); 配置中心:如果故障轉移發生了,通知client客戶端新的master地址。
3.哨兵監控節點及哨兵間的監控流程
哨兵監控節點流程:
1.首先主節點的資訊是配置在哨兵(Sentinel)的配置檔案中;
2.哨兵節點會和配置的主節點建立起兩條連線,分別為:命令連線和訂閱連線
命令連線:和master建立連線關係;
訂閱連線:持續性的從master節點處,獲取redis叢集資訊
3.哨兵會通過命令連線每10s傳送一次INFO命令,通過INFO命令,
主節點會返回自己的run_id和自己的從節點資訊(命令:redis-cli info replication);
4.哨兵會對這些從節點也建立兩條連線命令連線和訂閱連線;
5.哨兵通過命令連線向從節點發送INFO命令,獲取到他的一些資訊
run id(redis伺服器id)
role(職能)
從伺服器的複製偏移量offset
哨兵間的監控:
1.通過命令連線向伺服器的sentinelhello頻道傳送一條訊息,內容包括自己的ip埠、run id、配置(後續投票的時候會用到)等;
2.通過訂閱連線對伺服器的sentinelhello頻道做了監聽,所以所有的向該頻道傳送的哨兵的訊息都能被接受到;
3.解析監聽到的訊息,進行分析提取,就可以知道還有那些別的哨兵服務節點也在監聽這些主從節點了,更新結構體將這些哨兵節點記錄下來;
4.向觀察到的其他的哨兵節點建立命令連線----沒有訂閱連線
4.哨兵模式下的故障遷移
1.主觀下線
哨兵(Sentinel)節點會每秒一次的頻率向建立了命令連線的例項傳送PING命令,如果在down-after-milliseconds毫秒內沒有做出有效響應
包括(PONGLOADINGMASTERDOWN)以外的響應,哨兵就會將該例項在本結構體中的狀態標記為SRI_S_DOWN主觀下線
2.客觀下線
當一個哨兵節點發現主節點處於主觀下線狀態是,會向其他的哨兵節點發出詢問,該節點是不是已經主觀下線了。
如果超過配置引數quorum個節點認為是主觀下線時,該哨兵節點就會將自己維護的結構體中該主節點標記為SRIO DOWN客觀下線詢問命令SENTINEL is-master-down-by-addr
3.master選舉
在認為主節點客觀下線的情況下,哨兵節點節點間會發起一次選舉,命令為SENTINEL is-master-down-by-addr
只是runid這次會將自己的runid帶進去,希望接受者將自己設定為主節點。
如果超過半數以上的節點返回將該節點標記為leacer的情況下,會有該leader對故障進行遷移
4.故障轉移
在從節點中挑選出新的主節點:通訊正常;優先順序排序;優先順序相同時選擇offset最大的
將該節點設定成新的主節點SLAVEOF no one,並確保在後續的INGO命令時 該節點返回狀態為master ;
將其他的從節點設定成從新的主節點複製,SLAVEOF命令;
將舊的主節點變成新的主節點的從節點
5.哨兵模式優缺點
優點:高可用,哨兵模式是基於主從模式的,所有主從模式的優點,哨兵模式都具有有;主從可以自動切換,系統更健壯,可用性更高;
缺點:redis比較難支援線上擴容,在群集容量達到上限時線上擴容會變得很複雜;寫操作無法負載均衡; 儲存能力受到單機的限制。
三,cluster叢集
1.叢集概念
叢集,即Redis Cluster,是Redis 3.0開始引入的分散式儲存方案。
叢集由多個節點(Node)組成,Redis的資料分佈在這些節點中。
叢集中的節點分為主節點和從節點:只有主節點負責讀寫請求和叢集資訊的維護;從節點只進行主節點資料和狀態資訊的複製。
2.叢集作用
(1)資料分割槽
資料分割槽(或稱資料分片)是叢集最核心的功能。
叢集將資料分散到多個節點,一方面突破了Redis單機記憶體大小的限制,儲存容量大大增加;另一方面每個主節點都可以對外提供讀服務和寫服務,大大提高了叢集的響應能力。
Redis單機記憶體大小受限問題,在介紹持久化和主從複製時都有提及;例如,如果單機記憶體太大,bgsave和bgrewrifeaof的fork操作可能導致主程序阻塞,主從環境下主機切換時可能導致從節點長時間無法提供服務,全量複製階段主節點的複製緩衝區可能溢位。
(2)高可用
叢集支援主從複製和主節點的自動故障轉移(與哨兵類似)﹔當任一節點發生故障時,叢集仍然可以對外提供服務。
3.redis叢集資料分片
叢集內建了16384個slot(雜湊槽),並且把所有的物理節點對映到了這16384[0-16383]個slot上,或者說把這些slot均等的分配給了各個節點。
當需要在Redis叢集存放一個數據(key-value)時,redis會先對這個key進行crc16演算法,然後得到一個結果再把這個結果對16384進行求餘,這個餘數會對應[0-16383]其中一個槽,進而決定key-value儲存到哪個節點中。所以一旦某個節點掛了,該節點對應的slot就無法使用,那麼就會導致叢集無法正常工作。
示例(三個節點) :
節點A覆蓋0-5460;
節點B覆蓋5461-10922;
節點C覆蓋10923-16383
即每個節點有5460個雜湊槽
四,主從複製,哨兵,叢集部署
1.主從複製部署
環境:
redis-master:192.168.11.14
redis-slave:192.168.118.128
redis-slave:192.168.118.132
1.關閉防火牆和安全元件(所有主機)
systemctl stop firewalld
setenforce 0
2.所有主機安裝redis
3.修改Master節點Redis配置檔案
vim /etc/redis/6379.conf
#70行,修改bind 項,0.0.0.0監聽所有網段
bind 0.0.0.0
#137行,開啟守護程序
daemonize yes
#172行,指定日誌檔案目錄
logfile /var/log/redis_6379.log
#264行,指定工作目錄
dir /var/lib/redis/6379
#700行,開啟AOF持久化功能
appendonly yes
/etc/init.d/redis_6379 restart
4.修改Slave節點Redis配置檔案
vim /etc/redis/6379.conf
#70行,修改bind 項,0.0.0.0監聽所有網絡卡
bind 0.0.0.0
#137行,開啟守護程序
daemonize yes
#172行,指定日誌檔案目錄
logfile /var/log/redis_6379.log
#264行,指定工作目錄
dir /var/lib/redis/6379
#288行,指定要同步的Master節點IP和埠
replicaof 192.168.221.20 6379
#700行,開啟AOF持久化功能
appendonly yes
/etc/init.d/redis_6379 restart
5.驗證主從效果
在Master節點上看日誌
tail -f /var/log/redis_6379.log
redis-cli info replication
2.哨兵模式部署
在redis主從基礎上搭建:
所有節點都需操作
vim /opt/redis-5.0.7/sentinel.conf
#17行,關閉保護模式
protected-mode no
#21行,Redis哨兵預設的監聽埠
port 26379
#26行,指定sentinel為後臺啟動
daemonize yes
#36行,指定日誌存放路徑
logfile "/var/log/sentinel.log"
#65行,指定資料庫存放路徑
dir "/var/lib/redis/6379"
#84行,修改 指定該哨兵節點監控192.168.221.20:6379這個主節點,該主節點的名稱是mymaster,最後的2的含義與主節點的故障判定有關:至少需要2個哨兵節點同意,才能判定主節點故障並進行故障轉移
sentinel monitor mymaster 192.168.221.20 6379 2
#113行,判定伺服器down掉的時間週期,預設30000毫秒(30秒)
sentinel down-after-milliseconds mymaster 3000
#146行,故障節點的最大超時時間為180000(180秒)
sentinel failover-timeout mymaster 180000
先啟master,再啟slave
cd /opt/redis-5.0.7/
redis-sentinel sentinel.conf &
netstat -natp |grep 26379
檢視哨兵模式
redis-cli -p 26379 info Sentinel
故障模擬
檢視redis-server程序號
ps aux | grep redis
#殺死 Master 節點上redis-server的程序號,模擬故障
kill -9 33227 #Master節點上redis-server的程序號
3.cluster叢集部署
redis的叢集一般需要6個節點,3主3從
受資源限制,利用redis檔案模擬六臺redis主機
安裝部署redis
cd /etc/redis/
mkdir -p redis-cluster/redis600{1..6}
每一個redis檔案代表一臺redis
ls redis-cluster/
vim /opt/redis.sh
#!/bin/bash
for i in {1..6}
do
cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis600$i
Cp /opt/redis-5.0.7/src/redis-cli /opt/redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis600$i
done
chmod +x /opt/redis.sh
source /opt/redis.sh
cd /etc/redis/redis-cluster/
ls *
chmod +x /opt/redis.sh
cd /etc/redis/redis-cluster/redis 6001
vim redis.conf
bind 127.0.0.1
#69行,註釋掉bind項或不修改,預設監聽所有網絡卡
protected-mode no
#88行,修改,關閉保護模式
port 6001
#92行,修改,redis監聽埠,
daemonize yes
#136行,開啟守護程序,以獨立程序啟動
cluster-enabled yes
#832行,取消註釋,開啟群集功能
cluster-config-file nodes-6001.conf
#840行,取消註釋,群集名稱檔案設定
cluster-node-timeout 15000
#846行,取消註釋群集超時時間設定
appendonly yes
#700行,修改,開啟AOF持久化
其他5個配置檔案除埠號外改動相同
cp redis.conf ../redis6002/
--->yes
#啟動服務
cd /etc/redis/redis-cluster/redis6001
redis-server redis.conf
#根據對應配置檔案啟動redis
vim /opt/redis_start.sh
#!/bin/bash
for d in {1..6}
do
cd /etc/redis/redis-cluster/redis600$d
redis-server redis.conf
done
ps -ef | grep redis
chmod +x /opt/redis_start.sh
source /opt/redis_start.sh
加入叢集
redis-cli --cluster create 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 --cluster-replicas 1
總結
主從複製是為了資料備份,
哨兵是為了高可用,Redis主伺服器掛了哨兵可以切換,
叢集則是因為單例項能力有限,搞多個分散壓力
主從模式:備份資料、負載均衡,一個Master可以有多個Slaves。
哨兵模式:sentinel發現master掛了後,就會從slave中重新選舉一個master。
叢集模式:cluster是為了解決單機Redis容量有限的問題,將資料按一定的規則分配到多臺機器。
sentinel著眼於高可用,Cluster提高併發量。
區別:
一、架構不同
redis主從:一主多從;
redis叢集:多主多從;
二、儲存不同
redis主從:主節點和從節點都是儲存所有資料;
redis叢集:資料的儲存是通過hash計算16384的槽位,算出要將資料儲存的節點,然後進行儲存;
三、選舉不同
redis主從:通過啟動redis自帶的哨兵(sentinel)叢集進行選舉,也可以是一個哨兵
選舉流程:1、先發現主節點fail的哨兵,將成為哨兵中的leader,之後的主節點選舉將通過這個leader進行故障轉移操作,從存活的slave中選舉新的master,新 的master選舉同叢集的master節點選舉類似;
redis叢集:叢集可以自己進行選舉
選舉流程:
1、當主節點掛掉,從節點就會廣播該主節點fail;
2、延遲時間後進行選舉(延遲的時間演算法為:延遲時間+隨機數+rank*1000,從節點資料越多,rank越小,因為主從資料複製是非同步進行的,所以 所有的從節點的資料可能會不同),延遲的原因是等待主節點fail廣播到所有存活的主節點,否則主節點會拒絕參加選舉;
3、參加選舉的從節點向所有的存活的節點發送ack請求,但只有主節點會回覆它,並且主節點只會回覆第一個到達參加選舉的從節點,一半以上的主節點回復,該節點就會成為主節點,廣播告訴其他節點該節點成為主節點。
四、節點擴容不同
redis主從:只能擴容從節點,無法對主節點進行擴容;
redis叢集:可以擴容整個主從節點,但是擴容後需要進行槽位的分片,否則無法進行資料寫入。