Redis高可用主要有网络层面的keepalived,注册中心的zookeeper,这两种方案,这两种方案,第一种方案浪费掉了一台,第二种方案,工作成本相当高。本文介绍使用sentinel做redis高可用方案设计。

Redis Sentinel

Sentinel

sentinel是Redis官方为集群提供的高可用的解决方案,在实际项目中是使用sentinel做redis自动故障转移。同时也增加了监控消息的通知,这样客户端就可以根据消息类型去判断服务器的状态,做适配操作。

Sentinel功能列表

  1. Monitoring 这是Sentinel中持续检查集群中的master,slave状态,用于判断是否存活的。

  2. Notification 在发现redis死亡以后,执行的脚本。

  3. Automatic failover 故障转移脚本

  4. Configuration provider 保存可信赖的当前master地址。

Sentinel配置

Sentinel本质上是一个特殊模式下的redis服务器。通过不同配置区分提供服务。

sentinel.conf 配置

// [监控名称] [ip] [port] [多少sentinel同意才发生故障转移]
sentinel monitor mymaster 127.0.0.1 6379 2
// [监控名称] [Master多少毫秒后不回应ping命令,就认为master是主观下线状态]sentinel down-after-milliseconds mymaster 60000</pre>// [故障转移超时时间]sentinel failover-timeout mymaster 180000//[在执行故障转移时,最多可以有多少个从服务器同时对新的主服务器进行同步]sentinel parallel-syncs mymaster 1

启动命令

redis-sentinel sentinel.conf

启动后Sentinel会:

以10秒一次的频率,向被监视的master发送info命令,根据回复获取master当前信息。以1秒一次的频率,向所有redis服务器、包含sentinel在内发送PING命令,通过回复判断服务器是否在线。以2秒一次的频率,通过向所有被监视的master,slave服务器发送包含当前sentinel,master信息的消息。

故障转移三种消息接收方式

当Redis服务器发现故障以后,sentinel通过raft算法投票选举新的master,故障转移过程通过哨兵的api获取/订阅接收事件消息

脚本接收

即,代执行脚本

//当故障转移期间,可以指定一个“通知”脚本用来告知系统管理员,当前集群的情况。
//脚本被允许执行的最大时间为60秒,如果超时,脚本将会被终止(KILL)sentinel notification-script mymaster /var/redis/notify.sh
复制代码
//故障转移期之后,配置通知客户端的脚本.sentinel client-reconfig-script mymaster /var/redis/notifyReconfig.sh

客户端直接接收

使用发布订阅模式实现 Sentinel的故障转移消息通知使用的是Redis的发布订阅模式,即,在故障转移期间所有产生的事件信息,都会通过频道发布出去,例如我们加一台slave服务,sentinel监听到后会发布加slave消息到+slave频道上,客户端只需要订阅+slave频道即可接收到对应的消息。消息格式如下

[实例类型] [事件服务器名称] [服务器ip] [服务器端口] @[master名称] [ip] [端口]
<instance-type> <name> <ip> <port> @ <master-name> <master-ip> <master-port>

通知消息格式如下

*          //订阅类型, *即订阅所有事件消息。
-sdown     //消息类型
slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381

订阅消息格式

using (RedisSentinel rs = new RedisSentinel(CurrentNode.Host, CurrentNode.Port)){var redisPubSub = new RedisPubSub(node.Host, node.Port);redisPubSub.OnMessage += OnMessage;redisPubSub.OnSuccess += (msg) =>{};redisPubSub.OnUnSubscribe += (obj) =>{};redisPubSub.OnError = (exception) =>{ };redisPubSub.PSubscribe("*");}

服务间接收

这种方式在第二种基础上扩展了一层,应用不需要直接订阅sentinel,单独空余出服务去做,添加api来做。例如:应用端提供回调api,在api逻辑下刷新内存中的redis连接

http://127.0.0.1/redis/notify.api

监控到异常以后,进行调用

 httprequest.post("http://127.0.0/redis/notify.api");

整体设计

整体设计如下

小明菜市场

推荐阅读

● 实践 + 理论 | API 接口安全性设计

● 文末送书 | 数据分析简单入门

● 优雅 | 今天很水的文章-Excel导入导出

● 理论 | 当 Spring Boot 遇上了消息队列......

● 实践 | kafka 基本使用

