天天看點

企業級開發SpringBoot內建Redis哨兵模式(全網最新)前言一、Redis哨兵模式二、哨兵模式配置三、配置主從複制叢集四、配置哨兵模式五、SpringBoot內建Redis哨兵總結

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哨兵模式

企業級開發SpringBoot內建Redis哨兵模式(全網最新)前言一、Redis哨兵模式二、哨兵模式配置三、配置主從複制叢集四、配置哨兵模式五、SpringBoot內建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
           
企業級開發SpringBoot內建Redis哨兵模式(全網最新)前言一、Redis哨兵模式二、哨兵模式配置三、配置主從複制叢集四、配置哨兵模式五、SpringBoot內建Redis哨兵總結

4.3 檢視程序是否都正常

企業級開發SpringBoot內建Redis哨兵模式(全網最新)前言一、Redis哨兵模式二、哨兵模式配置三、配置主從複制叢集四、配置哨兵模式五、SpringBoot內建Redis哨兵總結

4.4 自動選舉Leader

手動使得6381主節點當機:

redis-cli -p 6381
SHUTDOWN
exit
           

檢視監控資訊:

企業級開發SpringBoot內建Redis哨兵模式(全網最新)前言一、Redis哨兵模式二、哨兵模式配置三、配置主從複制叢集四、配置哨兵模式五、SpringBoot內建Redis哨兵總結

自動選舉6382為主節點,檢視資訊:

INFO replication
           
企業級開發SpringBoot內建Redis哨兵模式(全網最新)前言一、Redis哨兵模式二、哨兵模式配置三、配置主從複制叢集四、配置哨兵模式五、SpringBoot內建Redis哨兵總結

然後重新開機6381節點:

企業級開發SpringBoot內建Redis哨兵模式(全網最新)前言一、Redis哨兵模式二、哨兵模式配置三、配置主從複制叢集四、配置哨兵模式五、SpringBoot內建Redis哨兵總結

五、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 檢視結果

企業級開發SpringBoot內建Redis哨兵模式(全網最新)前言一、Redis哨兵模式二、哨兵模式配置三、配置主從複制叢集四、配置哨兵模式五、SpringBoot內建Redis哨兵總結
企業級開發SpringBoot內建Redis哨兵模式(全網最新)前言一、Redis哨兵模式二、哨兵模式配置三、配置主從複制叢集四、配置哨兵模式五、SpringBoot內建Redis哨兵總結

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。