Redis的主從架構+哨兵模式

Redis主從架構

 

 

redis主從架構搭建,配置從節點步驟:

1、複製一份redis.conf文件的目錄

cd /usr/local/java
cp -a redis redis_6380

2、將相關配置修改爲如下值:

port 6380
pidfile /var/run/redis_6380.pid  # 把pid進程號寫入pidfile配置的文件
logfile "6380.log"
dir /usr/local/redis/data/6380  # 指定數據存放目錄
# 需要註釋掉bind
# bind 127.0.0.1(bind綁定的是自己機器網卡的ip,如果有多塊網卡可以配多個ip,代表允許客戶端通過機器的哪些網卡ip去訪問,內網一般可以不配置bind,註釋掉即可)

注意數據存放目錄的文件夾目錄要預先設置好

3、配置主從複製

replicaof 127.0.0.1 6379   # 從本機6379的redis實例複製數據,Redis 5.0之前使用slaveof
replica-read-only yes  # 配置從節點只讀

4、啓動從節點

 /usr/local/bin/redis-server /usr/local/java/redis_6380/redis.conf

5、連接從節點

 ./redis-cli -p 6380

 

 

6、測試在6379實例上寫數據,6380實例是否能及時同步新修改數據

6379主節點

 

 6380從節點

Redis主從工作原理

如果你爲master配置了一個slave,不管這個slave是否是第一次連接上Master,它都會發送一個PSYNC命令給master請求複製數據。

master收到PSYNC命令後,會在後臺進行數據持久化通過bgsave生成最新的rdb快照文件,持久化期間,master會繼續接收客戶端的請求,它會把這些可能修改數據集的請求緩存在內存中。

當持久化進行完畢以後,master會把這份rdb文件數據集發送給slave,slave會把接收到的數據進行持久化生成rdb,然後再加載到內存中。然後,master再將之前緩存在內存中的命令發送給slave。

當master與slave之間的連接由於某些原因而斷開時,slave能夠自動重連Master,如果master收到了多個slave併發連接請求,它只會進行一次持久化,而不是一個連接一次,然後再把這一份持久化的數據發送給多個併發連接的slave。

主從複製(全量複製)流程圖:

 

 

數據部分複製

當master和slave斷開重連後,一般都會對整份數據進行復制。但從redis2.8版本開始,redis改用可以支持部分數據複製的命令PSYNC去master同步數據,slave與master能夠在網絡連接斷開重連後只進行部分數據複製(斷點續傳)。

master會在其內存中創建一個複製數據用的緩存隊列,緩存最近一段時間的數據,master和它所有的slave都維護了複製的數據下標offset和master的進程id,因此,當網絡連接斷開後,slave會請求master繼續進行未完成的複製,從所記錄的數據下標開始。

如果master進程id變化了,或者從節點數據下標offset太舊,已經不在master的緩存隊列裏了,那麼將會進行一次全量數據的複製。

主從複製(部分複製,斷點續傳)流程圖:

 

如果有很多從節點,爲了緩解主從複製風暴(多個從節點同時複製主節點導致主節點壓力過大),可以做如下架構,讓部分從節點與從節點(與主節點同步)同步數據

 

 

Redis哨兵高可用架構

sentinel哨兵是特殊的redis服務,不提供讀寫服務,主要用來監控redis實例節點。

哨兵架構下client端第一次從哨兵找出redis的主節點,後續就直接訪問redis的主節點,不會每次都通過sentinel代理訪問redis的主節點,當redis的主節點發生變化,哨兵會第一時間感知到,並且將新的redis主節點通知給client端(這裏面redis的client端一般都實現了訂閱功能,訂閱sentinel發佈的節點變動消息)

 

redis哨兵架構搭建步驟:

1、自己再配置一個6381的從節點,步驟和上述6380一樣,首先配置6379主節點的sentinel.conf文件

2、將相關配置修改爲如下值:

port 26379
daemonize yes
pidfile "/var/run/redis-sentinel-26379.pid"
logfile "26379.log"
dir /usr/local/redis/data
# sentinel monitor <master-redis-name> <master-redis-ip> <master-redis-port> <quorum>
# quorum是一個數字,指明當有多少個sentinel認爲一個master失效時(值一般爲:sentinel總數/2 + 1),master纔算真正失效
sentinel monitor mymaster 127.0.0.1 6379 2   # mymaster這個名字隨便取,客戶端訪問時會用到

3、啓動sentinel哨兵實例

cd  /usr/local/bin
./redis-sentinel /usr/local/java/redis/sentinel.conf

4、查看sentinel的info信息

redis-cli -p 26379
info

可以看到Sentinel的info裏已經識別出了redis的主從

 

自己再配置兩個sentinel,端口26380和26381,注意上述配置文件裏的對應數字都要修改

啓動26380

/usr/local/bin/redis-sentinel /usr/local/java/redis_6380/sentinel.conf
redis-cli -p 26380

 

 啓動26381

/usr/local/bin/redis-sentinel /usr/local/java/redis_6381/sentinel.conf
redis-cli -p 26381

sentinel集羣都啓動完畢後,會將哨兵集羣的元數據信息寫入所有sentinel的配置文件裏去(追加在文件的最下面),我們查看下6379的如下配置文件sentinel.conf,如下所示:

 

 

當redis主節點如果掛了,哨兵集羣會重新選舉出新的redis主節點,同時會修改所有sentinel節點配置文件的集羣元數據信息,

 

 比如6379的redis如果掛了,

 

 假設選舉出的新主節點是6380,則sentinel文件裏的集羣元數據信息會變成如下所示

同時還會修改sentinel文件裏之前配置的mymaster對應的6379端口,改爲6380

 

 

當6379的redis實例再次啓動時,哨兵集羣根據集羣元數據信息就可以將6379端口的redis節點作爲從節點加入集羣
/usr/local/bin/redis-server /usr/local/java/redis/redis.conf
./redis-sentinel /usr/local/java/redis/sentinel.conf

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章