Redis Sentinel集群部署
目錄
?
實(shí)驗(yàn)環(huán)境
機(jī)器規(guī)劃
原理說(shuō)明
主從復(fù)制存在的問(wèn)題
Redis Sentinel方案
安裝部署
1.配置并啟動(dòng)Master節(jié)點(diǎn)
2.配置并啟動(dòng)兩個(gè)Slave節(jié)點(diǎn)
3.驗(yàn)證主從關(guān)系
部署Sentinel節(jié)點(diǎn)
1.配置Sentinel1節(jié)點(diǎn)
2.啟動(dòng)Sentinel1節(jié)點(diǎn)
3.確認(rèn)Sentinel1節(jié)點(diǎn)Sentinel狀態(tài)
配置并啟動(dòng)Sentinel2和Sentinel3節(jié)點(diǎn)
驗(yàn)證Sentinel狀態(tài)
Sentinel 配置說(shuō)明
port,daemonize,logfile和dir
sentinel monitor mymaster
sentinel down-after-milliseconds
sentinel parallel-syncs
sentinel failover-timeout
sentinel auth-pass
sentinel notification-script
sentinel client-reconfig-script
Sentinel的特點(diǎn)
實(shí)驗(yàn)環(huán)境
操作系統(tǒng): Ubuntu 18.04.1 LTS
redis版本: redis 5.0.2
機(jī)器規(guī)劃
| Master | 127.0.0.1 | 6379 |
| Slave1 | 127.0.0.1 | 6380 |
| Slave2 | 127.0.0.1 | 6381 |
| Sentinel1 | 127.0.0.1 | 26379 |
| Sentinel2 | 127.0.0.1 | 26380 |
| Sentinel3 | 127.0.0.1 | 26381 |
注意:
生產(chǎn)環(huán)境中建議Redis Sentinel的所有節(jié)點(diǎn)應(yīng)該分布在不同的物理機(jī)上。
原理說(shuō)明
主從復(fù)制存在的問(wèn)題
Redis的主從復(fù)制模式可以將主節(jié)點(diǎn)的數(shù)據(jù)改變同步給從節(jié)點(diǎn),這樣從節(jié)點(diǎn)就可以起到兩個(gè)作用:
- 第一,作為主節(jié)點(diǎn)的一個(gè)備份,一旦主節(jié)點(diǎn)出了故障不可達(dá)的情況,從節(jié)點(diǎn)可以作為后備“頂”上來(lái),并且保證數(shù)據(jù)盡量不丟失(主從復(fù)制是最終一致性)。
- 第二,從節(jié)點(diǎn)可以擴(kuò)展主節(jié)點(diǎn)的讀能力,一旦主節(jié)點(diǎn)不能支撐住大并發(fā)量的讀操作,從節(jié)點(diǎn)可以在一定程度上幫助主節(jié)點(diǎn)分擔(dān)讀壓力。
但是主從復(fù)制也帶來(lái)了以下問(wèn)題:·一旦主節(jié)點(diǎn)出現(xiàn)故障,需要手動(dòng)將一個(gè)從節(jié)點(diǎn)晉升為主節(jié)點(diǎn),同時(shí)需要修改應(yīng)用方的主節(jié)點(diǎn)地址,還需要命令其他從節(jié)點(diǎn)去復(fù)制新的主節(jié)點(diǎn),整個(gè)過(guò)程都需要人工干預(yù)。
Redis Sentinel方案
Redis Sentinel是一個(gè)分布式架構(gòu),其中包含若干個(gè)Sentinel節(jié)點(diǎn)和Redis數(shù)據(jù)節(jié)點(diǎn),每個(gè)Sentinel節(jié)點(diǎn)會(huì)對(duì)數(shù)據(jù)節(jié)點(diǎn)和其余Sentinel節(jié)點(diǎn)進(jìn)行監(jiān)控,當(dāng)它發(fā)現(xiàn)節(jié)點(diǎn)不可達(dá)時(shí),會(huì)對(duì)節(jié)點(diǎn)做下線標(biāo)識(shí)。
如果被標(biāo)識(shí)的是主節(jié)點(diǎn),它還會(huì)和其他Sentinel節(jié)點(diǎn)進(jìn)行“協(xié)商”,當(dāng)大多數(shù)Sentinel節(jié)點(diǎn)都認(rèn)為主節(jié)點(diǎn)不可達(dá)時(shí),它們會(huì)選舉出一個(gè)Sentinel節(jié)點(diǎn)來(lái)完成自動(dòng)故障轉(zhuǎn)移的工作,同時(shí)會(huì)將這個(gè)變化實(shí)時(shí)通知給Redis應(yīng)用方。整個(gè)過(guò)程完全是自動(dòng)的,不需要人工來(lái)介入,所以這套方案很有效地解決了Redis的高可用問(wèn)題。
安裝部署
1.配置并啟動(dòng)Master節(jié)點(diǎn)
創(chuàng)建data目錄:
root@sbc-VirtualBox:~# mkdir -p /opt/soft/redis/data創(chuàng)建配置文件:
root@sbc-VirtualBox:~# vim /etc/redis/redis-6379.confport 6379 daemonize yes logfile "6379.log" dbfilename "dump-6379.rdb" dir "/opt/soft/redis/data/"啟動(dòng)Master節(jié)點(diǎn):
root@sbc-VirtualBox:~# redis-server /etc/redis/redis-6379.conf驗(yàn)證Master節(jié)點(diǎn)狀態(tài):
root@sbc-VirtualBox:~# redis-cli -h 127.0.0.1 -p 6379 ping PONG2.配置并啟動(dòng)兩個(gè)Slave節(jié)點(diǎn)
創(chuàng)建配置文件:
slave1:
root@sbc-VirtualBox:~# vim /etc/redis/redis-6380.confport 6380 daemonize yes logfile "6380.log" dbfilename "dump-6380.rdb" dir "/opt/soft/redis/data/" slaveof 127.0.0.1 6379slave標(biāo)志:slaveof 127.0.0.1 6379,說(shuō)明該slave是127.0.0.1 6379這個(gè)master的slave
slave2:
root@sbc-VirtualBox:~# vim /etc/redis/redis-6381.confport 6381 daemonize yes logfile "6381.log" dbfilename "dump-6381.rdb" dir "/opt/soft/redis/data/" slaveof 127.0.0.1 6379啟動(dòng)2個(gè)Slave節(jié)點(diǎn):
root@sbc-VirtualBox:~# redis-server /etc/redis/redis-6380.conf root@sbc-VirtualBox:~# redis-server /etc/redis/redis-6381.conf驗(yàn)證:
root@sbc-VirtualBox:~# redis-cli -h 127.0.0.1 -p 6380 ping PONG root@sbc-VirtualBox:~# redis-cli -h 127.0.0.1 -p 6381 ping PONG3.驗(yàn)證主從關(guān)系
查看Master節(jié)點(diǎn)replication信息:
root@sbc-VirtualBox:~# redis-cli -h 127.0.0.1 -p 6379 info replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6380,state=online,offset=126,lag=0 slave1:ip=127.0.0.1,port=6381,state=online,offset=126,lag=1 master_replid:1ca0bf14ca2cd79941df7285bf413aa6b8ae921d master_replid2:0000000000000000000000000000000000000000 master_repl_offset:126 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:126可觀察到connected_slaves有2個(gè),分別為:
slave0:ip=127.0.0.1,port=6380,state=online,offset=126,lag=0 slave1:ip=127.0.0.1,port=6381,state=online,offset=126,lag=1同樣在Slave節(jié)點(diǎn)也可查看到replication信息:
root@sbc-VirtualBox:~# redis-cli -h 127.0.0.1 -p 6380 info replication # Replication role:slave master_host:127.0.0.1 master_port:6379 master_link_status:up master_last_io_seconds_ago:10 master_sync_in_progress:0 slave_repl_offset:252 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:1ca0bf14ca2cd79941df7285bf413aa6b8ae921d master_replid2:0000000000000000000000000000000000000000 master_repl_offset:252 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:252可觀察到Master信息,連接狀態(tài)正常:
master_host:127.0.0.1 master_port:6379 master_link_status:up部署Sentinel節(jié)點(diǎn)
1.配置Sentinel1節(jié)點(diǎn)
創(chuàng)建conf文件:
root@sbc-VirtualBox:~# vim /etc/redis/redis-sentinel-26379.confport 26379 daemonize yes logfile "26379.log" dir /opt/soft/redis/data sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000- Sentinel節(jié)點(diǎn)本身就是獨(dú)立的Redis節(jié)點(diǎn),只不過(guò)它們有一些特殊,它們不存儲(chǔ)數(shù)據(jù),只支持部分命令。
- sentinel monitor mymaster 127.0.0.1 6379 2:此行配置代表sentinel-1節(jié)點(diǎn)需要監(jiān)控127.0.0.1:6379這個(gè)主節(jié)點(diǎn),2代表判斷主節(jié)點(diǎn)失敗至少需要2個(gè)Sentinel節(jié)點(diǎn)同意,mymaster是主節(jié)點(diǎn)的別名
2.啟動(dòng)Sentinel1節(jié)點(diǎn)
root@sbc-VirtualBox:~# redis-sentinel /etc/redis/redis-sentinel-26379.conf3.確認(rèn)Sentinel1節(jié)點(diǎn)Sentinel狀態(tài)
在Sentinel1節(jié)點(diǎn)查看Sentinel狀態(tài):
root@sbc-VirtualBox:~# redis-cli -h 127.0.0.1 -p 26379 info Sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=1配置并啟動(dòng)Sentinel2和Sentinel3節(jié)點(diǎn)
生成配置文件:
Sentinel2:
Sentinel3:
root@sbc-VirtualBox:~# vim /etc/redis/redis-sentinel-26381.confport 26381 daemonize yes logfile "26381.log" dir /opt/soft/redis/data sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000啟動(dòng)Sentinel2和Sentinel3:
root@sbc-VirtualBox:~# redis-sentinel /etc/redis/redis-sentinel-26380.conf root@sbc-VirtualBox:~# redis-sentinel /etc/redis/redis-sentinel-26381.conf驗(yàn)證Sentinel狀態(tài)
連接任意Sentinel節(jié)點(diǎn):
root@sbc-VirtualBox:~# redis-cli -h 127.0.0.1 -p 26379 info Sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3可觀察到master地址,端口正確。slave節(jié)點(diǎn),sentinel節(jié)點(diǎn)數(shù)量正確。
Sentinel 配置說(shuō)明
當(dāng)所有節(jié)點(diǎn)啟動(dòng)后,配置文件中的內(nèi)容發(fā)生了變化,體現(xiàn)在三個(gè)方面:
- Sentinel節(jié)點(diǎn)自動(dòng)發(fā)現(xiàn)了從節(jié)點(diǎn)、其余Sentinel節(jié)點(diǎn)。
- 去掉了默認(rèn)配置,例如parallel-syncs、failover-timeout參數(shù)。
- 添加了配置紀(jì)元相關(guān)參數(shù)。
下面以Sentinel1節(jié)點(diǎn)為例,Sentinel1節(jié)點(diǎn)的conf文件變?yōu)榱?#xff1a;
port 26379 daemonize yes logfile "26379.log" dir "/opt/soft/redis/data" sentinel myid b6983fbf6b4527811b724ce5ef0ea08388056e34 sentinel deny-scripts-reconfig yes sentinel monitor mymaster 127.0.0.1 6379 2 sentinel config-epoch mymaster 0 # Generated by CONFIG REWRITE protected-mode no sentinel leader-epoch mymaster 0 sentinel known-replica mymaster 127.0.0.1 6381 sentinel known-replica mymaster 127.0.0.1 6380 sentinel known-sentinel mymaster 127.0.0.1 26381 4d77ba4fbfd1696db44e6302340988f771bbb62a sentinel known-sentinel mymaster 127.0.0.1 26380 75cd9743a892825573793c4417e7e8465d65b616 sentinel current-epoch 0port,daemonize,logfile和dir
port:表示Sentinel節(jié)點(diǎn)的端口;
daemonize:表示守護(hù)進(jìn)程,開(kāi)啟則Sentinel將在后臺(tái)運(yùn)行;
logfile:表示Sentinel節(jié)點(diǎn)的日志路徑;
dir:表示Sentinel節(jié)點(diǎn)的工作目錄;
sentinel monitor mymaster
sentinel monitor <master-name> <ip> <port> <quorum>Sentinel節(jié)點(diǎn)會(huì)定期監(jiān)控主節(jié)點(diǎn),所以從配置上必然也會(huì)有所體現(xiàn),本配置說(shuō)明Sentinel節(jié)點(diǎn)要監(jiān)控的是一個(gè)名字叫做,地址ip和端口為port的主節(jié)點(diǎn),quorum代表要判定主節(jié)點(diǎn)最終不可達(dá)所需要的票數(shù)。
一般建議將quorum設(shè)置為Sentinel節(jié)點(diǎn)的一半加1。同時(shí)還與Sentinel節(jié)點(diǎn)的領(lǐng)導(dǎo)者選舉有關(guān),至少要有max(quorum,num(sentinels)/2+1)個(gè)Sentinel節(jié)點(diǎn)參與選舉,才能選出領(lǐng)導(dǎo)者Sentinel,從而完成故障轉(zhuǎn)移。例如有5個(gè)Sentinel節(jié)點(diǎn),quorum=4,那么至少要有max(quorum,num(sentinels)/2+1)=4個(gè)在線Sentinel節(jié)點(diǎn)才可以進(jìn)行領(lǐng)導(dǎo)者選舉
如:
sentinel down-after-milliseconds
sentinel down-after-milliseconds <master-name> <times>每個(gè)Sentinel節(jié)點(diǎn)都要通過(guò)定期發(fā)送ping命令來(lái)判斷Redis數(shù)據(jù)節(jié)點(diǎn)和其余Sentinel節(jié)點(diǎn)是否可達(dá),如果超過(guò)了down-after-milliseconds配置的時(shí)間且沒(méi)有有效的回復(fù),則判定節(jié)點(diǎn)不可達(dá),(單位為毫秒)就是超時(shí)時(shí)間。這個(gè)配置是對(duì)節(jié)點(diǎn)失敗判定的重要依據(jù)。
sentinel parallel-syncs
sentinel parallel-syncs <master-name> <nums>當(dāng)Sentinel節(jié)點(diǎn)集合對(duì)主節(jié)點(diǎn)故障判定達(dá)成一致時(shí),Sentinel領(lǐng)導(dǎo)者節(jié)點(diǎn)會(huì)做故障轉(zhuǎn)移操作,選出新的主節(jié)點(diǎn),原來(lái)的從節(jié)點(diǎn)會(huì)向新的主節(jié)點(diǎn)發(fā)起復(fù)制操作,parallel-syncs就是用來(lái)限制在一次故障轉(zhuǎn)移之后,每次向新的主節(jié)點(diǎn)發(fā)起復(fù)制操作的從節(jié)點(diǎn)個(gè)數(shù)。如果這個(gè)參數(shù)配置的比較大,那么多個(gè)從節(jié)點(diǎn)會(huì)向新的主節(jié)點(diǎn)同時(shí)發(fā)起復(fù)制操作,盡管復(fù)制操作通常不會(huì)阻塞主節(jié)點(diǎn),但是同時(shí)向主節(jié)點(diǎn)發(fā)起復(fù)制,必然會(huì)對(duì)主節(jié)點(diǎn)所在的機(jī)器造成一定的網(wǎng)絡(luò)和磁盤(pán)IO開(kāi)銷。
sentinel failover-timeout
sentinel failover-timeout <master-name> <times>failover-timeout通常被解釋成故障轉(zhuǎn)移超時(shí)時(shí)間,但實(shí)際上它作用于故障轉(zhuǎn)移的各個(gè)階段:
a)選出合適從節(jié)點(diǎn)。
b)晉升選出的從節(jié)點(diǎn)為主節(jié)點(diǎn)。
c)命令其余從節(jié)點(diǎn)復(fù)制新的主節(jié)點(diǎn)。
d)等待原主節(jié)點(diǎn)恢復(fù)后命令它去復(fù)制新的主節(jié)點(diǎn)。
sentinel auth-pass
sentinel auth-pass <master-name> <password>如果Sentinel監(jiān)控的主節(jié)點(diǎn)配置了密碼,sentinel auth-pass配置通過(guò)添加主節(jié)點(diǎn)的密碼,防止Sentinel節(jié)點(diǎn)對(duì)主節(jié)點(diǎn)無(wú)法監(jiān)控。
sentinel notification-script
sentinel notification-script <master-name> <script-path>sentinel notification-script的作用是在故障轉(zhuǎn)移期間,當(dāng)一些警告級(jí)別的Sentinel事件發(fā)生(指重要事件,例如-sdown:客觀下線、-odown:主觀下線)時(shí),會(huì)觸發(fā)對(duì)應(yīng)路徑的腳本,并向腳本發(fā)送相應(yīng)的事件參數(shù)。
sentinel client-reconfig-script
sentinel client-reconfig-script <master-name> <script-path>sentinel client-reconfig-script的作用是在故障轉(zhuǎn)移結(jié)束后,會(huì)觸發(fā)對(duì)應(yīng)路徑的腳本,并向腳本發(fā)送故障轉(zhuǎn)移結(jié)果的相關(guān)參數(shù)。
Sentinel的特點(diǎn)
Redis Sentinel具有以下幾個(gè)功能:
·監(jiān)控:Sentinel節(jié)點(diǎn)會(huì)定期檢測(cè)Redis數(shù)據(jù)節(jié)點(diǎn)、其余Sentinel節(jié)點(diǎn)是否可達(dá)。
·通知:Sentinel節(jié)點(diǎn)會(huì)將故障轉(zhuǎn)移的結(jié)果通知給應(yīng)用方。
·主節(jié)點(diǎn)故障轉(zhuǎn)移:實(shí)現(xiàn)從節(jié)點(diǎn)晉升為主節(jié)點(diǎn)并維護(hù)后續(xù)正確的主從關(guān)系。
·配置提供者:在Redis Sentinel結(jié)構(gòu)中,客戶端在初始化的時(shí)候連接的是Sentinel節(jié)點(diǎn)集合,從中獲取主節(jié)點(diǎn)信息
Redis Sentinel的優(yōu)勢(shì):
·對(duì)于節(jié)點(diǎn)的故障判斷是由多個(gè)Sentinel節(jié)點(diǎn)共同完成,這樣可以有效地防止誤判。
·Sentinel節(jié)點(diǎn)集合是由若干個(gè)Sentinel節(jié)點(diǎn)組成的,這樣即使個(gè)別Sentinel節(jié)點(diǎn)不可用,整個(gè)Sentinel節(jié)點(diǎn)集合依然是健壯的。
總結(jié)
以上是生活随笔為你收集整理的Redis Sentinel集群部署的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Redis的配置文件介绍
- 下一篇: Python 把较长的一行代码分成多行的