Sentinel是Redis官方提供的一種高可用方案(除了Sentinel,Redis Cluster是另外一種方案),它能夠自動監控Redis master/slave的運行狀態,若是發現master沒法訪問了,就會啓動failover把其中一臺能夠訪問的slave切換爲master。html
(1).Sentinel(哨兵)的做用redis
檢測Master狀態,若是Master異常,則會進行Master-Slave切換,將其中一個Slave做爲Master,將以前的Master做爲Slave 。當Master-Slave切換後,master-redis.conf、slave-redis.conf和sentinel.conf的內容都會發生改變,即master-redis.conf中會多一行slaveof的配置,sentinel.conf的監控目標會隨之調換。vim
(2).Sentinel(哨兵)的工做原理segmentfault
支持Sentinel的Redis客戶端(例如Java的Jedis)會在鏈接Redis服務器的時候向Sentinel詢問master的ip,而且會在收到master切換的pub/sub事件後自動從新鏈接到新的master。安全
(3).實驗環境服務器
youxi1 192.168.1.6 Master,Sentinel1tcp
youxi2 192.168.1.7 Slave,Sentinel2測試
youxi3 192.168.1.8 Slave,Sentinel3spa
(4).實驗3d
1)首先全部服務器都安裝Redis,啓動並設置開機自啓
詳細查看:CentOS7下yum安裝Redis
2)修改Master服務器youxi1的配置文件
[root@youxi1 ~]# vim /etc/redis.conf bind 0.0.0.0 //第69行,設置監聽地址。0.0.0.0表示監聽全部地址 protected-mode no //第88行,關閉安全模式,容許外網訪問
若是防火牆是開啓狀態,記得添加端口號
[root@youxi1 ~]# firewall-cmd --permanent --zone=public --add-port=6379/tcp && firewall-cmd --reload success success
3)修改Slave1服務器youxi2的配置文件
[root@youxi2 ~]# vim /etc/redis.conf bind 0.0.0.0 //第69行,設置監聽地址。0.0.0.0表示監聽全部地址 protected-mode no //第88行,關閉安全模式,容許外網訪問 replicaof 192.168.1.6 6379 //第286行,設置master的IP地址和端口號
若是防火牆是開啓狀態,記得添加端口號
[root@youxi1 ~]# firewall-cmd --permanent --zone=public --add-port=6379/tcp && firewall-cmd --reload success success
4)修改Slave2服務器youxi3的配置文件
[root@youxi3 ~]# vim /etc/redis.conf bind 0.0.0.0 //第69行,設置監聽地址。0.0.0.0表示監聽全部地址 protected-mode no //第88行,關閉安全模式,容許外網訪問 replicaof 192.168.1.6 6379 //第286行,設置master的IP地址和端口號
若是防火牆是開啓狀態,記得添加端口號
[root@youxi3 ~]# firewall-cmd --permanent --zone=public --add-port=6379/tcp && firewall-cmd --reload success success
5)配置Sentinel(哨兵)
三臺主機都進行配置,或一臺配好發送給另外兩臺
[root@youxi1 ~]# vim /etc/redis-sentinel.conf protected-mode no //第17行,取消安全模式,容許外網訪問 port 26379 //第21行,檢查一下端口號 daemonize yes //第26行,改成yes,後臺運行守護進程 sentinel monitor mymaster 192.168.1.6 6379 2 //第84行,mymaster是集羣名稱;192.168.1.6是主服務器IP地址;2是投票值,2臺哨兵沒法鏈接master,則認爲master掛了,爲避免腦裂請使用奇數 sentinel down-after-milliseconds mymaster 10000 //第113行 sentinel parallel-syncs mymaster 1 //第121行 sentinel failover-timeout mymaster 60000 //第146行,failover超時時間,單位毫秒
說明:
down-after-milliseconds:sentinel會向master發送心跳PING來確認master是否存活,若是master在「必定時間範圍」內不迴應PONG 或者是回覆了一個錯誤消息,那麼這個sentinel會主觀地(單方面地)認爲這個master已經不可用了(subjectively down, 也簡稱爲SDOWN)。而這個down-after-milliseconds就是用來指定這個「必定時間範圍」的,單位是毫秒。
parallel-syncs:在發生failover主備切換時,這個選項指定了最多能夠有多少個slave同時對新的master進行同步,這個數字越小,完成failover所需的時間就越長,可是若是這個數字越大,就意味着越多的slave由於replication而不可用。能夠經過將這個值設爲 1 來保證每次只有一個slave處於不能處理命令請求的狀態。
全部服務器都如此配置,而後重啓redis,啓動redis-sentinel並設置開機自啓。
[root@youxi1 ~]# systemctl restart redis && systemctl start redis-sentinel [root@youxi1 ~]# systemctl enable redis-sentinel Created symlink from /etc/systemd/system/multi-user.target.wants/redis-sentinel.service to /usr/lib/systemd/system/redis-sentinel.service. [root@youxi2 ~]# systemctl restart redis && systemctl start redis-sentinel [root@youxi2 ~]# systemctl enable redis-sentinel Created symlink from /etc/systemd/system/multi-user.target.wants/redis-sentinel.service to /usr/lib/systemd/system/redis-sentinel.service. [root@youxi3 ~]# systemctl restart redis && systemctl start redis-sentinel [root@youxi3 ~]# systemctl enable redis-sentinel Created symlink from /etc/systemd/system/multi-user.target.wants/redis-sentinel.service to /usr/lib/systemd/system/redis-sentinel.service.
若是防火牆是開啓狀態,記得添加端口號
firewall-cmd --permanent --zone=public --add-port=26379/tcp && firewall-cmd --reload
6)查看主從服務器的狀態
主服務器youxi1狀態
[root@youxi1 ~]# redis-cli 127.0.0.1:6379> info replication # Replication role:master //本服務器的角色 connected_slaves:2 //鏈接的從服務器數量 slave0:ip=192.168.1.7,port=6379,state=online,offset=546,lag=0 //從服務器狀態 slave1:ip=192.168.1.8,port=6379,state=online,offset=546,lag=0 master_replid:d3839b055eb0705dda0b2782d587e0d0f4a3177c master_replid2:0000000000000000000000000000000000000000 master_repl_offset:546 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:546
從服務器youxi2狀態
[root@youxi2 ~]# redis-cli 127.0.0.1:6379> info replication # Replication role:slave //本服務器的角色 master_host:192.168.1.6 //主服務器的IP地址 master_port:6379 //主服務器的端口號 master_link_status:up //主從鏈接狀態 master_last_io_seconds_ago:1 master_sync_in_progress:0 slave_repl_offset:658 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:d3839b055eb0705dda0b2782d587e0d0f4a3177c master_replid2:0000000000000000000000000000000000000000 master_repl_offset:658 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:71 repl_backlog_histlen:588
從服務器youxi3狀態
[root@youxi3 ~]# redis-cli 127.0.0.1:6379> info replication # Replication role:slave //本服務器的角色 master_host:192.168.1.6 //主服務器的IP地址 master_port:6379 //主服務器的端口號 master_link_status:up //主從鏈接狀態 master_last_io_seconds_ago:7 master_sync_in_progress:0 slave_repl_offset:686 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:d3839b055eb0705dda0b2782d587e0d0f4a3177c master_replid2:0000000000000000000000000000000000000000 master_repl_offset:686 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:281 repl_backlog_histlen:406
7)模擬Master宕機,測試
停掉youxi1的Redis
[root@youxi1 ~]# systemctl stop redis
到youxi2上查看狀態
[root@youxi2 ~]# redis-cli 127.0.0.1:6379> info replication # Replication role:slave master_host:192.168.1.8 //能夠看到Master服務器變成來192.168.1.8 master_port:6379 master_link_status:up master_last_io_seconds_ago:0 master_sync_in_progress:0 slave_repl_offset:86480 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:24fe501f3d7f77e790bc82d9c80e6c920522137e master_replid2:b74fb4029bf6e6a4acb09748dfe63317192cc322 master_repl_offset:86480 second_repl_offset:49216 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:6589 repl_backlog_histlen:79892
此時在打開youxi1的Redis,查看狀態
[root@youxi1 ~]# systemctl start redis [root@youxi1 ~]# redis-cli 127.0.0.1:6379> info replication # Replication role:slave //角色變成來slave master_host:192.168.1.8 master_port:6379 master_link_status:up master_last_io_seconds_ago:0 master_sync_in_progress:0 slave_repl_offset:110509 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:24fe501f3d7f77e790bc82d9c80e6c920522137e master_replid2:0000000000000000000000000000000000000000 master_repl_offset:110509 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:106486 repl_backlog_histlen:4024
8)查看Sentinel狀態
查看Sentinel須要遠程26379端口號,即訪問Sentinel而不是Redis,例如使用如今的從服務器youxi1訪問如今的主服務器youxi3
[root@youxi1 ~]# redis-cli -h 192.168.1.8 -p 26379 192.168.1.8: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=192.168.1.8:6379,slaves=2,sentinels=3
注意:以後的使用就是鏈接Sentinel了。
(5).擴展:Redis主觀下線和客觀下線
主觀下線:Subjectively Down,簡稱SDOWN,指的是當前Sentinel實例對某個redis服務器作出的下線判斷。
客觀下線:Objectively Down, 簡稱ODOWN,指的是多個Sentinel實例在對Master Server作出SDOWN判斷,而且經過SENTINEL is-master-down-by-addr命令互相交流以後,得出的Master Server下線判斷,而後開啓failover。