一、sentinel基礎
在Redis的主從復制中有一個問題很明顯,比如說在一主三從的架構下,如果主節點宕機,那么所有的寫操作也就不能執行了,這個主從復制架構也就癱瘓了,所以Redis引入了sentinel機制。
sentinel其實就是一個額外的主機,這個主機既可以提供監控,也可以提供配置的功能,也就是說他可以監控所有的主機狀態,當主節點宕機,他可以自動的從所有的從節點中挑選一個將其升級為主節點,當產生了新的主節點之后,其他的性節點會向sentinel發送查詢請求,查看當前主節點是哪個,以此來獲得新的主節點。所以sentinel是Redis主從架構中,實現高可用的解決方案。
還有一個問題,如果是sentinel自己出了問題導致其檢測不到主節點,但是主節點其實并沒有出問題,這就會導致腦裂,所以為了解決這個問題,我們往往設置多個sentine節點,他們共同監控主節點,當有任意一臺sentinel發現找不到主節點的時候,這些sentinel會相互商議并投票確定是否主節點真的出了問題,這樣還能解決一個問題就是當某個sentinel出現故障,其他sentinel節點還可以繼續監控主從復制架構。
需要注意的是,sentinel只監控主節點服務器,因為它會通過主服務器的信息發現各個從服務器節點,并將從服務器節點納入到被監控節點中。
sentinel的配置文件
sentinel的專用配置文件:/etc/redis-sentinel.conf
sentinel的端口:26379
在這個配置文件中每個sentinel實例大概需要四項配置
設置所監控的主節點的信息
# sentinel monitor <master-name> <ip> <redis-port> <quorum>sentinel monitor mymaster 10.220.5.171 6379 2
說明:master-name
如果不是用主機名來唯一區分每個節點的話,這個名字可以隨便寫
如果監控多組主從的話這個名稱應該不同
ip:主節點的IP地址
redis-port:主節點監聽的端口
quorum:
這個數值是表明這個主節點至少擁有幾票才能認為這個節點是有效的
如果只有一個sentinel節點的話,這個數值應該設置為1
通常sentinel節點建議設置為奇數個,這樣這個數值可以設置成半數以上,這樣才有意義(防止腦裂)
注意:一個sentinel集群,可以監控多組redis主從復制集群,所以上面這行代碼配置可以出現多次
設置主節點多長時間沒有信息認為其已經離線
# Default is 30 seconds.
sentinel down-after-milliseconds mymaster 30000
注意:這里的時間單位是毫秒,30000就是30秒
設置當主服務器宕機的時候,允許多少從服務器同時向sentinel發送鏈接請求。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1
發生故障轉移的超時時間
# Default is 3 minutes.
sentinel failover-timeout mymaster 180000
說明:這里就是設置在將從節點設置為主節點的時候,如果多久沒有提升成功,就認為這次提升失敗了。
啟動sentinel方式
sentinel其實就是Redis的一個組件而已,在安裝Redis的時候就已經自帶了,就叫做redis-sentinel,另外,用redis-server啟動時候指定選型 --sentinel,也可以實現啟動sentinel。
需要注意的是在啟動sentinel的時候,必須指定起自己的配置文件,這個配置文件會用于保存redis的配置信息。
總結啟動方式有兩種:
redis-sentinel /path/to/file.conf
redis-server /path/to/file.conf --sentinel
啟動sentinel的步驟
初始化sentinel:運行redis-server專用于sentinel的代碼初始化sentinel的狀態:根據配置文件,初始化天空master的主機列表創建連接到主服務器的網絡連接
sentinel的專用命令
SENTINEL master :顯示所有被監控的master節點
SENTINEL slaves <masterName>:獲取指定主服務器的從節點
SENTINEL get-master--addr-by-name <masterName> :根據名字來獲取IP地址
SENTINEL reset :清除sentinel的全部狀態,包括正在執行的故障轉移
SENTINEL failover:手動執行故障轉移,也就是當主節點故障時,在不詢問其他節點的情況下,強制執行故障轉移
sentinel主觀下線、客觀下線概念
主觀下線,也就是一個sentinel認為主節點下線了,對于這個sentinel來說主機下線在目前是主觀下線,但是此時還需要征求其他sentinel的意見,如果所有的sentinel都認為這個主節點下線了,那么此時主觀下線就變成了客觀下線。
sentinel用于實現監控各個節點的方式就是,當master被sentinel監控之后,master每隔一秒向sentinel發送ping,用這個來作為心跳信息。
二、 演示:Redis復制的高可用
這里我來模擬一個一主兩從的架構,可以在多個主機上來做,但是這里我用redis多實例來做,多個實例分別監聽6379、6380、6381端口。
第一步:配置redis多實例
需要注意的是:在配置多實例的時候端口、pid文件、日志文件、數據文件路徑、不能相同。
創建目錄
[root@171 ~]# mkdir /redis/{6379,6380,6381} -pv
[root@171 ~]# cp /etc/redis.conf /redis/6379/redis1.conf
[root@171 ~]# cp /etc/redis.conf /redis/6380/redis2.conf
[root@171 ~]# cp /etc/redis.conf /redis/6381/redis3.conf
[root@171 ~]# chown -R redis.redis /redis
編輯配置文件
# 第一個節點配置
[root@171 ~]# vim /redis/6379/redis1.conf
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile /var/log/redis/redis_6379.log
dir /redis/6379# 第二個節點配置
[root@171 ~]# vim /redis/6380/redis2.conf
port 6380
daemonize yes
pidfile /var/run/redis_6380.pid
logfile /var/log/redis/redis_6380.log
dir /redis/6380# 第三個節點配置
[root@171 ~]# vim /redis/6381/redis3.conf
port 6381
daemonize yes
pidfile /var/run/redis_6381.pid
logfile /var/log/redis/redis_6381.log
dir /redis/6381
啟動服務
[root@171 ~]# redis-server /redis/6379/redis1.conf
[root@171 ~]# redis-server /redis/6380/redis2.conf
[root@171 ~]# redis-server /redis/6381/redis3.conf
[root@171 ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 10.220.5.171:6379 *:*
LISTEN 0 128 10.220.5.171:6380 *:*
LISTEN 0 128 10.220.5.171:6381 *:*
第二步:配置redis主從
將6379設置為主,6380 6381都設置為從
查看6379的復制狀態
[root@171 ~]# redis-cli -h 10.220.5.171 -p 6379
10.220.5.171:6379> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:0
將6380的主設置為6379
[root@171 ~]# redis-cli -h 10.220.5.171 -p 6380
10.220.5.171:6380> SLAVEOF 10.220.5.171 6379
OK
將6381的主設置為6379
[root@171 ~]# redis-cli -h 10.220.5.171 -p 6381
10.220.5.171:6381> SLAVEOF 10.220.5.171 6379
OK
此時在主節點可以看到連接的從節點
10.220.5.171:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.220.5.171,port=6380,state=online,offset=308,lag=1
slave1:ip=10.220.5.171,port=6381,state=online,offset=308,lag=1
測試一下主從是否正常
# 主節點寫入數據
10.220.5.171:6379> set name xiaoming
OK
# 從節點查看是否有數據
10.220.5.171:6380> get name
"xiaoming"
10.220.5.171:6381> get name
"xiaoming"
第三步:配置監控節點
這里我啟用一個sentinel做節點監控
創建目錄
[root@171 ~]# mkdir /redis/sentinel
[root@171 ~]# cp /etc/redis-sentinel.conf /redis/sentinel/
[root@171 ~]# chown redis.redis /redis/sentinel/ -R
修改配置文件
[root@171 ~]# vim /redis/sentinel/redis-sentinel.conf
sentinel monitor mymaster 10.220.5.171 6379 1
sentinel down-after-milliseconds mymaster 3000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
protected-mode no
daemonize yes
啟動sentinel
[root@171 ~]# redis-sentinel /redis/sentinel/redis-sentinel.conf
[root@171 ~]# ss -tnl |grep 26379
LISTEN 0 128 *:26379 *:*
LISTEN 0 128 :::26379 :::*
連入sentinel查看master的狀態
[root@171 ~]# redis-cli -h 10.220.5.171 -p 26379
10.220.5.171:26379> sentinel masters
1) 1) "name"2) "mymaster"3) "ip"4) "10.220.5.171"5) "port"6) "6379"7) "runid"8) "e8deacd44d2f3d99a005a110f6600cebd42c9a5f"9) "flags"10) "master"# 也可以查看一下mymaster這個節點的從節點有哪些10.220.5.171:26379> sentinel slaves mymaster
第四步:模擬主節點故障
這里我直接關閉主節點服務來模擬主節點宕機
[root@171 ~]# ps aux |grep 6379
root 1810 0.6 0.9 147356 9764 ? Ssl 03:50 0:13 redis-server 10.220.5.171:6379
[root@171 ~]# kill -9 1810
# 稍等一分鐘,查看一下此時的主節點
10.220.5.171:26379> sentinel masters
1) 1) "name"2) "mymaster"3) "ip"4) "10.220.5.171"5) "port"6) "6381" <<<<<<已經主節點變成了63817) "runid"
注意:即使故障節點恢復了,也不會直接變為主節點而是會成為從節點。
到這里redis的主從復制高可用就大功告成了,如有疑問歡迎評論留言,公共探討,共同進步。
------做運維之前很矯情的小年輕-----
總結
以上是生活随笔為你收集整理的Redis复制的高可用详解的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。