天天看點

Redis主從與哨兵

主從架構

Redis主從與哨兵

Redis主從工作原理

  • 1.如果你為master配置了一個slave,不管這個slave是否是第一次連接配接上Master,它都會發送一個PSYNC指令給master請求複制資料。
  • 2.master收到PSYNC指令後,會在背景進行資料持久化,通過bgsave生成最新的rdb快照檔案,持久化期間,master會繼續接收用戶端的請求,它會把這些可能修改的資料集的請求緩存在記憶體中。
  • 3.當持久化進行完畢以後,master會把這份rdb檔案資料集發送給slave,slave會把接收到的資料進行持久化生成rdb,然後再加載到記憶體中。
  • 4.然後,master再将之前緩存在記憶體中的指令發送給slave。
  • 5.當master與slave之間的連接配接由于某些原因而斷開時,slave能夠自動重連Master。
  • 6.如果master收到了多個slave并發連接配接請求,它隻會進行一次持久化,而不是一個連接配接一次,然後再把這一份持久化的資料發送給多個并發連接配接的slave。

主從複制(全量複制)流程圖
Redis主從與哨兵
資料部分複制

  • 1.當master和slave斷開重連後,一般都會對整份資料進行複制。
  • 2.但從redis2.8版本開始,redis改用可以支援部分資料複制的指令PSYNC去master同步資料,slave與master能夠在網絡連接配接斷開重連後隻進行部分資料複制(斷點續傳)。 master會在其記憶體中建立一個複制資料用的緩存隊列,緩存最近一段時間的資料(預設大小為1M,通過

    repl-backlog-size 1mb

    參數設定),master和它所有的slave都維護了複制的資料下标offset和master的程序id,是以,當網絡連接配接斷開後,slave會請求master 繼續進行未完成的複制,從所記錄的資料下标開始。
  • 3.如果master程序id變化了,或者從節點資料下标 offset太舊,已經不在master的緩存隊列裡了,那麼将會進行一次全量資料的複制。

主從複制(部分複制,斷點續傳)流程圖
Redis主從與哨兵

主從架構搭建

redis-6379.conf為master配置檔案,redis-6380.conf和redis-6381.conf為slave配置檔案。

[root@redis redis]# ls
6379.conf  6380.conf  6381.conf      

編輯配置檔案

redis-6379.conf

修改以下配置檔案:

port 6379  #監聽端口号
bind 0.0.0.0  #監聽本機所有IP
pidfile /var/run/redis_6379.pid   #把pid程序号寫入pidfile配置的檔案
logfile /var/log/redis_6379.log  #log檔案
dir /var/lib/redis/6379   #資料存放目錄      
redis-6380.conf
port 6380  #監聽端口号
bind 0.0.0.0  #監聽本機所有IP
pidfile /var/run/redis_6380.pid   #把pid程序号寫入pidfile配置的檔案
logfile /var/log/redis_6380.log  #log檔案
dir /var/lib/redis/6380   #資料存放目錄
#配置主從複制
replicaof 192.168.1.151 6379 #從本機6379的redis執行個體複制資料,Redis5.0之前使用slaveof
replica‐read‐only yes # 配置從節點隻讀      
redis-6381.conf
port 6381  #監聽端口号
bind 0.0.0.0  #監聽本機所有IP
pidfile /var/run/redis_6381.pid   #把pid程序号寫入pidfile配置的檔案
logfile /var/log/redis_6381.log  #log檔案
dir /var/lib/redis/6381   #資料存放目錄
#配置主從複制
replicaof 192.168.1.151 6379 #從本機6379的redis執行個體複制資料,Redis5.0之前使用slaveof
replica‐read‐only yes # 配置從節點隻讀      

啟動服務

#建立資料存放目錄
mkdir -p /var/lib/redis/6379
mkdir -p /var/lib/redis/6380
mkdir -p /var/lib/redis/6381
#啟動服務
redis-server 6379.conf
redis-server 6380.conf
redis-server 6381.conf      

驗證

在主節點寫資料從節點可以同步收到:

[root@redis redis]# redis-cli 
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> set k1 1
OK
127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379>      

在從節點檢視:

[root@redis redis]# redis-cli -p 6380
127.0.0.1:6380> keys *
1) "k1"
127.0.0.1:6380>      

在redis節點上可以通過info指令檢視主從相關資訊:

# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.151,port=6381,state=online,offset=25289,lag=1
slave1:ip=192.168.1.151,port=6380,state=online,offset=25146,lag=1
master_replid:59012e124083d4fe7a8cc1280644ee12a040b78c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:25289
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:25289      

