Redis Sentinel的基本搭建
Redis Sentinel的概念
我們知道Redis主從模式下,一旦主節(jié)點由于故障不能提供服務,需要人工將從節(jié)點晉升為主節(jié)點,同時還要通知應用方更新主節(jié)點的地址。然后在很多應用場景下這種故障處理的方式是無法接受的,應用程序需要實時感知當前的可用節(jié)點。為了解決這個問題,Redis Sentinel應運而生,也稱之為"哨兵"。
介紹sentinel之前,先來了解幾個redis的概念,
主節(jié)點master:Redis進程,主服務
從節(jié)點slave:redis進程,從服務
Redis數(shù)據(jù)節(jié)點:主節(jié)點和從節(jié)點
Sentinel節(jié)點:監(jiān)控Redis數(shù)據(jù)節(jié)點,獨立的sentinel進程
Sentinel節(jié)點集合:若干Sentinel節(jié)點的抽象組合,若干sentinel節(jié)點進程
Redis Sentinel:Redis高可用實現(xiàn)方案,sentinel節(jié)點集合和redis數(shù)據(jù)節(jié)點進程
01 主從復制問題
前面的文章中我們講述了主從復制,可以將從節(jié)點作為主節(jié)點的災備節(jié)點,今天我們來看主從復制帶來的問題:
1、一旦主節(jié)點發(fā)生故障,從節(jié)點晉升為主節(jié)點的過程和應用調整新主節(jié)點的過程,都需要人為干預
2、主節(jié)點的寫能力容易受到單機的限制
3、主節(jié)點的存儲能力容易受到單機的限制
一種常見的方法是使用腳本來觸發(fā)主從節(jié)點的角色切換,例如在一個一主兩從的結構中,假設主節(jié)點master,從節(jié)點slave1,slave2,我們來看故障發(fā)生時架構的狀態(tài):
1、主節(jié)點master故障,客戶端連接失敗,兩個從節(jié)點復制失敗
2、選擇一個主節(jié)點slave1,對其執(zhí)行slave of no one命令使其成為主節(jié)點master2
3、更新應用程序連接的節(jié)點為slave1的IP地址
4、slave2以slave1為新的主節(jié)點,復制slave1上的命令
5、待原來的master恢復之后,讓它成為slave1的從節(jié)點。
上述過程可以做成自動化的過程,但是需要考慮三點:a、要確保判斷節(jié)點不可達的機制健全,否則容易出現(xiàn)誤判斷情況
b、如果有多個從節(jié)點,如果保證只有一個從節(jié)點被晉升為主節(jié)點是個關鍵的問題
c、通知客戶端新的主節(jié)點的機制是否足夠健壯
02 Redis Sentinel的高可用機制
Sentinel能夠自動完成故障發(fā)現(xiàn)和故障轉移,并及時通知應用方。這是它的核心價值所在。
Redis Sentinel是一個分布式架構,其中包含若干個Sentinel和若干個Redis數(shù)據(jù)節(jié)點,每個Sentinel節(jié)點會對數(shù)據(jù)節(jié)點和其余Sentinel節(jié)點進行監(jiān)控,當它發(fā)現(xiàn)節(jié)點不可達時,會對節(jié)點做下線表示。如果被標識的是主節(jié)點,它還會和其他的sentinel進行協(xié)商,當大多數(shù)sentinel節(jié)點都認為主節(jié)點不可達時,他們會選舉出來一個sentinel節(jié)點來實現(xiàn)故障自動轉移,同時會將這個變化通知給Redis應用方,整個過程是自動的,不需要人工介入。
Redis Sentinel與Redis主從復制模式只是多了若干個sentinel節(jié)點,并沒有對redis節(jié)點做特殊處理,這是很多redis開發(fā)和運維人員容易混淆的地方。
二者架構圖如下:

