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
設定一個值入去,就可以查到。