6.redis-Sentinel(主從複製高可用)

1.主從複製的做用:爲主提供一個備份,當主掛掉之後,備份中有一個完整的數據,第二個做用是爲主實現一個分流,例如實現讀寫分離
2.主從複製的問題:
(1)手動故障轉移
(2)寫能力和存儲能力受限
3.redis sentinel實現redis的高可用方案:故障發現,故障自動轉移,配置中心,客戶端通知
4.redis sentinel架構說明
(1)redis sentinel架構流程
<1>redis節點一樣是主從複製架構
<2>有不少redis sentinel節點,至關於redis進程,這個進程不會存儲數據,做用是對redis的故障判斷,故障轉移的處理,通知客戶端的一個過程
<3>對於客戶端來講不會記錄redis的地址,直接記錄redis sentinel的地址,能夠寫入多個redis sentinel對master和slave進行監控
(2)redis sentinel架構圖

(3)redis sentinel故障轉移流程:
<1>多個sentinel發現並確認master有問題
<2>選舉出一個sentinel做爲領導。
<3>選出一個slave做爲master
<4>通知其他slave成爲新的master的slave.
<5>通知客戶端主從變化
<6>等待老的master復活成爲新的master的slave.
5.redis sentinel安裝配置
(1)配置注意
<1>配置開啓主從節點
<2>配置開啓sentinel監控主節點。(sentinel是特殊的redis,默認端口26379,sentinel自己不存數據,支持的命令是很是有限的,做用主要完成監控故障轉移和通知)
<3>實際應該多機器
<4>詳細配置節點
(2)sentinel主要配置redis

#端口
port ${port}
#工做目錄
dir ""
#日誌名
logfile "${port}.log"
#監控主節點的名字是mymaster,IP和端口,2是兩個sentinel以爲master有問題就會發動故障轉移
sentinel monitor mymaster 127.0.0.1 7000 2
#對master進行監控若是30鏈接不通發動故障轉移
sentinel down-after-milliseconds mymaster 30000
#當master宕機後,新的slave成爲master後,其餘老的slave節點會對新的master節點進行復制,1表明同時只能一個一個複製
sentinel parallel-syncs mymaster 1
#故障轉移時間
sentinel failover-timeout mymaster 180000

(3)實現redis一主二從和三個sentinel架構配置
架構圖:

第一步:查看一主二從
查看master主節點7000端口:./redis-cli -p 7000 info replicationapi

# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=7001,state=online,offset=71,lag=0
slave1:ip=127.0.0.1,port=7002,state=online,offset=71,lag=0
master_repl_offset:71
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:70

查看slave第一個從節點7001端口:./redis-cli -p 7001 info replication網絡

# Replication
role:slave
master_host:127.0.0.1
master_port:7000
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_repl_offset:99
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

查看slave第二個從節點7002端口:./redis-cli -p 7002 info replication架構

# Replication
role:slave
master_host:127.0.0.1
master_port:7000
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_repl_offset:113
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

第二步:三個sentinel配置
配置第一個sentinel-26379.conf:運維

port 26379
daemonize yes
logfile "26379.log"
dir "/home/redis/data"
sentinel myid acc04aeac2b3975cf9978bfd6a614552457f94f3
sentinel monitor mymaster 127.0.0.1 7000 2
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0

# Generated by CONFIG REWRITE
sentinel known-slave mymaster 127.0.0.1 7001
sentinel known-slave mymaster 127.0.0.1 7002
sentinel known-sentinel mymaster 127.0.0.1 26380 8657c962181bf648e0145949f5988ee4093e47d7
sentinel known-sentinel mymaster 127.0.0.1 26381 ba06e6e9368e8e546e7f890449def52497b6ebea

配置第二個sentinel-26380.conf:性能

port 26380
daemonize yes
logfile "26380.log"
dir "/home/redis/data"
sentinel myid 8657c962181bf648e0145949f5988ee4093e47d7
sentinel monitor mymaster 127.0.0.1 7000 2
sentinel config-epoch mymaster 0

# Generated by CONFIG REWRITE
sentinel leader-epoch mymaster 0
sentinel known-slave mymaster 127.0.0.1 7002
sentinel known-slave mymaster 127.0.0.1 7001
sentinel known-sentinel mymaster 127.0.0.1 26381 ba06e6e9368e8e546e7f890449def52497b6ebea
sentinel known-sentinel mymaster 127.0.0.1 26379 acc04aeac2b3975cf9978bfd6a614552457f94f3
sentinel current-epoch 0

配置第三個sentinel-26381.conf:spa

