1. 程式人生 > >Redis的主從架構+哨兵模式

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