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

背景

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

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

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

实现方式

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

大概长这样:

高可用版本

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

但是:
(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>

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

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,收到事件后,重新进行初始化的步骤即可

2.2 扩容slave

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

总结

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

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

(0)

相关推荐

  • Redis主从实现读写分离

    前言 大家在工作中可能会遇到这样的需求,即Redis读写分离,目的是为了压力分散化.下面我将为大家介绍借助AWS的ELB实现读写分离,以写主读从为例. 实现 引用库文件 <!-- redis客户端 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.6.2</version> &l

  • Redis如何实现数据库读写分离详解

    前言 Redis是一种NoSQL的文档数据库,通过key-value的结构存储在内存中,Redis读的速度是110000次/s,写的速度是81000次/s,性能很高,使用范围也很广.Redis是一个key-value存储系统.和Memcached类似,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步.在部分场合可以对关系数据库起到很好的补充作用.它提供了Java,C/C+

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

    背景 (1) redis单机的读写性能轻松上大几万,不过线上环境不会只部署光秃秃的一个节点,还是会配合 sentinel 再部署一个 slave作为高可用节点的: 但是standby的slave节点是不对外提供服务端的,一定程度上造成了浪费资源 (2) 当业务不断发展,原来单节点缓存的数据(如,商品信息缓存.配置信息等)的查询qps不断升高(写qps增长不多),突破十几万.几十万的的时候,此时一个节点就扛不住了,我们就需要增加几个redis slaves节点来分担这些查询的压力 也就是读写分离

  • CodeIgniter读写分离实现方法详解

    本文实例讲述了CodeIgniter读写分离实现方法.分享给大家供大家参考,具体如下: 当前服务器只做了主从,未配置读写分离,读写分离的功能就只有交给程序来实现,这里主要谈谈Codeigniter怎么实现读写分离,并且需要满足以下两点: 1.读写分离对开发应该透明. 网上有方案通过手动load多个DB来实现读写分离,这样的分离跟业务关联太紧,增加了开发难度也不利于维护,我们要做的是默认读重库,写则写主库,读写分离对开发者透明 2.配置简单. 保留现有的配置方式,通过增加一个数组来配置读写分离,不

  • redis三种高可用方式部署的实现

    前言 一.主从复制 概念 和mysql的主从复制一样 都是将服务器的数据复制到另一个数据库中 发送的称为master 接受的叫slave 数据为单向传输 只可以主到从 每台Redis服务器都是主节点:且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点. 作用 数据冗余 实现了数据的热备份,是持久化之外的一种数据冗余方式 故障切换 当主节点宕机或者出现错误时 由从服务器来提供服务 实现故障切换 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供

  • 浅谈Redis哨兵模式高可用解决方案

    目录 一.序言 1.目标与收获 2.端口规划 二.单机模拟 (一)服务规划 1.Redis实例 2.哨兵服务 (二)服务配置 1.Redis实例 2.哨兵服务 (三)服务管理 1.Redis实例 2.哨兵服务 三.客户端整合 (一)基础整合 1.全局配置文件 2.集成配置 (二)读写分离 一.序言 Redis高可用有两种模式:哨兵模式和集群模式,本文基于哨兵模式搭建一主两从三哨兵Redis高可用服务. 1.目标与收获 一主两从三哨兵Redis服务,基本能够满足中小型项目的高可用要求,使用Supe

  • Redis服务之高可用组件sentinel详解

    前文我们了解了redis的常用数据类型相关命令的使用和说明,回顾请参考https://www.jb51.net/article/120364.htm 今天我们来聊一下redis的高可用组件sentinel:首先来回顾下redis的主从同步,主从同步最主要的作用是让master的数据在其他服务器上实时存在副本,起到了备份的效果:对于redis的读写来说,主从架构能够让读的请求分散到多个从服务器上,从而降低了单台redis读请求的io压力,同时也提高了redis读请求的并发能力:通常为了数据的一致性

  • redis sentinel监控高可用集群实现的配置步骤

    目录 一.端口转发. 如果在一个主机里面,安装了两个redis实例,可以在项目里面配置IP端口,用iptables转发. iptables -t nat -A PREROUTING -p tcp --dport 6379 -j REDIRECT --to-ports 7379 当发生切换的时候,触发了脚本,执行语句.端口可以马上转发带正确的redis上面.参数的含义: 脚本配置: 脚本实例: #!/bin/bash iptables -t nat -I PREROUTING -p tcp --d

  • redis sentinel监控高可用集群实现的配置步骤

    目录 一.端口转发 二.修改HOST文件 三.用第三方代理haproxy 四.插曲 一.端口转发 如果在一个主机里面,安装了两个redis实例,可以在项目里面配置IP端口,用iptables转发. iptables -t nat -A PREROUTING -p tcp --dport 6379 -j REDIRECT --to-ports 7379 当发生切换的时候,触发了脚本,执行语句.端口可以马上转发带正确的redis上面.参数的含义: 脚本配置: 脚本实例: #!/bin/bash  i

  • 高并发系统的限流详解及实现

    在开发高并发系统时有三把利器用来保护系统:缓存.降级和限流.本文结合作者的一些经验介绍限流的相关概念.算法和常规的实现方式. 缓存 缓存比较好理解,在大型高并发系统中,如果没有缓存数据库将分分钟被爆,系统也会瞬间瘫痪.使用缓存不单单能够提升系统访问速度.提高并发访问量,也是保护数据库.保护系统的有效方式.大型网站一般主要是"读",缓存的使用很容易被想到.在大型"写"系统中,缓存也常常扮演者非常重要的角色.比如累积一些数据批量写入,内存里面的缓存队列(生产消费),以及

  • J2ee 高并发情况下监听器实例详解

    J2ee 高并发情况下监听器实例详解 引言:在高并发下限制最大并发次数,在web.xml中用过滤器设置参数(最大并发数),并设置其他相关参数.详细见代码. 第一步:配置web.xml配置,不懂的地方解释一下:参数50通过参数名maxConcurrent用在filter的实现类中获取,filter-class就是写的实现类, url-pattern就是限制并发时间的url,结束! <filter> <filter-name>ConcurrentCountFilter</filt

  • 部署Nginx+Apache动静分离的实例详解

    Nginx动静分离介绍 Nginx的静态处理能力很强,但是动态处理能力不足,因此,在企业中常用动静分离技术 针对PHP的动静分离 静态页面交给Nginx处理 动态页面交给PHP-FPM模块或Apache处理 在Nginx的配置中,是通过location配置段配合正则匹配实现静态与动态页面的不同处理方式 反向代理原理 Nginx不仅能作为Web服务器,还具有反向代理.负载均衡和缓存的功能 Nginx通过proxy模块实现将客户端的请求代理至上游服务器,此时nginx与上游服务器的连接是通过http

随机推荐