Redis
主從複製可將主節點數據同步給從節點,從節點此時有兩個做用:python
可是問題是:redis
那麼這個問題,redis-sentinel就能夠解決了算法
Redis-Sentinel是redis官方推薦的高可用性解決方案, 當用redis做master-slave的高可用時,若是master自己宕機,redis自己或者客戶端都沒有實現主從切換的功能。 而redis-sentinel就是一個獨立運行的進程,用於監控多個master-slave集羣, 自動發現master宕機,進行自動切換slave > master。
每一個Sentinel以每秒鐘一次的頻率向它所知的Master,Slave以及其餘 Sentinel 實例發送一個 PING 命令 若是一個實例(instance)距離最後一次有效回覆 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個實例會被 Sentinel 標記爲主觀下線。 若是一個Master被標記爲主觀下線,則正在監視這個Master的全部 Sentinel 要以每秒一次的頻率確認Master的確進入了主觀下線狀態。 當有足夠數量的 Sentinel(大於等於配置文件指定的值)在指定的時間範圍內確認Master的確進入了主觀下線狀態, 則Master會被標記爲客觀下線 在通常狀況下, 每一個 Sentinel 會以每 10 秒一次的頻率向它已知的全部Master,Slave發送 INFO 命令 當Master被 Sentinel 標記爲客觀下線時,Sentinel 向下線的 Master 的全部 Slave 發送 INFO 命令的頻率會從 10 秒一次改成每秒一次 若沒有足夠數量的 Sentinel 贊成 Master 已經下線, Master 的客觀下線狀態就會被移除。 若 Master 從新向 Sentinel 的 PING 命令返回有效回覆, Master 的主觀下線狀態就會被移除。 主觀下線和客觀下線 主觀下線:Subjectively Down,簡稱 SDOWN,指的是當前 Sentinel 實例對某個redis服務器作出的下線判斷。 客觀下線:Objectively Down, 簡稱 ODOWN,指的是多個 Sentinel 實例在對Master Server作出 SDOWN 判斷,而且經過 SENTINEL is-master-down-by-addr 命令互相交流以後,得出的Master Server下線判斷,而後開啓failover. SDOWN適合於Master和Slave,只要一個 Sentinel 發現Master進入了ODOWN, 這個 Sentinel 就可能會被其餘 Sentinel 推選出, 並對下線的主服務器執行自動故障遷移操做。 ODOWN只適用於Master,對於Slave的 Redis 實例,Sentinel 在將它們判斷爲下線前不須要進行協商, 因此Slave的 Sentinel 永遠不會達到ODOWN。
Sentinel是redis的一個進程,可是不存儲數據,只是監控redis數據庫
官網地址:http://redisdoc.com/ redis-cli info #查看redis數據庫信息 redis-cli info replication #查看redis的複製受權信息 redis-cli info sentinel #查看redis的哨兵信息
redis的哨兵,自動的主從故障切換服務器
# 準備3個redis數據庫實例 主庫:端口6379 從庫:端口6380 從庫:端口6381 # 準備3個redis-sentinel哨兵 redis-server redis-6379.conf redis-server redis-6380.conf redis-server redis-6381.conf # 三個哨兵同時監測主庫6379的運行情況,宕機後三個哨兵根據算法選擇從庫中的一個切換成主庫
生成數據文件夾架構
mkdir -p /var/redis/data/{6379,6380,6381}
主庫6379配置文件redis-6379.conf ide
port 6379 daemonize yes logfile "6379.log" dbfilename "dump-6379.rdb" dir "/var/redis/data/6379"
從庫6380配置文件redis-6380.conf spa
port 6380 daemonize yes logfile "6380.log" dbfilename "dump-6380.rdb" dir "/var/redis/data/6380" slaveof 127.0.0.1 6379
從庫6381配置文件redis-6381.conf 3d
port 6381 daemonize yes logfile "6380.log" dbfilename "dump-6380.rdb" dir "/var/redis/data/6381" slaveof 127.0.0.1 6379
redis-server redis-6379.conf redis-server redis-6380.conf redis-server redis-6381.conf
建立配置文件code
touch redis-sentinel-26379.conf touch redis-sentinel-26380.conf touch redis-sentinel-26381.conf
參數詳解
port 26379 dir /var/redis/data/26379 logfile "26379.log" // 當前Sentinel節點監控 127.0.0.1:6379 這個主節點 // 2表明判斷主節點失敗至少須要2個Sentinel節點節點贊成 // mymaster是主節點的別名 sentinel monitor s20master 127.0.0.1 6379 2 //每一個Sentinel節點都要按期PING命令來判斷Redis數據節點和其他Sentinel節點是否可達,若是超過30000毫秒30s且沒有回覆,則斷定不可達 sentinel down-after-milliseconds s20master 30000 //當Sentinel節點集合對主節點故障斷定達成一致時,Sentinel領導者節點會作故障轉移操做,選出新的主節點, 原來的從節點會向新的主節點發起復制操做,限制每次向新的主節點發起復制操做的從節點個數爲1 sentinel parallel-syncs s20master 1 //故障轉移超時時間爲180000毫秒 sentinel failover-timeout s20master 180000 //讓哨兵在後臺運行 daemonize yes
注意
若是主庫中設置了密碼,咱們須要在哨兵配置文件中加上下面的參數:
protected-mode no sentinel auth-pass
port 26379 dir /var/redis/data/26379 logfile "26379.log" sentinel monitor s20master 127.0.0.1 6379 2 sentinel down-after-milliseconds s20master 30000 sentinel parallel-syncs s20master 1 sentinel failover-timeout s20master 180000 daemonize yes
port 26380 dir /var/redis/data/26380 logfile "26380.log" sentinel monitor s20master 127.0.0.1 6379 2 sentinel down-after-milliseconds s20master 30000 sentinel parallel-syncs s20master 1 sentinel failover-timeout s20master 180000 daemonize yes
port 26381 dir /var/redis/data/26381 logfile "26381.log" sentinel monitor s20master 127.0.0.1 6379 2 sentinel down-after-milliseconds s20master 30000 sentinel parallel-syncs s20master 1 sentinel failover-timeout s20master 180000 daemonize yes
redis-sentinel redis-26379.conf redis-sentinel redis-26380.conf redis-sentinel redis-26381.conf # 保證sentinel的配置正確,不然,你在啓動報錯後,配置文件的內容會發生變化,這是個坑!!!!
redis-cli -p 26379 info sentinel redis-cli -p 26380 info sentinel redis-cli -p 26381 info sentinel
sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 # 看到最後一條信息正確即成功了哨兵,哨兵主節點名字叫作s20master,狀態ok,監控地址是127.0.0.0:6379,有兩個從節點,3個哨兵 master0:name=s20master,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3
大體思路
redis-cli -p 端口 info replication
【6379】
[root@szx / 17:18:24]#redis-cli -p 6379 info replication # Replication role:master connected_slaves:2 # 兩個從庫 slave0:ip=127.0.0.1,port=6380,state=online,offset=837877,lag=1 slave1:ip=127.0.0.1,port=6381,state=online,offset=838011,lag=0 master_replid:a4ecb61110814dc5b117db545c0c96c904990fc4 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:838011 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:838011
【6380】
[root@szx / 17:19:14]#redis-cli -p 6380 info replication # Replication role:slave master_host:127.0.0.1 # 主庫ip master_port:6379 # 主庫端口 master_link_status:up # 狀態正常 master_last_io_seconds_ago:1 master_sync_in_progress:0 slave_repl_offset:852447 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:a4ecb61110814dc5b117db545c0c96c904990fc4 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:852447 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:852447
【6381】
[root@szx / 17:20:27]#redis-cli -p 6381 info replication # Replication role:slave master_host:127.0.0.1 master_port:6379 master_link_status:up master_last_io_seconds_ago:0 master_sync_in_progress:0 slave_repl_offset:874725 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:a4ecb61110814dc5b117db545c0c96c904990fc4 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:874725 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:15 repl_backlog_histlen:874711
此時,幹掉master!!!而後等待其餘兩個節點是否能自動被哨兵sentienl,切換爲master節點