天天看點

docker部署redis叢集_C#兩大知名Redis用戶端連接配接哨兵叢集的姿勢

點選藍色“Dotnet Plus”關注我喲

加個“星标”,一周三更(07:30),幹貨推送!

前言

前面《Docker-Compose搭建Redis高可用哨兵叢集》,

我的思路是将Redis、Sentinel、Redis Client App連結到同一個網橋網絡,這個網橋内的Redis Client App就可以使用ContainerIP通路網橋内任意redis節點。

docker部署redis叢集_C#兩大知名Redis用戶端連接配接哨兵叢集的姿勢

同一網橋網絡通路

規避了Docker上發生的NAT,端口映射的複雜性,  但實際上并不是最正常做法。

Redis Client App獨立組網遇到的問題

很多時候,Redis Client App與Redis-Sentinel獨立組網,這樣對Redis-Sentinel的通路就會涉及Docker主控端NAT轉換、Port映射。

(這裡我們就不提Docker Host模式搭建Redis-Sentinel了)

docker部署redis叢集_C#兩大知名Redis用戶端連接配接哨兵叢集的姿勢
資料顯示 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的方式

歸根到底一張圖:

docker部署redis叢集_C#兩大知名Redis用戶端連接配接哨兵叢集的姿勢
  1. Redis Client先詢問Sentinels,Sentinel傳回Master (IP,Port)
  2. 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

确認叢集資訊

docker部署redis叢集_C#兩大知名Redis用戶端連接配接哨兵叢集的姿勢

存在測試鍵值: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得到真傳,很早就支援連接配接哨兵,而且程式設計寫法更簡單,清晰。

話不多說:

執行輸出:

docker部署redis叢集_C#兩大知名Redis用戶端連接配接哨兵叢集的姿勢

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實踐消息隊列

docker部署redis叢集_C#兩大知名Redis用戶端連接配接哨兵叢集的姿勢