1. 程式人生 > 資料庫 >Spring Boot整合Redis配置主從哨兵

Spring Boot整合Redis配置主從哨兵

上篇文章介紹了windows redis安裝及在springboot中的基礎整合()

本篇文章將在上篇文章基礎上進行擴充套件

大致架構如下圖所示

 Redis Windows

百度雲盤:

提取碼:s2cu

下載完成後右鍵解壓到自定義資料夾

RedisDesktopManager 

百度雲盤:

提取碼:mqj6 

 下載完成後雙擊開啟一路下一步安裝

啟動

win + r

輸入"cmd"回車

切換至redis安裝目錄(本例是"D:\Program Files\Redis-x64-3.2.100")

輸入"redis-server redis.windows.conf"回車

主從配置

複製

以下是關於 Redis 複製功能的幾個重要方面:

  • Redis 使用非同步複製。 從 Redis 2.8 開始, 從伺服器會以每秒一次的頻率向主伺服器報告複製流(replication stream)的處理進度。

  • 一個主伺服器可以有多個從伺服器。

  • 不僅主伺服器可以有從伺服器, 從伺服器也可以有自己的從伺服器, 多個從伺服器之間可以構成一個圖狀結構。

  • 複製功能不會阻塞主伺服器: 即使有一個或多個從伺服器正在進行初次同步, 主伺服器也可以繼續處理命令請求。

  • 複製功能也不會阻塞從伺服器: 只要在 redis.conf 檔案中進行了相應的設定, 即使從伺服器正在進行初次同步, 伺服器也可以使用舊版本的資料集來處理命令查詢。

    不過, 在從伺服器刪除舊版本資料集並載入新版本資料集的那段時間內, 連線請求會被阻塞。

    你還可以配置從伺服器, 讓它在與主伺服器之間的連線斷開時, 向客戶端傳送一個錯誤。

  • 複製功能可以單純地用於資料冗餘(data redundancy), 也可以通過讓多個從伺服器處理只讀命令請求來提升擴充套件性(scalability): 比如說, 繁重的  命令可以交給附屬節點去執行。

  • 可以通過複製功能來讓主伺服器免於執行持久化操作: 只要關閉主伺服器的持久化功能, 然後由從伺服器去執行持久化操作即可。

複製功能的運作原理

無論是初次連線還是重新連線, 當建立一個從伺服器時, 從伺服器都將向主伺服器傳送一個  命令。

接到  命令的主伺服器將開始執行  , 並在儲存操作執行期間, 將所有新執行的寫入命令都儲存到一個緩衝區裡面。

當  執行完畢後, 主伺服器將執行儲存操作所得的 .rdb 檔案傳送給從伺服器, 從伺服器接收這個 .rdb 檔案, 並將檔案中的資料載入到記憶體中。

之後主伺服器會以 Redis 命令協議的格式, 將寫命令緩衝區中積累的所有內容都發送給從伺服器。

你可以通過 telnet 命令來親自驗證這個同步過程: 首先連上一個正在處理命令請求的 Redis 伺服器, 然後向它傳送  命令, 過一陣子, 你將看到 telnet 會話(session)接收到伺服器發來的大段資料(.rdb 檔案), 之後還會看到, 所有在伺服器執行過的寫命令, 都會重新發送到 telnet 會話來。

即使有多個從伺服器同時向主伺服器傳送  , 主伺服器也只需執行一次  命令, 就可以處理所有這些從伺服器的同步請求。

從伺服器可以在主從伺服器之間的連線斷開時進行自動重連, 在 Redis 2.8 版本之前, 斷線之後重連的從伺服器總要執行一次完整重同步(full resynchronization)操作, 但是從 Redis 2.8 版本開始, 從伺服器可以根據主伺服器的情況來選擇執行完整重同步還是部分重同步(partial resynchronization)。

配置 

配置一個從伺服器非常簡單, 只要在配置檔案中增加以下的這一行就可以了:

slaveof 192.168.1.1 6379

當然, 你需要將程式碼中的 192.168.1.1 和 6379 替換成你的主伺服器的 IP 和埠號。

另外一種方法是呼叫  命令, 輸入主伺服器的 IP 和埠, 然後同步就會開始:

127.0.0.1:6379> SLAVEOF 192.168.1.1 10086
OK

只讀伺服器 

從 Redis 2.6 開始, 從伺服器支援只讀模式, 並且該模式為從伺服器的預設模式。

只讀模式由 redis.conf 檔案中的 slave-read-only 選項控制, 也可以通過  命令來開啟或關閉這個模式。

