Redis高級篇-8 Redis哨兵通知Java代碼客戶端
在上一篇,我們搭建哨兵集群的時候,已經(jīng)驗證了哨兵對集群的監(jiān)控及故障轉(zhuǎn)移功能。本文,咱們就來講講哨兵的第三個功能:通知。也就是RedisTemplate的哨兵模式。
在sentinel集群監(jiān)管下的Redis主從集群,其節(jié)點會因為自動故障轉(zhuǎn)移而發(fā)生變化,Redis的客戶端必須感知這種變化,及時更新連接信息。spring的RedisTemplate底層利用lettuce實現(xiàn)了節(jié)點的感知和自動切換。下面,我們通過一個測試來實現(xiàn)RedisTemplate集成哨兵機制。
想要讓RedisTemplate實現(xiàn)哨兵模式,操作步驟如下:
1:引入依賴;
2:配置senntinel相關(guān)信息;
3:配置讀寫分離
4:測試
一:引入依賴
在pom文件中引入相關(guān)依賴
? ? ? ? ?
??? ? ? ? ? ?org.springframework.boot
??? ? ? ? ? ?spring-boot-starter-data-redis
二:配置Redis sentinel相關(guān)信息
在配置文件application.yml中指定Redis的sentienl相關(guān)信息。
spring:
? redis:
??? sentinel:
????? master:?mymaster #自定義的master名字
????? nodes:?# 指定Redis-sentinel集群地址
??????? -?192.168.1.11:27001
??????? -?192.168.1.11:27002
??????? -?192.168.1.11:27003
? ? ? ? ?
三:配置lettuce讀寫分離
在項目中,添加配置類(可以在啟動類中,也可以新寫一個@Configuration的類),添加一個新的bean。如下:
@Bean
public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){
??? return?clientConfigurationBuilder -> {
??????? clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
??? };
}
? ? ? ? ?
這個bean中配置的就是讀寫策略:ReadFrom.REPLICA_PREFERRED。其中讀寫策略包括四種:
① MASTER:從主節(jié)點讀取;
② MASTER_PREFERRED:優(yōu)先從master節(jié)點讀取,master不可用才讀取replica
③ REPLICA:從slave(replica)節(jié)點讀取;
④ REPLICA_PREFERRED:優(yōu)先從slave(replica)節(jié)點讀取,如果所有的slave都不可用的時候,才從master讀取。
建議采用第四種方案。
四:測試
代碼修改完成之后,刷新pom依賴,重啟項目,查看啟動日志。
注意:查看啟動日志,將日志級別設(shè)置為debug。這樣便于觀察。
項目啟動會,訪問想Redis中set一個key.查看控制臺日志:
因為sentinel是集群模式,項目啟動后,要選擇一個地址進行連接。
lettuce采用訂閱模式,訂閱sentinel的
當(dāng)執(zhí)行set的時候,因為set是寫操作,只能在master上進行寫操作。所以,RedisTemplate會切換與7002這臺master機器進行連接。如下圖:
目前master是7002,我們關(guān)閉7002,由于sentinel監(jiān)控了集群,會執(zhí)行故障遷移,會產(chǎn)生一個新的master出來。我們關(guān)閉7002.當(dāng)新master選舉出來之后,在執(zhí)行set命令。看看日志。
7002關(guān)閉后,我們從sentinel的日志中,可以看到7003成了新的master。如下圖:
在選舉出新master之前,項目會報錯。控制臺空的錯誤如下圖:
當(dāng)新的master選舉后,項目日志就正常了。我們在訪問set,看看控制臺日志:
主從切換自動完成。
執(zhí)行讀操作,因為我們設(shè)置讀寫模式是:優(yōu)先slave,當(dāng)所有slave都不可用的時候才選擇master。因為當(dāng)前我們slave都可用。所以任意選擇。日志如下圖:
? ? ? ? ?
