CentOS7下使用Sentinel實現Redis集羣高可用

  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。

 

 

 

參考:http://www.javashuo.com/article/p-vguqgocn-gw.html

相關文章
相關標籤/搜索