前言

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

我们的思路是将Redis、Sentinel、Redis Client App链接到同一个网桥网络,这个网桥内的Redis Client App就可以使用ContainerIP访问网桥内任意redis节点。

同一网桥网络访问规避了Docker上发生的NAT,端口映射的复杂性, 但实际上并不是最常规的做法(今天咱们也不说Docker host形式部署Redis-Sentinel了)。

Redis Client App独立组网遇到的问题

很多时候,Redis-Sentinel与Redis Client App独立组网,涉及Docker宿主机NAT转换和 Port映射。

Sentinel,Docker或其他形式的网络地址转换或端口映射应谨慎混合。

我实际测试发现,如果将前文Sentinel.conf中Master(ContainerIP,Port) 换成(宿主机IP,映射Port),

确实会引起混乱,无法找到正确的Slaves, 无法正常故障转移。

为了解决Redis-Sentinel在Docker环境下因为NAT,Forward Port导致的无法正确获知Slaves和正确故障转移的问题。

Redis3.2之后可以强制让Slave声明自己的(IP,Port);强制让Sentinel声明自己的(IP,Port)

  1. # 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:
  2. replica-announce-ip <ip>
  3. replica-announce-port <port>

上述配置可以写在Docker Command参数指定或通过Volume redis.conf 加载进redis容器

  1. # you can use the following two Sentinel configuration directives in order to force Sentinel to announce a specific set of IP and port:
  2. sentinel announce-ip <ip>
  3. sentinel announce-port <port>

sentinel.conf的配置只能通过Config加载进sentinel容器。

通过明牌方式通知 所有交互对象,redis实例就是在这个(IP,Port)上发生了NAT转化,Port映射,上述搭建Docker搭建Redis-sentinel才是常规实践。

C#两大客户端访问Redis-Sentinel的方式

归根到底一张图:

  1. Redis Client先询问Sentinels,Sentinel返回Master (IP,Port)
  2. Redis Client再与以上Master (IP,Port)建立连接

Redis-Sentinel

这里我们采用Docker-compose在单机上部署了Redis-Sentinel集群,

1Master- 2 Slave- 3Sentinel,

分别占据宿主机6380、6381、6382、 26379、26380、26381端口.

  1. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  2. 484da8d832f1 redis "docker-entrypoint.s…" 2 hours ago Up 2 hours 6379/tcp, 0.0.0.0:26380->26379/tcp redis-sentinel-2
  3. 50599c15adba redis "docker-entrypoint.s…" 2 hours ago Up 2 hours 6379/tcp, 0.0.0.0:26379->26379/tcp redis-sentinel-1
  4. 51ce90cc52d7 redis "docker-entrypoint.s…" 2 hours ago Up 2 hours 6379/tcp, 0.0.0.0:26381->26379/tcp redis-sentinel-3
  5. d58d6973de28 redis "docker-entrypoint.s…" 2 hours ago Up 2 hours 0.0.0.0:6381->6379/tcp redis-slave-1
  6. b88bd85ac109 redis "docker-entrypoint.s…" 2 hours ago Up 8 seconds 0.0.0.0:6382->6379/tcp redis-slave-2
  7. 3dc26c01a90d redis "docker-entrypoint.s…" 2 hours ago Up About an hour 0.0.0.0:6380->6379/tcp redis-master

进入任意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得到真传,很早就支持了,而且编程写法更简单,清晰。

