天天看点

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客户端连接哨兵集群的姿势