淺談Redis哨兵模式高可用解決方案
一、序言
Redis高可用有兩種模式:哨兵模式和集群模式,本文基于哨兵模式搭建一主兩從三哨兵Redis高可用服務。
1、目標與收獲
一主兩從三哨兵Redis服務,基本能夠滿足中小型項目的高可用要求,使用Supervisor監(jiān)控并管理Redis實例。通過本文將完成如下目標:
- 哨兵模式服務規(guī)劃與搭建
哨兵模式服務相比于單機版服務更加可靠,適合讀寫分離、數(shù)據(jù)量不是很大、要求可靠穩(wěn)定性的場景。
- 客戶端整合與讀寫分離
通過Spring框架對哨兵模式進行連接,完成生產(chǎn)環(huán)境的常見操作。
2、端口規(guī)劃
端口規(guī)劃是完成本方案的第一步。

二、單機模擬
單機模擬是指在單臺物理機或者虛擬機上模擬操作,最大化還原本方案中間過程,適用于學習或者開發(fā)階段使用。
為了簡化操作,Redis服務做如下約定:數(shù)據(jù)不持久化到磁盤;服務實例以前臺進程方式運行;節(jié)點的配置文件以默認配置文件為模版;無密碼驗證。
(一)服務規(guī)劃
1、Redis實例
服務在第一次啟動時明確知道第幾個節(jié)點是master節(jié)點,當服務在長期運行并發(fā)生主從切換時,無法顯示知道第幾個節(jié)點是master節(jié)點,需要通過命令行間接查詢。
| 節(jié)點 | 主機 | 端口 | 角色 | 額外配置 |
|---|---|---|---|---|
| node01 | 127.0.0.1 | 6380 | 第一次啟動時作為master服務 | |
| node02 | 127.0.0.1 | 6381 | 第一次啟動時作為slave服務 | replicaof 127.0.0.1 6380 |
| node03 | 127.0.0.1 | 6382 | 第一次啟動時作為slave服務 | replicaof 127.0.0.1 6380 |
額外配置指第一次啟動Redis服務實例時,節(jié)點配置文件中新增配置。
2、哨兵服務
哨兵服務節(jié)點之間沒有主從的區(qū)別,所有節(jié)點處于平等地位。當主服務異常時,哨兵服務之間會喚醒投票策略,從Redis實例從節(jié)點選擇主服務的候選人。
| 節(jié)點 | 主機 | 端口 | 額外配置 |
|---|---|---|---|
| node01 | 127.0.0.1 | 26380 | sentinel monitor mymaster 127.0.0.1 6380 2 |
| node02 | 127.0.0.1 | 26381 | sentinel monitor mymaster 127.0.0.1 6380 2 |
| node03 | 127.0.0.1 | 26382 | sentinel monitor mymaster 127.0.0.1 6380 2 |
(二)服務配置
1、Redis實例
節(jié)點的初始配置文件以默認配置文件為模版。
node01、node02初始化配置文件之后,顯示指明節(jié)點間的主從關(guān)系,增加如下配置:
replicaof 127.0.0.1 6380
2、哨兵服務
節(jié)點的初始配置文件以默認配置文件為模版。
node01、node02、node03初始化配置文件后,增加如下配置:
sentinel monitor mymaster 127.0.0.1 6381 2
(三)服務管理
測試或者學習時,建議采用前臺進程管理服務,便于模擬單點故障、查看日志觀察主從切換。
生產(chǎn)條件下建議使用Supervisor管理服務,不僅易于管理而且能夠?qū)崿F(xiàn)服務異常終止后自動重啟。高可用場景下使用的是三臺物理機。
1、Redis實例
/usr/local/redis/bin/redis-server /usr/local/redis/conf/ms/redis80.conf --port 6380 --save '' --daemonize no /usr/local/redis/bin/redis-server /usr/local/redis/conf/ms/redis81.conf --port 6381 --save '' --daemonize no /usr/local/redis/bin/redis-server /usr/local/redis/conf/ms/redis82.conf --port 6382 --save '' --daemonize no
2、哨兵服務
/usr/local/redis/bin/redis-sentinel /usr/local/redis/conf/ms/sentinel280.conf --port 26380 --daemonize no /usr/local/redis/bin/redis-sentinel /usr/local/redis/conf/ms/sentinel281.conf --port 26381 --daemonize no /usr/local/redis/bin/redis-sentinel /usr/local/redis/conf/ms/sentinel282.conf --port 26382 --daemonize no
三、客戶端整合
客戶端實現(xiàn)是指基于SpringBoot的整合分為兩步實現(xiàn):一是完成作為基礎(chǔ)的整合;二是結(jié)合生產(chǎn)需要補充新特性。
(一)基礎(chǔ)整合
基礎(chǔ)整合的內(nèi)容是以Java客戶端連接高可用哨兵模式Redis服務,實現(xiàn)單節(jié)點故障服務正常運行的要求。
1、全局配置文件
全局配置文件添加的配置信息有:master參數(shù)為哨兵服務名,此處為默認值;nodes參數(shù)為哨兵服務列表(不是Redis實例服務列表);database參數(shù)為數(shù)據(jù)庫。
spring:
redis:
database: 0
sentinel:
nodes: 192.168.181.171:26380,192.168.181.171:26381,192.168.181.171:26382
master: mymaster
2、集成配置
集成進SpringBoot體系,最核心的是創(chuàng)建LettuceConnectionFactory連接工廠,通過Redis連接工廠,能夠順利繼承進Spring體系下其他框架。
@Configuration
public class RedisSentinelConfig {
@Autowired
private RedisProperties redisProperties;
@Bean
public RedisConnectionFactory lettuceConnectionFactory() {
RedisProperties.Sentinel sentinel = redisProperties.getSentinel();
HashSet<String> nodes = new HashSet<>(sentinel.getNodes());
String master = sentinel.getMaster();
RedisSentinelConfiguration config = new RedisSentinelConfiguration(master, nodes);
config.setDatabase(redisProperties.getDatabase());
return new LettuceConnectionFactory(config);
}
}
(二)讀寫分離
基礎(chǔ)整合僅僅是實現(xiàn)了高可用Redis服務的流程,生產(chǎn)環(huán)境下仍需要增加其他配置:修改自定義連接數(shù)據(jù)庫序號;授權(quán)連接;連接池配置;讀寫分離。
在高可用前提下,衍生出讀寫分離的特性,主庫完成寫請求;從庫完成讀請求(從庫不允許寫)。
@Bean
public LettuceClientConfigurationBuilderCustomizer lettuceClientCustomizer() {
// 配置讀寫分離
return builder -> builder.readFrom(ReadFrom.REPLICA);
}到此這篇關(guān)于淺談Redis哨兵模式高可用解決方案的文章就介紹到這了,更多相關(guān)Redis哨兵模式高可用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Redis結(jié)合SpringBoot的秒殺案例詳解
這篇文章主要介紹了Redis結(jié)合SpringBoot的秒殺案例,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09
淺談Redis高并發(fā)緩存架構(gòu)性能優(yōu)化實戰(zhàn)
本文主要介紹了淺談Redis高并發(fā)緩存架構(gòu)性能優(yōu)化實戰(zhàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-05-05
淺談一下Redis的數(shù)據(jù)結(jié)構(gòu)
這篇文章主要介紹了淺談一下Redis的數(shù)據(jù)結(jié)構(gòu),簡單字符串結(jié)構(gòu)被用于存儲redis的key對象和String類型的value對象,其中的free和len字段可以輕松的使得在該字符串被修改時判斷是否需要擴容,需要的朋友可以參考下2023-08-08
手把手教你用Redis 實現(xiàn)點贊功能并且與數(shù)據(jù)庫同步
本文主要介紹了Redis 實現(xiàn)點贊功能并且與數(shù)據(jù)庫同步,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-05-05

