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 26381sentinel叢集都啟動完畢後,會將哨兵叢集的元資料資訊寫入所有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