只讀從伺服器會拒絕執行任何寫命令, 所以不會出現因為操作失誤而將資料不小心寫入到了從伺服器的情況。

即使從伺服器是隻讀的, DEBUG 和 CONFIG 等管理式命令仍然是可以使用的, 所以我們還是不應該將伺服器暴露給網際網路或者任何不可信網路。 不過, 使用 redis.conf 中的命令改名選項, 我們可以通過禁止執行某些命令來提升只讀從伺服器的安全性。

你可能會感到好奇, 既然從伺服器上的寫資料會被重同步資料覆蓋, 也可能在從伺服器重啟時丟失, 那麼為什麼要讓一個從伺服器變得可寫呢?

原因是, 一些不重要的臨時資料, 仍然是可以儲存在從伺服器上面的。 比如說, 客戶端可以在從伺服器上儲存主伺服器的可達性(reachability)資訊, 從而實現故障轉移(failover)策略。

以上資料來自

搭建

redis安裝目錄下(本例是"D:\Program Files\Redis-x64-3.2.100")新建

slave6380.conf

slave6381.conf

sentinel6379.conf

sentinel6380.conf

slave配置檔案以slave6380.conf為例

slave

1.修改port

2.修改slaveof

3.修改logfile(可選,名稱自定義)

 slave6381.conf中port為6381其他大致相同這裡就不一一介紹了

sentinel

以sentinel6379.conf為例

# 當前Sentinel服務執行的埠
port 26379
# 3s內mymaster無響應,則認為mymaster宕機了
# 如果10秒後,mysater仍沒啟動過來,則啟動failover
sentinel monitor master 127.0.0.1 6379 2
# 執行故障轉移時,最多有1個從伺服器同時對新的主伺服器進行同步
sentinel down-after-milliseconds master 3000
# 哨兵監聽需要密碼認證
# sentinel auth-pass master test@2017
# 執行緒守護
daemonize no
# 日誌路徑
logfile "sentinel26379.log"

sentinel6380.conf除了port和logfile不同其他配置相同

執行

啟動順序,先主後從

 

 

 啟動sentinel

命令:

redis-server sentinel6379.conf --sentinel

redis-server sentinel6380.conf --sentinel

 

 驗證:

redis-cli -p 26379

info

啟動RedisDesktopManager 連線127.0.0.1:6379

 

 

此時再去看sentinel6379.conf和sentinel6380.conf

 

整合哨兵

開啟上篇的專案yml中新增哨兵

server:
  port: 80
  servlet:
    contest-path: /

spring:
  application:
    name: springboot-redis
  redis:
    host: 127.0.0.1
    port: 6379
    username:
    password:
    #哨兵
    sentinel:
      master: master
      password:
      #哨兵節點
      nodes: 127.0.0.1:26379,127.0.0.1:26380
    #lettuce連線池
    lettuce:
      pool:
        # 連線池最大連線數(使用負值表示沒有限制)
        max-active: 32
        # 連線池最大阻塞等待時間(使用負值表示沒有限制)
        max-wait: 300
        # 連線池中的最大空閒連線
        max-idle: 16
        # 連線池中的最小空閒連線
        min-idle: 8
      database:
    connect-timeout: 10000

測試

###
POST http://localhost/set
Content-Type: application/x-www-form-urlencoded

key=admin&v=張三
POST http://localhost/set

HTTP/1.1 200 
Content-Type: application/json
Transfer-Encoding: chunked
Date: Thu, 26 Nov 2020 08:41:49 GMT
Keep-Alive: timeout=60
Connection: keep-alive

true

Response code: 200; Time: 443ms; Content length: 4 bytes

 將admin值改為李四再次執行 

此時關閉埠為6379主庫測試

 sentinel6379.log

 sentinel6380.log

slave6381.log

 slave6380.log

 

 可以看出,關閉主庫6379後sentinel6379偵測到master無響應後兩個哨兵則認為master出現宕機,等待後未恢復開始進行failover

此時執行get

###
GET http://localhost/get/admin
GET http://localhost/get/admin

HTTP/1.1 200 
Content-Type: text/plain;charset=UTF-8
Content-Length: 6
Date: Thu, 26 Nov 2020 09:16:55 GMT
Keep-Alive: timeout=60
Connection: keep-alive

李四

Response code: 200; Time: 33ms; Content length: 2 bytes

重新執行set將admin設定為張三

POST http://localhost/set

HTTP/1.1 200 
Content-Type: application/json
Transfer-Encoding: chunked
Date: Thu, 26 Nov 2020 09:20:24 GMT
Keep-Alive: timeout=60
Connection: keep-alive

true

Response code: 200; Time: 67ms; Content length: 4 bytes