话不多说:

  1. using StackExchange.Redis;
  2. using System;
  3. namespace ConsoleApp
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. var sw = new Stopwatch();
  10. sw.Start();
  11. UseStackExchangeRedis();
  12. sw.Stop();
  13. Console.WriteLine("连接+查询测试key,耗时"+sw.ElapsedMilliseconds);
  14. sw.Reset();
  15. sw.Start();
  16. UseCSRedisCore();
  17. sw.Stop();
  18. Console.WriteLine("连接+查询测试key,耗时" + sw.ElapsedMilliseconds);
  19. Console.ReadKey();
  20. }
  21. // StackExchange.Reids连接Redis-Sentinel
  22. public static void UseStackExchangeRedis()
  23. {
  24. ConfigurationOptions sentinelOptions = new ConfigurationOptions();
  25. sentinelOptions.EndPoints.Add("180.76.*.*", 26379);
  26. sentinelOptions.EndPoints.Add("180.76.*.*", 26380);
  27. sentinelOptions.EndPoints.Add("180.76.*.*", 26381);
  28. sentinelOptions.TieBreaker = "";
  29. sentinelOptions.CommandMap = CommandMap.Sentinel;
  30. sentinelOptions.AbortOnConnectFail = false;
  31. // Connect!
  32. ConnectionMultiplexer sentinelConnection = ConnectionMultiplexer.Connect(sentinelOptions);
  33. // Get a connection to the master
  34. ConfigurationOptions redisServiceOptions = new ConfigurationOptions();
  35. redisServiceOptions.ServiceName = "mymaster1"; //master名称
  36. redisServiceOptions.Password = "redis_pwd"; //master访问密码
  37. redisServiceOptions.AbortOnConnectFail = true;
  38. ConnectionMultiplexer masterConnection = sentinelConnection.GetSentinelMasterConnection(redisServiceOptions);
  39. var db = masterConnection.GetDatabase();
  40. var value= db.StringGet("testKey");
  41. Console.WriteLine($"[Use StackExchange-Redis] The remote redis-sentinel test key value:{value}");
  42. }
  43. // CSRedisCore连接Redis-Sentinel
  44. public static void UseCSRedisCore()
  45. {
  46. var csredis = new CSRedis.CSRedisClient("mymaster1,password=redis_pwd",
  47. new[] { "180.76.*.*:26379", "180.76.*.*:26380", "180.76.*.*:26381" });
  48. var value = csredis.Get("testKey");
  49. Console.WriteLine($"[Use CSRedisCore] The remote redis-sentinel test key value:{value}");
  50. }
  51. }
  52. }

执行输出:

本文长话短说,快速介绍两块C#常见的Redis客户端连接Redis哨兵集群的方式,各有千秋。

StackExchange.Redis更能体现连接的实质过程: 先查询,再连接。

CSRedisCore 小白写法,无感知。

Github地址:https://github.com/zaozaoniao/Redis-sentinel-with-docker-compose

总结输入

本文记录两个内容:

  1. Redis-Sentinel在Docker环境因NAT,Forward_Port触发的问题, 以及Redis官方给出的方案
  2. C#两个Redis客户端如何感知Redis-Sentinel的Master查询节点

C#两大知名Redis客户端连接哨兵集群的姿势的更多相关文章

  1. 阿里云ECS部署Redis主备哨兵集群遇到的问题

    一.部署 详细部署步骤:https://blog.csdn.net/lihongtai/article/details/82826809 Redis5.0版本需要注意的参数配置:https://www ...

  2. redis系列--深入哨兵集群

    一.前言 在之前的系列文章中介绍了redis的入门.持久化以及复制功能,如果不了解请移步至redis系列进行阅读,当然我也是抱着学习的知识分享,如果有什么问题欢迎指正,也欢迎大家转载.而本次将介绍哨兵 ...

  3. Redis集合 安装 哨兵集群 配置

    redis相关 redis基础 redis发布订阅 redis持久化RDB与AOF redis不重启,切换RDB备份到AOF备份 redis安全配置 redis主从同步 redis哨兵集群 redis ...

  4. 客户端连接Codis集群

    新建maven webapp项目 添加相关依赖: <dependency> <groupId>redis.clients</groupId> <artifac ...

  5. Java客户端连接kafka集群报错

    往kafka集群发送消息时,报错如下: page_visits-1: 30005 ms has passed since batch creation plus linger time 加入log4j ...

  6. SpringCloud之客户端连接Eureka集群

    客户端分别yml: ###服务启动端口号 server: port: 8002 ###服务名称(服务注册到eureka名称) spring: application: name: app-toov5- ...

  7. Redis Sentinel哨兵集群

    Redis Sentinel(哨兵集群)是一种高可用的redis部署方案.在集群中的redis-master服务挂掉时,无需人为干预,即可通过哨兵集群的自我调整,实现redis服务的持续可用. 哨兵集 ...

  8. redis基础之redis-cluster(集群)(七)

    前言 redis的主流高可用集群模式为redis-cluster.从redis3.0+版本后开始支持,自带集群管理工具redis-trib.rb. 安装redis 参考:https://www.cnb ...

  9. docker搭建redis主从集群和sentinel哨兵集群,springboot客户端连接

    花了两天搭建redis主从集群和sentinel哨兵集群,讲一下springboot客户端连接测试情况 redis主从集群 从网上查看说是有两种方式:一种是指定配置文件,一种是不指定配置文件 引用地址 ...

