点击上方“方志朋”,选择“设为星标”

回复”666“获取新整理的面试文章

作者:蘑菇先生

cnblogs.com/mushroom/p/4526912.html

关于Redis高可用方案,看到较多的是keepalived、zookeeper方案。keepalived是主备模式,意味着总有一台浪费着。zookeeper工作量成本偏高。

本文主要介绍下使用官方sentinel做redis高可用方案的设计。

阅读目录:

  1. Redis Sentinel

  2. 故障转移消息接收的3种方式

  3. 整体流程图

  4. 总结

Redis Sentinel

Sentinel介绍

Sentinel是Redis官方为集群提供的高可用解决方案。在实际项目中可以使用sentinel去做redis自动故障转移,减少人工介入的工作量。另外sentinel也给客户端提供了监控消息的通知,这样客户端就可根据消息类型去判断服务器的状态,去做对应的适配操作。

下面是Sentinel主要功能列表:

  • Monitoring:Sentinel持续检查集群中的master、slave状态,判断是否存活。

  • Notification:在发现某个redis实例死的情况下,Sentinel能通过API通知系统管理员或其他程序脚本。

  • Automatic failover:如果一个master挂掉后,sentinel立马启动故障转移,把某个slave提升为master。其他的slave重新配置指向新master。

  • Configuration provider:对于客户端来说sentinel通知是有效可信赖的。客户端会连接sentinel去请求当前master的地址,一旦发生故障sentinel会提供新地址给客户端。

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
// [故障转移超时时间]
sentinel failover-timeout mymaster 180000
//[在执行故障转移时,最多可以有多少个从服务器同时对新的主服务器进行同步]
sentinel parallel-syncs mymaster 1

sentinel需要使用redis2.8版本以上,启动如下:

redis-sentinel sentinel.conf

启动后Sentinel会:

  • 以10秒一次的频率,向被监视的master发送info命令,根据回复获取master当前信息。

  • 以1秒一次的频率,向所有redis服务器、包含sentinel在内发送PING命令,通过回复判断服务器是否在线。

  • 以2秒一次的频率,通过向所有被监视的master,slave服务器发送包含当前sentinel,master信息的消息。

另外建议sentinel至少起3个实例以上,并配置2个实例同意即可发生转移。5个实例,配置3个实例同意以此类推。

故障转移消息接收的3种方式

Redis服务器一旦发送故障后,sentinel通过raft算法投票选举新master。故障转移过程可以通过sentinel的API获取/订阅接收事件消息。

搜索Java知音公众号,回复“后端面试”,送你一份Java面试题宝典.pdf

脚本接收

  • 当故障转移期间,可以指定一个“通知”脚本用来告知系统管理员,当前集群的情况。

  • 脚本被允许执行的最大时间为60秒,如果超时,脚本将会被终止(KILL)

sentinel notification-script mymaster /var/redis/notify.sh
  • 故障转移期之后,配置通知客户端的脚本.

sentinel client-reconfig-script mymaster /var/redis/notifyReconfig.sh

客户端直接接收

Sentinel的故障转移消息通知使用的是redis发布订阅。就是说在故障转移期间所有产生的事件信息,都通过频道(channel)发布出去。比如我们加台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供这个服务回调通知。这样做的好处在于:

  • 减少应用端监听失败出错的可能性。

  • 应用端由主动方变成被动方,降低耦合。

  • 性能提高,轮询变回调。

  • 独立成服务可扩展性更高。

比如:

1:以后换掉sentinel,我们只需要动服务即可,应用端无需更改。

2:可以在服务内多增加一层守护线程去主动拉取redis状态,这样可确保即使sentinel不生效,也能及时察觉redis状态,并通知到应用端。当然这种情况很极端,因为sentinel配的也是多节点,同时挂的几率非常小。

示例:

应用端提供回调API,在这个API逻辑下去刷新内存中的Redis连接。

http://127.0.0.1/redis/notify.api

独立服务监控到状况后,调用API通知应用端:

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

整体设计

推荐使用第三种,其整体流程图如下:

总结

各种sentinel通知消息类型见官方文档,项目中使用的redis客户端在github上

https://github.com/mushroomsir/HRedis

本文分享了楼主在项目中做Redis高可用的经验,希望对大家有所帮助。在人力物力满足的情况下还是推荐使用zookeeper方案的。只有三五杆枪的情况下也就退而求其次,利用最小成本满足需求并保留可扩展性。

