Redis哨兵模式
- 前言
- 一、Redis哨兵模式
- 二、哨兵模式配置
- 三、配置主從複制叢集
-
- 1、拷貝三份配置檔案,并修改名稱:
- 2、配置redis81.conf (其餘82、83和這個配置一樣)
- 3、啟動好三台機器
-
- 3.1 選舉Leader
- 四、配置哨兵模式
-
- 4.1 建立sentinel.conf
- 4.2 啟動哨兵
- 4.3 檢視程序是否都正常
- 4.4 自動選舉Leader
- 五、SpringBoot內建Redis哨兵
-
- 5.1 導入依賴包
- 5.2 application.yml
- 5.3 測試類
- 5.4 檢視結果
- 5.5 問題抛出說明
- 總結
前言
小編在我的其它部落格文章中講解了 Redis 主從複制,Redis哨兵模式,其實 Redis 主從複制有一個很大的缺點就是沒有辦法對 master 進行動态選舉(當 master 挂掉後,會通過一定的機制,從 slave 中選舉出一個新的 master)。然而Redis哨兵模式完美解決了這個缺點,實作叢集高可用。
一、Redis哨兵模式
哨兵的作用:
1、通過發送指令,讓Redis伺服器傳回其監控的運作狀态,包括主伺服器和從伺服器。
2、當哨兵監測到master當機,會自動将slave切換成master,然後通過釋出訂閱模式通知其他的從伺服器,修改配置檔案,讓它們自動選舉切換為主伺服器。
二、哨兵模式配置
小編這裡配置了三台Redis,其中具體配置過程,請移步至小編的這兩篇文章:
Redis主從複制配置(原理剖析)
Redis哨兵模式(原理剖析)
注明:最近小編,因為公司需要Redis配置哨兵叢集,是以呢,我就回頭看了之前的筆記,就是上面這兩篇文章,其中,第一篇主從複制叢集搭建,隻要你仔細看,按照步驟搭建是完全沒問題,有一些遺漏的問題,在這篇文章,我也會把詳細的配置再配置一遍,包括第二篇哨兵配置需要注意的地方,下面也會再配置一遍。
下面是小編搭建好的三台伺服器:
IP | 類型 | 端口 |
---|---|---|
192.168.31.6 | 主節點 | 6381 |
192.168.31.6 | 從節點 | 6382 |
192.168.31.6 | 從節點 | 6383 |
三、配置主從複制叢集
下面小編就以我目前搭建好的Redis為列子,再配置一次:
1、拷貝三份配置檔案,并修改名稱:
在redis的安裝目錄bin目錄下:(預設是 /usr/local/bin/目錄下)建立dtconfig:
将預設的配置redis.conf 拷貝在這個目錄下,分别備份三份:
cp redis.cnf redis81.conf
cp redis.cnf redis82.conf
cp redis.cnf redis83.conf
2、配置redis81.conf (其餘82、83和這個配置一樣)
主要配置:
#修改端口号
port 6381
#修改背景運作程序檔案
pidfile "/var/run/redis_6381.pid"
#修改日志檔案
logfile "6381.log"
#修改RDB持久化二進制檔案名稱
dbfilename "dump6381.rdb"
#設定預設背景啟動
rdbchecksum yes
#修改Redis服務保護模式
protected-mode no
#設定IP(如果不設定,SpringBoot用戶端哨兵模式無法連接配接,需要手動修改哨兵配置檔案裡面的主節點IP)
bind 192.168.31.6
注意: 最好設定IP,如果不設定,SpringBoot用戶端哨兵模式無法連接配接,需要手動修改哨兵配置檔案裡面的主節點IP,如果服務當機,主節點ip會自動切換為127.0.0.1,也就是本地回環位址。這樣的話,通路redis服務隻能通過本機的用戶端連接配接,而無法通過遠端連接配接。在之前小編配置,直接把bind 127.0.0.1注釋了,導緻SpringBoot配置哨兵模式,無法連接配接到主節點,也就是無法連接配接到127.0.0.1:主節點端口 這個位址,手動把主節點一個個改了回來。
另外其餘兩台也是一樣的配置,這裡小編就不多說了。
3、啟動好三台機器
redis-server dtconfig/redis81.conf
redis-server dtconfig/redis82.conf
redis-server dtconfig/redis83.conf
3.1 選舉Leader
分别在6382和6383上面執行手動選舉,我們先先選舉一個Leader.
四、配置哨兵模式
4.1 建立sentinel.conf
也是在dtconfig建立sentinel.conf檔案如下:
# 預設端口
port 26379
# sentinel monitor 被監控的名稱 host port 1
sentinel monitor mymaster 192.168.31.6 6381 1
// 目前Sentinel節點監控 192.168.31.6:6381 這個主節點
// 1代表判斷主節點失敗至少需要1個Sentinel節點節點同意
// mymaster是主節點的别名
這裡小編就隻配置一台哨兵,作為開發測試。
4.2 啟動哨兵
cd 到Redis的安裝目錄bin目錄下執行如下指令:
redis-sentinel dtconfig/sentinel.conf
4.3 檢視程序是否都正常
4.4 自動選舉Leader
手動使得6381主節點當機:
redis-cli -p 6381
SHUTDOWN
exit
檢視監控資訊:
自動選舉6382為主節點,檢視資訊:
INFO replication
然後重新開機6381節點:
五、SpringBoot內建Redis哨兵
5.1 導入依賴包
<!--redis依賴包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
5.2 application.yml
spring:
redis:
###################以下為redis單機模式配置###########################
#host: 192.168.31.6 # Redis伺服器位址
#port: 6382 # Redis伺服器連接配接端口
database: 0 # Redis資料庫索引(預設為0)
password: # Redis伺服器連接配接密碼(預設為空)
timeout: 3000 # 連接配接逾時時間(毫秒)
###################以下為redis哨兵增加的配置###########################
sentinel:
nodes: 192.168.31.6:26379
master: mymaster
lettuce: # Redis的Java驅動包,使用lettuce連接配接池
pool:
max-active: 200 # 連接配接池最大連接配接數(使用負值表示沒有限制)
max-wait: -1 # 連接配接池最大阻塞等待時間(使用負值表示沒有限制)
max-idle: 10 # 連接配接池中的最大空閑連接配接 (預設為8)
min-idle: 0 # 連接配接池中的最小空閑連接配接
注意:sentinel.nodes: 192.168.31.6:26379 這裡小編隻要一個哨兵,如果是多個哨兵,後面配置以逗号分隔即可。
5.3 測試類
@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
* set值測試
*/
@Test
public void testSetKey(){
stringRedisTemplate.opsForValue().set("dt1","1");
System.out.println(redisUtil.get("dt1"));
}
5.4 檢視結果
5.5 問題抛出說明
當我們把主節點當機之後,哨兵會自動選舉,超過一定的投票數量,會選舉出新的Leader。是以我們使用SpringBoot操作Redis哨兵模式,隻需要Redis Sentinel 的基本參數配置:
sentinel:
nodes: 192.168.31.6:26379
master: mymaster
即可自動切換主節點,進行資訊寫入,這個過程,使用者是無感覺的。這裡抛出一個面試題。
在使用SpringBoot內建Redis哨兵模式,是怎麼識别主節點ip,進行資料寫入的?
後面的篇章我們會仔細講解(歡迎小夥伴們下方評論)。
另外:比如一個從節點當機了,此時主節點正在寫資料,下次從節點上線之後,還能收到之前主節點的寫入的資訊嗎?
答案:是的,當從節點複活以後,主節點會把資訊同步給它。
總結
主節點master可讀可寫,從節點slave隻能讀;主節點将讀的操作交給了從節點,變向的提高了自己寫的能力。哨兵模式提高了Redis的高可用,還有很多很多的實作值得我們去深究,基于哨兵模式,後面小編将會寫關于Redission分布式鎖的實作,以及消息釋出訂閱,分布式事務實作等等,期待!!!
完結!!!
喜歡的小夥伴點個贊,另外需要讨論,交流,學習技術,希望加入群一起學習,QQ:176251012。