随机推荐

  1. IPFS(星际文件系统)-初步接触

    〇.IPFS介绍 从HTTP到IPFS,星际文件系统能变革信息传播的方式吗? 戴嘉乐:详解IPFS的本质.技术架构以及应用 以下为实现相关摘要 1.存储 在IPFS中,信息可以存储进IPFS系统中的块 ...

  2. 微信小程序修改request合法域名不生效及解决方法

    在小程序微信公众平台修改后请求,依然在console中显示修改前的域名. 解决:在小程序开发者工具中点击“详情”后点击“域名信息”,就会自动刷新

  3. Openstack计算Nova组件

    欢迎来到虚拟机的世界,如果我们将Openstack环境里运行在各个无力节点上的各种服务看座生命体,而不是死的指令集合,那么就是一个虚拟机的世界. Openstack的计算组件,也就是Nova项目实现了 ...

  4. maven如何安装oracle驱动jdbc的jar包

    一.因为oracle驱动的压缩包在maven官网上并没有提供,所以需要自己去手动下载. 二.下载安装步骤如下: (1)第一步:找到你本地的oracle驱动包所在位置: (2)在cmd中打开jar包所在 ...

  5. Spring Cloud 系列之 Alibaba Sentinel 服务哨兵

    前文中我们提到 Netflix 中多项开源产品已进入维护阶段,不再开发新的版本,就目前来看是没有什么问题的.但是从长远角度出发,我们还是需要考虑是否有可替代产品使用.比如本文中要介绍的 Alibaba ...

  6. 用c写的简单的日历(学习模块划分)

    简单日历 ​ 主要目的是学习函数模块划分,成品大概是这样,加了一些花里胡哨的东西(/▽\) ​ 分三个模块,主函数.c 显示.c 计算.c 与.h 文件 有两种实现方式,区别在于是否以数组在模块之间传 ...

  7. xmake v2.3.2 发布, 带来和ninja一样快的构建速度

    这个版本重点重构优化了下内部并行构建机制,实现多个target间源文件的并行编译,以及并行link的支持,同时优化了xmake的一些内部损耗,修复影响编译速度的一些bug. 通过测试对比,目前的整体构 ...

  8. dapp 是什么?dapp 和 app 有什么区别?一文明白 dapp。

    DApp 是 decentralized application 中文分布式 APP 的缩写. 一个 DApp 有后台代码运行在分布式点对点网络中.传统的 APP 的后台代码是运行在中心化的服务器. ...

  9. coding++:java-全局异常处理

    本次使用工具:SpringBoot   <version>1.5.19.RELEASE</version> Code: AbstractException: package m ...

  10. Linux下的ngnix安装与启动

     Linux安装Nginx 1.安装gcc gcc-c++(如新环境,未安装请先安装)$ yum install -y gcc gcc-c++2.安装wget$ yum -y install wget ...