在整個主服務故障到重新選擇主服務的過程中,sentinel主要干如下幾件事情:
1、監(jiān)控,sentinel節(jié)點會定期檢測redis數(shù)據(jù)節(jié)點,其余sentinel節(jié)點是否可達
2、通知,sentinel節(jié)點會將故障轉移的結果通知給應用方。
3、主節(jié)點故障轉移:實現(xiàn)從節(jié)點晉升為主節(jié)點并維護后續(xù)正確的主從關系
4、配置提供者:在redis sentinel結構中,客戶端在初始化的時候連接的是sentinel節(jié)點集合,從中獲取主節(jié)點信息
上面的架構圖中不難發(fā)現(xiàn)sentinel也是多個的,這樣的好處有兩個:
1、可以保證sentinel的健壯性,一個sentinel掛了,不影響整個集群的功能。
2、對于節(jié)點的故障判斷是多個sentinel同時判斷出來的,有效的防止了誤判
sentinel節(jié)點本身其實就是獨立的redis節(jié)點,只不過它們不存處數(shù)據(jù),只支持部分命令。
接下來,我們來看sentinel的部署和配置文件內容。
03 sentinel部署
sentinel部署之前,需要先有master和兩個slave的一主兩從架構:
127.0.0.1:6379> info replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6380,state=online,offset=169,lag=1 slave1:ip=127.0.0.1,port=6381,state=online,offset=169,lag=1 master_repl_offset:183 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:182
sentinel的部署配置文件:
[root@VM_48_10_centos redis]# cat redis-sentinel-26379.conf port 26379 daemonize yes logfile "26379.log" dir "/usr/local/redis-3.0.7" sentinel monitor mymaster 127.0.0.1 6379 2
其中,sentinel monitor mymaster代表sentinel要監(jiān)控主節(jié)點6379,2代表判斷主節(jié)點失敗至少需要2個sentinel節(jié)點同意。
其余兩個sentinel的配置文件和這個大同小異,只需要修改對應端口和日志文件即可。sentinel啟動命令如下:
[root@VM_48_10_centos redis]# redis-sentinel redis-sentinel-26379.conf & [1] 7311 [root@VM_48_10_centos redis]# redis-sentinel redis-sentinel-26380.conf & [1] 7366 [root@VM_48_10_centos redis]# redis-sentinel redis-sentinel-26381.conf & [2] 7380 [root@VM_48_10_centos redis]# [root@VM_48_10_centos redis]# ps -ef|grep sentinel root 7312 1 0 22:51 ? 00:00:00 redis-sentinel *:26379 [sentinel] root 7367 1 0 22:52 ? 00:00:00 redis-sentinel *:26380 [sentinel] root 7381 1 0 22:52 ? 00:00:00 redis-sentinel *:26381 [sentinel] root 7405 5850 0 22:52 pts/7 00:00:00 grep --color=auto sentinel
此時,重新查看26379這個sentinel的配置文件,會發(fā)現(xiàn)里面多了一些內容:
[root@VM_48_10_centos redis]# cat redis-sentinel-26379.conf port 26379 daemonize yes logfile "26379.log" dir "/usr/local/redis-3.0.7" sentinel monitor mymaster 127.0.0.1 6379 2 sentinel config-epoch mymaster 0 sentinel leader-epoch mymaster 0 sentinel known-slave mymaster 127.0.0.1 6380 # Generated by CONFIG REWRITE sentinel known-slave mymaster 127.0.0.1 6381 sentinel known-sentinel mymaster 127.0.0.1 26381 0a2c77616ef88282fa12ef7c8aca142a2473cd5a sentinel known-sentinel mymaster 127.0.0.1 26380 3ad6460bf5f4b01f277fdce3aa423d596993eec5 sentinel current-epoch 0
可以發(fā)現(xiàn),sentinel之間已經進行了交互,并寫入了配置文件中一些已經獲取到的內容。
使用命令info sentinel查看當前sentinel集群的信息:
[root@VM_48_10_centos redis]# 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 master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3
以上就是Redis Sentinel的使用的詳細內容,更多關于Redis Sentinel的資料請關注腳本之家其它相關文章!
相關文章
Redis數(shù)據(jù)類型之散列類型hash命令學習
這篇文章主要為大家介紹了Redis數(shù)據(jù)類型之散列類型hash命令學習,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07
Redis基本數(shù)據(jù)類型哈希Hash常用操作命令
這篇文章主要為大家介紹了Redis基本數(shù)據(jù)類型哈希Hash常用操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05
Redis數(shù)據(jù)庫中實現(xiàn)分布式鎖的方法
這篇文章主要介紹了Redis數(shù)據(jù)庫中實現(xiàn)分布式鎖的方法,Redis是一個高性能的主存式數(shù)據(jù)庫,需要的朋友可以參考下2015-06-06