相信没有最好的架构,只有更合适的架构。

  • http://redis.io/topics/sentinel

热门内容:为什么程序员都不喜欢使用 switch ,而是大量的 if……else if ?
终于有人把 Docker 讲清楚了,别再说不会 Docker 了!程序员接私活完整攻略+赠开源管理系统
Docker 部署SpringBoot项目不香吗?为什么 Java 中“1000==1000”为false,而”100==100“为true?最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)

Redis低成本高可用方案设计相关推荐

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

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

  2. 巧用 | 低成本高可用,巧用Redis

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

  3. Redis创建高可用集群教程【Windows环境】

    模仿的过程中,加入自己的思考和理解,也会有进步和收获. 在这个互联网时代,在高并发和高流量可能随时爆发的情况下,单机版的系统或者单机版的应用已经无法生存,越来越多的应用开始支持集群,支持分布式部署了. ...

  4. 基于keepalived对redis做高可用配置---转载

    关于keepalived的详细介绍,请移步本人相关博客:http://wangfeng7399.blog.51cto.com/3518031/1405785 功能 ip地址 安装软件 主redis 1 ...

  5. Redis|Sentinel 高可用架构

    一 前言 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端 ...

  6. Redis Cluster高可用(HA)集群环境搭建详细步骤

    1.为什么要有集群 由于Redis主从复制架构每个数据库都要保存整个集群中的所有数据,容易形成木桶效应,所以Redis3.0之后的版本添加特性就是集群(Cluster) 2.Redis集群架构说明 架 ...

  7. Redis Sentinel安装与部署,实现redis的高可用

    Redis Sentinel安装与部署,实现redis的高可用 原文:Redis Sentinel安装与部署,实现redis的高可用 前言 对于生产环境,高可用是避免不了要面对的问题,无论什么环境.服 ...

  8. Redis进阶高可用之哨兵

    目录 一.作用与架构 1.  作用 2.  架构 二.部署 1.  部署主从节点 2.  部署哨兵节点 3.  总结 三.客户端访问哨兵系统 1.  代码示例 2.  客户端原理 3.  总结 四.基 ...

  9. Redis的高可用详解:Redis哨兵、复制、集群的设计原理,以及区别

    谈到Redis服务器的高可用,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制. 哨兵(Sentinel):可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转移的功能. ...

最新文章

  1. b站前端大佬_最强UP主:罗翔老师,你凭什么打败B站千万粉大佬老番茄?
  2. android ndk 界面开发教程,Android NDK开发之入门教程
  3. C# 容器重用避免GC 的论证
  4. hadoop学习记录
  5. hive实现not in
  6. 面对峰值响应冲击,解决高并发的三大策略
  7. Java文件路径及文件名乱码_javaweb文件下载及文件名中文乱码处理
  8. 在Flex中获取一个屏幕截图(Screenshot)并将其传递给ASP.NET
  9. js排序算法详解-快速排序
  10. MongoDB数据库设计中6条重要的经验法则,part 2
  11. C# TextBox光标位置设置 滚动到最后一行 显示最后一行 自动跳转最后一行
  12. 华为云UGO正式亮相DTCC 2021,去“O”从此再无后顾之忧
  13. vs为什么打了断点不断_2019年丹麦羽毛球公开赛焦点对阵:林丹VS塞帕拉内斯 石宇奇 VS 马克卡尔尤B...
  14. openlayers中比例尺的计算原理
  15. 飞睿科技微波雷达感应方案,多普勒雷达效应技术应用
  16. 大话设计模式之爱你一万年:第三章 创建型模式:工厂模式:我想让你坐在宝马里笑:4.工厂模式之工厂方法模式
  17. 以太坊ETH源码分析(1):地址生成过程
  18. 数学建模笔记 day-03
  19. java中公钥,私钥,pkcs1格式,pkcs8格式互转
  20. erp系统实现内控管理的优势!

热门文章

  1. openstack高可用方案
  2. 利用属性封装复杂的选项
  3. CEGUI-----动画
  4. 企业信息化中常见决策点应对
  5. Office Live for Small Business--开启您创业的大门
  6. 【直播】闫强:文本分类上分利器 -- Bert微调技巧大全
  7. 【组队学习】【23期】Datawhale深度推荐模型
  8. 【ACM】杭电OJ 1076
  9. thinkphp5 mysql长连接_tp5(thinkPHP5)框架连接数据库的方法示例
  10. 快收藏!整理了 100 个 Python 小技巧