點選藍色“Dotnet Plus”關注我喲
加個“星标”,一周三更(07:30),幹貨推送!
前言
前面《Docker-Compose搭建Redis高可用哨兵叢集》,
我的思路是将Redis、Sentinel、Redis Client App連結到同一個網橋網絡,這個網橋内的Redis Client App就可以使用ContainerIP通路網橋内任意redis節點。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iZxMmMyMzN2ImM1QjNlJjN0MTMiJGZ1cTZilDOzcjZi9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
同一網橋網絡通路
規避了Docker上發生的NAT,端口映射的複雜性, 但實際上并不是最正常做法。
Redis Client App獨立組網遇到的問題
很多時候,Redis Client App與Redis-Sentinel獨立組網,這樣對Redis-Sentinel的通路就會涉及Docker主控端NAT轉換、Port映射。
(這裡我們就不提Docker Host模式搭建Redis-Sentinel了)
資料顯示 Sentinel,Docker或其他形式的網絡位址轉換或端口映射應謹慎混合,大意是說節點無法區分收到的資訊是否是已經發生Nat轉換或端口映射的結果。
為了解決Redis-Sentinel在Docker 環境下因為NAT,Forward Port導緻的無法正确獲知Slaves和正确故障轉移的問題。
Redis3.2之後可以
強制讓Slave聲明自己的(IP,Port);強制讓Sentinel聲明自己的(IP,Port)
# since Redis 3.2.2, to force a replica to announce an arbitrary pair of IP and port to the master. The two configurations directives to use are:
上述配置可以寫在Docker Command參數指定或通過Volume redis.conf 加載進redis容器
# you can use the following two Sentinel configuration directives in order to force Sentinel to announce a specific set of IP and port:
sentinel.conf的配置隻能通過Config加載進sentinel容器。
通過明牌方式通知所有互動對象,redis執行個體就是在這個(IP,Port)上發生了NAT轉換、Port映射。
C#兩大用戶端通路Redis-Sentinel的方式
歸根到底一張圖:
- Redis Client先詢問Sentinels,Sentinel傳回Master (IP,Port)
- Redis Client再與以上Master (IP,Port)建立連接配接
Docker部署Redis-Sentinel 并強制聲明IP、Port
這裡我們采用主動聲明方式在Docker上部署了Redis-Sentinel叢集, 1Master- 2 Slave- 3Sentinel, 分别占據主控端6380、6381、6382、 26379、26380、26381端口.
進入任意Sentinel節點,使用
sentinel master mymaster
确認叢集資訊
存在測試鍵值:testKey:hello Redis-sentinel!
StackExchange.Redis & CSRedisCore連接配接Redis哨兵
老牌StackExchange.Redis 今年才真正支援Sentinel, Github上有關Sentinel的Issue、PR曆時久遠,PR像便秘一樣最近才關閉。
https://github.com/StackExchange/StackExchange.Redis/pull/692#issuecomment-375298108
https://github.com/StackExchange/StackExchange.Redis/pull/1067
CSRedisCore得到真傳,很早就支援連接配接哨兵,而且程式設計寫法更簡單,清晰。
話不多說:
執行輸出:
StackExchange.Redis更能展現連接配接的實質過程:先查詢,再連接配接。
CSRedisCore 小白寫法,無感覺。
總結輸入
本文記錄兩個内容:
1. Redis-Sentinel在Docker環境因NAT,Forward_Port觸發的問題, 以及Redis官方給出的方案2. C# Redis用戶端連接配接Redis-Sentinel叢集 Gthub: https://github.com/zaozaoniao/Redis-sentinel-with-docker-compose本文純手寫+測試,期待你的回報。
- https://redis.io/topics/sentinel
- https://redis.io/topics/replication
往期回顧
使用Docker-Compose搭建高可用redis哨兵叢集
DotNetCore三大Redis用戶端對比和使用心得
打開CSRedisCore的姿勢錯誤,自己挖坑自己填
AspNetCore結合Redis實踐消息隊列