首頁>技術>

redis的主從模式,如果主機掛掉,要手動切換及修改連結,這種操作在生產環境上基本是不可能,一般都會中斷服務,然後再透過重啟來完成。但在redis 2.8之後可以用哨兵模式來解決這個問題。

哨兵網路圖

一、哨兵模式簡介

sentinel是redis高可用的解決方案,sentinel系統(N個sentinel例項,N >= 1)可以監視一個或者多個redis master服務,以及這些master服務的所有從服務;當某個master服務下線時,自動將該master下的某個從服務升級為master服務替代已下線的master服務繼續處理請求。

sentine哨兵l本質上是一個特殊的redis服務,所以初始化的時候跟redis服務初始化差不多,不過有幾點不一樣;首先sentinel不會載入RDB或者AOF檔案,因為sentinel根本不使用資料庫,其次,sentinel不能使用資料庫鍵值對方面的命令,例如set、del、flushdb等等,同時,sentinel也不能使用事務、指令碼、RDB或者AOF持久化命令,最後,複製命令,釋出與訂閱命令,檔案事件處理器,時間事件處理器等只能在sentinel內部使用。

二、哨兵模式提供主要功能

Redis 的 Sentinel 的最小配置是一主一從。Sentinel 的主要功能包括主節點存活檢測、主從執行情況檢測、自動故障轉移 (failover)、主從切換。

1、監控

Sentinel 會不斷的檢查 主伺服器 和 從伺服器 是否正常執行。

2、通知

當被監控的某個 Redis 伺服器出現問題,Sentinel 透過 API 指令碼 向 管理員 或者其他的 應用程式 傳送通知。

3、自動故障轉移

當 主節點 不能正常工作時,Sentinel 會開始一次 自動的 故障轉移操作,它會將與 失效主節點 是 主從關係 的其中一個 從節點 升級為新的 主節點,並且將其他的 從節點 指向 新的主節點。

4、配置提供者

在 Redis Sentinel 模式下,客戶端應用 在初始化時連線的是 Sentinel 節點集合,從中獲取 主節點 的資訊。

三、docker部署圖

我們在測試的時候,將進行3個sentinel和3個redis例項,redis例項為1主2從。

部署例項

具體部署成功後,如下圖所示:

部署完成後例項

四、docker部署過程

1、環境準備

在主機上安裝好docker,本例項機器ip為:192.168.197.24,redis的版本為:3.2

各redis的ip和埠如下:

redis主節點:p:6379

redis從節點:ip:6380,ip:6381

sentinel:ip:26379,ip:26380,ip:26381

2、部署主從redis

如果網絡卡不存在先建立網絡卡 docker network create --gateway 172.18.0.1 --subnet 172.18.0.0/16 host (host一般會存在)

執行下面命令建立redis例項:

docker run --name redis6379 --net=host -v $PWD/data6379:/data -d redis:3.2 redis-server --port 6379docker run --name redis6380 --net=host -v $PWD/data6380:/data -d redis:3.2 redis-server --slaveof 192.168.197.24 6379 --port 6380docker run --name redis6381 --net=host -v $PWD/data6381:/data -d redis:3.2 redis-server --slaveof 192.168.197.24 6379 --port 6381

3、執行命名檢視redis 同步情況

docker logs redis6379docker logs redis6380docker logs redis6381

日誌

4、部署sentinel

新建檔案 sentinel-26379.conf、sentinel-26380.conf、sentinel-26381.conf

protected-mode nobind 0.0.0.0port 26379daemonize yessentinel monitor mymaster 192.168.2.139 6379 2sentinel down-after-milliseconds mymaster 5000sentinel failover-timeout mymaster 180000sentinel parallel-syncs mymaster 1logfile ""
protected-mode nobind 0.0.0.0port 26380daemonize yessentinel monitor mymaster 192.168.2.139 6379 2sentinel down-after-milliseconds mymaster 5000sentinel failover-timeout mymaster 180000sentinel parallel-syncs mymaster 1logfile ""
protected-mode nobind 0.0.0.0port 26381daemonize yessentinel monitor mymaster 192.168.2.139 6379 2sentinel down-after-milliseconds mymaster 5000sentinel failover-timeout mymaster 180000sentinel parallel-syncs mymaster 1logfile ""

如下:

sentinel配置檔案

5、啟動3臺sentinel命令:

sentinel1

先:sudo docker run -it --name sentinel-26379 --net=host -v $PWD/sentinel-26379.conf:/usr/local/etc/redis/sentinel.conf -d redis:3.2 /bin/bash 再:sudo docker exec -it sentinel-26379 /bin/bash最後在容器裡看設定:redis-sentinel /usr/local/etc/redis/sentinel.conf 

sentinel2

先:sudo docker run -it --name sentinel-26380 --net=host -v $PWD/sentinel-26380.conf:/usr/local/etc/redis/sentinel.conf -d redis:3.2 /bin/bash 再:sudo docker exec -it sentinel-26380 /bin/bash最後在容器裡看設定:redis-sentinel /usr/local/etc/redis/sentinel.conf 

sentinel3

先:sudo docker run -it --name sentinel-26381 --net=host -v $PWD/sentinel-26381.conf:/usr/local/etc/redis/sentinel.conf -d redis:3.2 /bin/bash 再:sudo docker exec -it sentinel-26381 /bin/bash最後在容器裡看設定:redis-sentinel /usr/local/etc/redis/sentinel.conf 

6、sentenel會根據master的資料自動把其他salve和sentenel找出來寫到自己的配置檔案

檢視配置檔案cat sentinel-26379.conf

sentinel會自動找到配置

發現配置檔案多了東西。

五、springboot配置及執行

1、新建springboot專案xml為:

spring.redis.sentinel.master=mymasterspring.redis.sentinel.nodes=192.168.197.24:26379,192.168.197.24:26380,192.168.197.24:26381

3、建立類用於訪問

@RequestMapping@RestControllerpublic class Controller {    @Autowired    private StringRedisTemplate stringRedisTemplate;    @GetMapping("getkey")    public String getkey(String key){        String result = stringRedisTemplate.opsForValue().get(key);        return result;    }}

4、具體的程式碼目錄為

springboot專案程式碼

六、測試及演練

啟動springboot專案,即可以訪問:http://localhost:8080/getkey?key=aa

設定一個值入去,就可以查到。

24
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 複雜性應對之道 - 領域建模(一)