port 26381
daemonize yes
logfile "26381.log"
dir "/home/redis/data"
sentinel myid ba06e6e9368e8e546e7f890449def52497b6ebea
sentinel monitor mymaster 127.0.0.1 7000 2
sentinel config-epoch mymaster 0

# Generated by CONFIG REWRITE
sentinel leader-epoch mymaster 0
sentinel known-slave mymaster 127.0.0.1 7002
sentinel known-slave mymaster 127.0.0.1 7001
sentinel known-sentinel mymaster 127.0.0.1 26380 8657c962181bf648e0145949f5988ee4093e47d7
sentinel known-sentinel mymaster 127.0.0.1 26379 acc04aeac2b3975cf9978bfd6a614552457f94f3
sentinel current-epoch 0

啓動三個sentinel:日誌

./redis-sentinel ../data/sentinel-26379.conf
./redis-sentinel ../data/sentinel-26380.conf
./redis-sentinel ../data/sentinel-26381.conf

查看三個sentinel
登陸第一個sentinel:./redis-cli -p 26379code

127.0.0.1:26379> info
# 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=127.0.0.1:7000,slaves=2,sentinels=3

登陸第二個sentinel:./redis-cli -p 26380blog

127.0.0.1:26380> info
# 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=127.0.0.1:7000,slaves=2,sentinels=3

登陸第三個sentinel:./redis-cli -p 26381

127.0.0.1:26381> info
# 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=127.0.0.1:7000,slaves=2,sentinels=3

6.客戶端鏈接
(1)請求響應流程
第一步:客戶端獲取全部sentinel的節點的集合遍歷,獲取一個可用的sentinel節點
第二步:在能夠PING通的節點上執行sentinel api經過名字獲取mastername,返回給客戶端master節點的地址和端口
第三步:當客戶端獲取到master節點的時候執行role或role replication進行驗證是否真是master節點
7.redis sentinel經過三個定時任務實現sentinel節點對於主節點,從節點,其他sentinel節點的監控
(1)每10秒每一個sentinel對master和slave執行info
發現slave節點
確認主從關係

(2)每2秒每一個sentinel經過master節點的channel交換信息(pub/sub)
經過__sentinel__:hello頻道交互
交互對節點的「見解」和自身信息

(3)每1秒每一個sentinel對其餘sentinel和redis執行ping
心跳檢測,失敗斷定依據

8.redis sentinel在對節點作失敗斷定時分爲主觀下線和客觀下線
(1)主觀下線:每一個sentinel節點對Redis節點失敗的「偏見」
(2)客觀下線:全部sentinel節點對Redis節點失"達成共識"(超過quorum)
9.領導者選舉
緣由:只有一個sentinel節點完成故障轉移
選舉:經過sentinel is-master-down-by-addr命令都但願成爲領導者
(1)每一個主觀顯現的sentinel節點向其餘sentinel節點發送命令,要求將它設置爲領導者。
(2)收到命令的sentinel節點若是沒有贊成經過其餘sentinel節點發送的命令,那麼將贊成該請求,不然拒絕
(3)若是該sentinel節點發現本身的票數已經超過sentinel集合半數且超過quorum,那麼它將成爲領導者。
(4)若是此過程有多個sentinel節點成爲領導者,那麼將等待一段時間從新進行選舉。
10.故障轉移(sentinel領導者節點完成)
(1)從slave節點中選出一個「合適的」節點做爲新的master節點
<1>選擇slave-priority(slave節點優先級)最高的slave節點,若是存在則返回,不存在則繼續
<2>選擇複製偏移量最大的slave節點(複製的最完整),若是存在則返回,不存在則繼續
<3>選擇runId最小的slave節點。
(2)對上面的slave節點執行slaveof no one命令讓其成爲master節點
(3)向剩餘的slave節點發送命令,讓它們成爲新master節點的slave節點,複製規則和parallel-syncs參數有關
(4)更新對原來master節點配置爲slave,並保持着對其「關注」,當其恢復後命令它去複製新的master節點。
11.常見開發運維(1)節點運維緣由:機器下線:列如過保等狀況機器性能不足:列如CPU,內存,硬盤,網絡等節點自身故障:列如服務不穩定等(2)節點下線1)主節點:手動故障轉移,給任意一個sentinel執行,忽略主管下線客觀下線,領導者選舉命令:sentinel failover<masterName>2)從節點:臨時下線仍是永久下線,列如是否作一些清理工做。可是要考慮讀寫分離的狀況(3)節點上線1)sentinel主節點上線:命令:sentinel failover進行替換2)sentinel從節點上線:slaveof便可,sentinel節點能夠感知

相關文章
相關標籤/搜索