redis客户端实现高可用读写分离的方式详解


Posted in Redis onJuly 04, 2021

背景

(1) redis单机的读写性能轻松上大几万,不过线上环境不会只部署光秃秃的一个节点,还是会配合 sentinel 再部署一个 slave作为高可用节点的;
但是standby的slave节点是不对外提供服务端的,一定程度上造成了浪费资源

(2) 当业务不断发展,原来单节点缓存的数据(如,商品信息缓存、配置信息等)的查询qps不断升高(写qps增长不多),突破十几万、几十万的的时候,此时一个节点就扛不住了,我们就需要增加几个redis slaves节点来分担这些查询的压力 也就是读写分离

但是,常用的 redis 客户端jedis并不支持读写分离能力

实现方式

(1) 从配置中心获取 master 和 slaves 的连接信息,分别初始化好一个连接master的写连接池和一组slave的读连接池
(2) 将命令进行分类:执行写命令则从 master的连接池取连接然后执行,如果是读命令则从slave的连接池中取出连接执行
可能有多个slave节点,可以按照一定的策略进行负载均衡(权重、随机、轮询...etc) 从其中一个 slave节点的连接池获取连接

大概长这样:

redis客户端实现高可用读写分离的方式详解

高可用版本

前面的实现方式正常情况下是可以的

但是:
(1) 如果运行期间 master挂了怎么办? 如何自动 failover 切换?
(2) 如果流量突增,需要动态扩容一个或多个 slave节点,如何动态生效?

那就不能从配置文件取master和slaves的 ip+port 了,得从redis ha的组件去动态获取 当前master 和可用slave列表的节点信息 => sentinel

1.初始化

向 sentinel 发送命令获取master和slaves的节点信息

//获取当前masterName标识的当前master节点信息,哨兵可监控多个 mater ha,所以要用<masterName>区分
SENTINEL get-master-addr-by-name <masterName>
//获取可用的slaves列表信息
SENTINEL slaves <masterName>

redis客户端实现高可用读写分离的方式详解

拿到连接后,继续用开头的方式去创建连接池就行了

2. 动态failover、扩容

初始化完毕后,在运行期间master节点,和slaves还是可能变化的, 如
(1) master故障、网络分区,sentinel 提升一个slave为新的master
(2) 新增slave节点应对突增流量

我们如何能不重启客户端的情况下,动态切换?

sentinel 在进行master切换、slave变更等操作的时候都会向对应的 channel 发布事件,我们可以基于这些事件感知到相应的变化
参考: https://redis.io/topics/sentinel

2.1 failover切换 master

当 sentinel 进行master failover切换的时候,它会向channel: switch-master 发送通知,我们在客户端订阅这个channel,收到事件后,重新进行初始化的步骤即可

redis客户端实现高可用读写分离的方式详解

2.2 扩容slave

当新的 slave 节点加入, sentinel 感知到则会向channel: +slave 发布事件,我们监听到后,重新获取slaves节点信息重建slaves的连接池就可以了(这边不涉及master的变化)

redis客户端实现高可用读写分离的方式详解

总结

基于 sentienl 获取和动态感知 master、slaves节点信息的变化,我们的读写分离客户端就能具备高可用+动态扩容感知能力了;

到此这篇关于redis客户端实现高可用读写分离的文章就介绍到这了,更多相关redis读写分离内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Redis 相关文章推荐
redis通过6379端口无法连接服务器(redis-server.exe闪退)
May 08 Redis
redis不能访问本机真实ip地址的解决方案
Jul 07 Redis
springboot使用Redis作缓存使用入门教程
Jul 25 Redis
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
Mar 16 Redis
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
Mar 16 Redis
Redis高可用集群redis-cluster详解
Mar 20 Redis
解决redis批量删除key值的问题
Mar 23 Redis
一文搞懂Redis中String数据类型
Apr 03 Redis
Redis实战高并发之扣减库存项目
Apr 14 Redis
Redis全局ID生成器的实现
Jun 05 Redis
Redis sentinel哨兵集群的实现步骤
Jul 15 Redis
基于redis+lua进行限流的方法
Jul 23 Redis
使用Redis实现实时排行榜功能
Jul 02 #Redis
redis使用不当导致应用卡死bug的过程解析
Redis主从配置和底层实现原理解析(实战记录)
浅谈Redis中的RDB快照
聊一聊Redis与MySQL双写一致性如何保证
k8s部署redis cluster集群的实现
Jun 24 #Redis
浅析Redis Sentinel 与 Redis Cluster
You might like
将数组写入txt文件 var_export
2009/04/21 PHP
php通过curl模拟登陆DZ论坛
2015/05/11 PHP
基于jquery的划词搜索实现(备忘)
2010/09/14 Javascript
基于jquery实现的鼠标滑过按钮改变背景图片
2011/07/15 Javascript
jQuery实现的多屏图像图层切换效果实例
2015/05/07 Javascript
Jquery代码实现图片轮播效果(一)
2015/08/12 Javascript
js验证身份证号有效性并提示对应信息
2015/10/19 Javascript
基于JavaScript实现div层跟随滚动条滑动
2016/01/12 Javascript
js控制文本框只能输入中文、英文、数字与指定特殊符号的实现代码
2016/09/09 Javascript
使用JavaScript获取Request中参数的值方法
2016/09/27 Javascript
微信js-sdk分享功能接口常用逻辑封装示例
2016/10/13 Javascript
轻松理解Javascript变量的相关问题
2017/01/20 Javascript
Vue中的slot使用插槽分发内容的方法
2018/03/01 Javascript
JS中min函数实例讲解
2019/02/18 Javascript
js实现单元格拖拽效果
2020/02/10 Javascript
微信小程序实现转盘抽奖
2020/09/21 Javascript
jdk1.8+vue elementui实现多级菜单功能
2020/09/24 Javascript
爬山算法简介和Python实现实例
2014/04/26 Python
Python实现随机生成手机号及正则验证手机号的方法
2018/04/25 Python
Django 多环境配置详解
2019/05/14 Python
python 实现读取csv数据,分类求和 再写进 csv
2020/05/18 Python
Django如何批量创建Model
2020/09/01 Python
如何从csv文件构建Tensorflow的数据集
2020/09/21 Python
python 实时调取摄像头的示例代码
2020/11/25 Python
详解移动端HTML5音频与视频问题及解决方案
2018/08/22 HTML / CSS
Tiqets英国:智能手机上的文化和娱乐门票
2019/07/10 全球购物
向全球直邮输送天然健康产品:iHerb.com
2020/05/03 全球购物
航空大学应届生求职信
2013/11/10 职场文书
家居设计专业个人自荐信范文
2013/11/26 职场文书
见习期自我鉴定
2014/01/31 职场文书
2014年幼儿园班级工作总结
2014/12/17 职场文书
逃课检讨书怎么写
2015/01/01 职场文书
乡镇司法所2015年度工作总结
2015/10/14 职场文书
2016年优秀党务工作者先进事迹材料
2016/02/29 职场文书
TV动画《神废柴☆偶像》公布先导PV
2022/03/20 日漫
HTML页面点击按钮关闭页面的多种方式
2022/12/24 HTML / CSS