巧用 | 低成本高可用,巧用Redis相关推荐

  1. E往无前 | 人人在用的微信支付,腾讯云大数据ES如何让它低成本高可用?

    <E往无前>系列将着重展现腾讯云ES在持续深入优化客户所关心的「省!快!稳!」诉求,能够在低成本的同时兼顾高可用.高性能.高稳定等特性,可以满足微盟.小红书.微信支付等内外部大客户的核心场 ...

  2. Redis低成本高可用方案设计

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:蘑菇先生 cnblogs.com/mushroom/p/45 ...

  3. Redis系列(四)-低成本高可用方案设计

    关于Redis高可用方案,看到较多的是keepalived.zookeeper方案. keepalived是主备模式,意味着总有一台浪费着.zookeeper工作量成本偏高. 本文主要介绍下使用官方s ...

  4. Redis高可用集群Redis Cluster搭建

    前言: Redis3.0版本之前,可以通过Redis Sentinel(哨兵)来实现高可用 ( HA ),从3.0版本之后,官方推出了Redis Cluster,它的主要用途是实现数据分片(Data ...

  5. redis高可用:keepalived+redis主从部署

    1 Redis高可用的可选方案 Redis的高可用方案目前主要5种方式. 1)  Redis Master-Slave + Keepalived + VIP. 这是很经典的db架构,也可以用与mysq ...

  6. 实践 | Centos 7搭建LVS+Keepalived高可用Web服务群集群

    LVS + Keepalived 高可用集群 Keepalived的设计目标是构建高可用的LVS负载均衡的集群,可以调用ipvsadm工具创建虚拟机,不仅仅用作双机热备,还可以使用keepalived ...

  7. redis详解(四)-- 高可用分布式集群

    一,高可用 高可用(High Availability),是当一台服务器停止服务后,对于业务及用户毫无影响. 停止服务的原因可能由于网卡.路由器.机房.CPU负载过高.内存溢出.自然灾害等不可预期的原 ...

  8. Redis高可用分布式内部交流(九)

    这是上月在公司内部的一次分享,现把PPT及交流内容整理成博客. 阅读目录: 高可用 数据同步 分布式 分布式集群时代 总结 高可用 高可用(High Availability),是当一台服务器停止服务 ...

  9. 如何搭建高可用redis架构?

    作者:温国兵,曾任职于酷狗音乐,现为三七互娱 DBA.目前主要关注领域:数据库自动化运维.高可用架构设计.数据库安全.海量数据解决方案.以及开源技术在互联网中的应用 1 题记 Redis 是一个开源的 ...

最新文章

  1. Debian/Ubuntu/Raspbian 时间同步
  2. iOS Bluetooth(蓝牙)
  3. 【C 语言】字符串拷贝 ( 字符串拷贝业务逻辑代码 | 分离 主函数 与 字符串拷贝 业务模型 )
  4. Silverlight WCF 初尝小结
  5. Ajax-简单的HelloWorld实例,使用了XMLHttpRequest(two)
  6. {}是set类型还是dict类型呢
  7. JAVA8之lambda表达式
  8. python代码颜色不同_python – 两个不同颜色的颜色在同一个imshow matplotlib
  9. Spring 使用Cache(转)
  10. 互联网架构:屡试不爽的架构三马车
  11. Web Worker API
  12. JSP编程,url中加斜杠和不加斜杠的区别
  13. python抓包库_python抓包_python 抓包_python 抓包库 - 云+社区 - 腾讯云
  14. 设计模式的原则和分类 思想模型
  15. WEB - 使用CSS 画一个正方体
  16. 名片管理系统python详解_取名字大全_免费男孩女孩起名字
  17. 笔记本电脑已连接WIFI密码查看方法
  18. Photoshop教程四:Camera RAW 批量调色
  19. 蓝桥杯—奇妙的数字(小明发现了一个奇妙的数字)
  20. C# webBrowser 通过代理访问网页

热门文章

  1. VBA调用DOS程序两种方法
  2. eclipse package explorer视图中怎么让default package不显示?
  3. GitHub上如何删除repository仓库
  4. Centos安装NFS服务器配置及挂载教程
  5. [CTO札记]谁在使用SNS
  6. 统一建模语言UML轻松入门(1)――基本概念
  7. 分布式缓存原理——一致性hash算法(hash环)、Hash槽
  8. 地府后台管理系统30.已经在开发中,介绍下目前的工作进度和未来展望
  9. 通过MySQL自动同步刷新Redis
  10. linux按照mysql为何如此简单_手把手教你在Linux下安装MySQL