1. 程式人生 > 其它 >redis主從,哨兵,cluster叢集

redis主從,哨兵,cluster叢集

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叢集:可以擴容整個主從節點,但是擴容後需要進行槽位的分片,否則無法進行資料寫入。