哨兵高可用架構
Redis主從與哨兵

  • 1.sentinel哨兵是特殊的redis服務,不提供讀寫服務,主要用來監控redis執行個體節點。
  • 2.哨兵架構下client端第一次從哨兵找出redis的主節點,後續就直接通路redis的主節點,不會每次都通過 sentinel代理通路redis的主節點
  • 3.當redis的主節點發生變化,哨兵會第一時間感覺到,并且将新的redis 主節點通知給client端(這裡面redis的client端一般都實作了訂閱功能,訂閱sentinel釋出的節點變動消息)

哨兵高可用配置

sentinel-26380.conf,sentinel-26381.conf和sentinel-26379.conf除了對應的數字不一樣以外,其餘都一樣。

port 26379
daemonize yes
pidfile "/var/run/redis_sentinel_26379.pid"
logfile "/var/log/redis_sentinel_26379.log"
dir "/var/lib/redis/26379"
#最後的2是quorum,指明當有多少個sentinel認為一個master失效時(值一般為:sentinel總數/2+1),master才算真正失效
#cr7-master是自己定義的名字,當用戶端通路的時候會用到
sentinel monitor cr7-master 192.168.1.151 6380 2      

啟動哨兵

#建立存放資料的目錄
mkdir -p /var/lib/redis/26379
mkdir -p /var/lib/redis/26380
mkdir -p /var/lib/redis/26381
#啟動服務
redis-sentinel sentinel-26370.conf
redis-sentinel sentinel-26380.conf
redis-sentinel sentinel-26381.conf      

sentinel叢集都啟動完畢後,會将哨兵叢集的中繼資料資訊寫入所有sentinel的配置檔案裡去(追加在檔案的最下面),我們檢視下如下配置檔案sentinel-26379.conf,如下所示:

root@redis redis]# cat sentinel-26379.conf 
port 26379
daemonize yes
pidfile "/var/run/redis_sentinel_26379.pid"
logfile "/var/log/redis_sentinel_26379.log"
dir "/var/lib/redis/26379"
sentinel myid aca7762f80007c4c4a3d099709789de34359b1d0
# 自動追加生成的内容
# Generated by CONFIG REWRITE
protected-mode no
sentinel deny-scripts-reconfig yes
sentinel monitor cr7-master 192.168.1.151 6379 2
sentinel config-epoch cr7-master 0
sentinel leader-epoch cr7-master 0
sentinel known-replica cr7-master 192.168.1.151 6380
sentinel known-replica cr7-master 192.168.1.151 6381
sentinel known-sentinel cr7-master 192.168.1.151 26381 1832c331b2a60998d1e8440d3b8445c1259607f9
sentinel known-sentinel cr7-master 192.168.1.151 26380 5c9ab6fb2232879cd64def3efbb460ca6415e37b
sentinel current-epoch 0      

連接配接redis-sentinel,通過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=cr7-master,status=ok,address=192.168.1.151:6379,slaves=2,sentinels=3      

當redis主節點如果挂了,哨兵叢集會重新選舉出新的redis主節點,同時會修改所有sentinel節點配置檔案的叢集中繼資料資訊,比如6379的redis如果挂了,假設選舉出的新主節點是6380,則sentinel檔案裡的叢集中繼資料資訊會變成如下所示:

[root@redis redis]# cat sentinel-26380.conf 
port 26380
daemonize yes
pidfile "/var/run/redis_sentinel_26380.pid"
logfile "/var/log/redis_sentinel_26380.log"
dir "/var/lib/redis/26380"
sentinel myid 5c9ab6fb2232879cd64def3efbb460ca6415e37b
# Generated by CONFIG REWRITE
protected-mode no
sentinel deny-scripts-reconfig yes
sentinel monitor cr7-master 192.168.1.151 6380 2  #選舉出來的新的主節點
sentinel config-epoch cr7-master 1
sentinel leader-epoch cr7-master 1
sentinel known-replica cr7-master 192.168.1.151 6379
sentinel known-replica cr7-master 192.168.1.151 6381
sentinel known-sentinel cr7-master 192.168.1.151 26381 1832c331b2a60998d1e8440d3b8445c1259607f9
sentinel known-sentinel cr7-master 192.168.1.151 26379 aca7762f80007c4c4a3d099709789de34359b1d0
sentinel current-epoch 1      

并且用戶端可以正常寫入資料:

[root@redis redis]# redis-cli -p 6380
127.0.0.1:6380> keys *
1) "k1"
127.0.0.1:6380> set k2 2
OK
127.0.0.1:6380>      

當6379的redis執行個體再次啟動時,哨兵叢集根據叢集中繼資料資訊就可以将6379端口的redis節點作為從節點加入叢集,會修改redis-6379.conf的配置,增加:

replicaof 192.168.1.151 6380      

繼續閱讀