主從架構

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,通過
參數設定),master和它所有的slave都維護了複制的資料下标offset和master的程序id,是以,當網絡連接配接斷開後,slave會請求master 繼續進行未完成的複制,從所記錄的資料下标開始。repl-backlog-size 1mb
- 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