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發佈的節點變動消息)
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
啟動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


比如6379的redis如果掛了,

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

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