背景

云数据库Redis版不管主从版还是集群规格,replica作为备库不对外提供服务,只有在发生HA的时候,replica提升为master后才承担读写流量。这种架构读写请求都在master上完成,一致性较高,但性能受到master数量的限制。经常有用户数据较少,但因为流量或者并发太高而不得不升级到更大的集群规格。

为满足读多写少的业务场景,最大化节约用户成本,云数据库Redis版推出了读写分离规格,为用户提供透明、高可用、高性能、高灵活的读写分离服务。

架构

Redis集群模式有redis-proxy、master、replica、HA等几个角色。在读写分离实例中,新增read-only replica角色来承担读流量,replica作为热备不提供服务,架构上保持对现有集群规格的兼容性。redis-proxy按权重将读写请求转发到master或者某个read-only replica上;HA负责监控DB节点的健康状态,异常时发起主从切换或重搭read-only replica,并更新路由。

一般来说,根据master和read-only replica的数据同步方式,可以分为两种架构:星型复制和链式复制。

星型复制

星型复制就是将所有的read-only replica直接和master保持同步,每个read-only replica之间相互独立,任何一个节点异常不影响到其他节点,同时因为复制链比较短,read-only replica上的复制延迟比较小。

Redis是单进程单线程模型,主从之间的数据复制也在主线程中处理,read-only replica数量越多,数据同步对master的CPU消耗就越严重,集群的写入性能会随着read-only replica的增加而降低。此外,星型架构会让master的出口带宽随着read-only replica的增加而成倍增长。Master上较高的CPU和网络负载会抵消掉星型复制延迟较低的优势,因此,星型复制架构会带来比较严重的扩展问题,整个集群的性能会受限于master。

链式复制

链式复制将所有的read-only replica组织成一个复制链,如下图所示,master只需要将数据同步给replica和复制链上的第一个read-only replica。

链式复制解决了星型复制的扩展问题,理论上可以无限增加read-only replica的数量,随着节点的增加整个集群的性能也可以基本上呈线性增长。

链式复制的架构下,复制链越长,复制链末端的read-only replica和master之间的同步延迟就越大,考虑到读写分离主要使用在对一致性要求不高的场景下,这个缺点一般可以接受。但是如果复制链中的某个节点异常,会导致下游的所有节点数据都会大幅滞后。更加严重的是这可能带来全量同步,并且全量同步将一直传递到复制链的末端,这会对服务带来一定的影响。为了解决这个问题,读写分离的Redis都使用阿里云优化后的binlog复制版本,最大程度的降低全量同步的概率。

结合上述的讨论和比较,Redis读写分离选择链式复制的架构。

Redis读写分离优势

透明兼容

读写分离和普通集群规格一样,都使用了redis-proxy做请求转发,多分片令使用存在一定的限制,但从主从升级单分片读写分离,或者从集群升级到多分片的读写分离集群可以做到完全兼容。

用户和redis-proxy建立连接,redis-proxy会识别出客户端连接发送过来的请求是读还是写,然后按照权重作负载均衡,将请求转发到后端不同的DB节点中,写请求转发给master,读操作转发给read-only replica(master默认也提供读,可以通过权重控制)。

用户只需要购买读写分离规格的实例,直接使用任何客户端即可直接使用,业务不用做任何修改就可以开始享受读写分离服务带来的巨大性能提升,接入成本几乎为0。

高可用

高可用模块(HA)监控所有DB节点的健康状态,为整个实例的可用性保驾护航。master宕机时自动切换到新主。如果某个read-only replica宕机,HA也能及时感知,然后重搭一个新的read-only replica,下线宕机节点。

除HA之外,redis-proxy也能实时感知每个read-only replica的状态。在某个read-only replica异常期间,redis-proxy会自动降低这个节点的权重,如果发现某个read-only replica连续失败超过一定次数以后,会暂时屏蔽异常节点,直到异常消失以后才会恢复其正常权重。

redis-proxy和HA一起做到尽量减少业务对后端异常的感知,提高服务可用性。

高性能

对于读多写少的业务场景,直接使用集群版本往往不是最合适的方案,现在读写分离提供了更多的选择,业务可以根据场景选择最适合的规格,充分利用每一个read-only replica的资源。

目前单shard对外售卖1 master + 1/3/5 read-only replica多种规格(如果有更大的需求可以提工单反馈),提供60万QPS和192 MB/s的服务能力,在完全兼容所有命令的情况下突破单机的资源限制。后续将去掉规格限制,让用户根据业务流量随时自由的增加或减少read-only replica数量。

规格 QPS 带宽
1 master 8-10万读写 10-48 MB
1 master + 1 read-only replica 10万写 + 10万读 20-64 MB
1 master + 3 read-only replica 10万写 + 30万读 40-128 MB
1 master + 5 read-only replica 10万写 + 50万读 60-192 MB
后续
Redis主从异步复制,从read-only replica中可能读到旧的数据,使用读写分离需要业务可以容忍一定程度的数据不一致,后续将会给客户更灵活的配置和更大的自由,比如配置可以容忍的最大延迟时间。

转载于:https://www.cnblogs.com/williamjie/p/11250713.html

Redis读写分离技术解析相关推荐

  1. Redis读写分离技术架构解析

    作者:小热爱 来源:juejin.cn/post/6955355686108659726 背景 Redis 不管主从版还是集群规格,replica作为备库不对外提供服务,只有在发生HA的时候,repl ...

  2. 缓存成神路:Redis读写分离难以理解?一文解析Redis读写分离技术

    背景 云数据库Redis版不管主从版还是集群规格,replica作为备库不对外提供服务,只有在发生HA的时候,replica提升为master后才承担读写流量.这种架构读写请求都在master上完成, ...

  3. Redis 读写分离技术架构解析

    以下文章来源方志朋的博客,回复"666"获面试宝典 Redis 不管主从版还是集群规格,replica作为备库不对外提供服务,只有在发生HA的时候,replica提升为master ...

  4. sae mysql django_Django中MySQL读写分离技术

    最近需要用到Django的MySQL读写分离技术,查了一些资料,把方法整理了下来. 在Django里实现对MySQL的读写分离,实际上就是将不同的读写请求按一定的规则路由到不同的数据库上(可以是不同类 ...

  5. 基于 SpringBoot,来实现MySQL读写分离技术

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 作者:Y ...

  6. 单机mysql能支撑起10w的qps_高并发redis - 读写分离支撑qps10w+

    之前讲到单机redis的为了保证数据安全,必须做好数据备份等基础工作.但是如果流量越来越大, redis的读写请求压力越来越大,到了一个极限值,性能依旧不够用我们应该如何处理? 这边文章就分为以下几步 ...

  7. 基于SpringBoot,来实现MySQL读写分离技术

    作者:Yrion cnblogs.com/wyq178/p/13352707.html 前言 首先思考一个问题:在高并发的场景中,关于数据库都有哪些优化的手段?常用的有以下的实现方法:读写分离.加缓存 ...

  8. Spring Boot 实现 MySQL 读写分离技术

    你好,我是田哥 有同学私信我,如何实现读写分离,Spring Boot项目,数据库是MySQL,持久层用的是MyBatis. 其实,实现这个很简单的,首先思考一个问题: 在高并发的场景中,关于数据库都 ...

  9. redis读写分离 java_Redis主从实现读写分离

    前言 大家在工作中可能会遇到这样的需求,即Redis读写分离,目的是为了压力分散化.下面我将为大家介绍借助AWS的ELB实现读写分离,以写主读从为例. 实现 引用库文件 redis.clients j ...

最新文章

  1. component-scan和annotation-driven
  2. 口语学习Day5:今天聊聊美国路牌PED XING是什么?
  3. 全球及中国散热市场应用格局与竞争态势研究报告2022-2027年
  4. 第20讲:代理的基本原理和用法
  5. leetcode 229. Majority Element II | 229. 求众数 II(找出现次数超过n/k的元素)
  6. 王小云计算机,王小云学者主页-科技工作者之家
  7. 构建持续交付_如何使交付成为您的重点将如何帮助您构建高质量的应用程序
  8. BZOJ2976 : [Poi2002]出圈游戏
  9. 虚拟机安装mysql_linux虚拟机中安装MySQL
  10. Fortran程序转换到c程序
  11. Windows超级好用的离线截图贴图工具
  12. 分享几款免费的web打印控件
  13. newifi刷老毛子笔记
  14. oracle财务管理系统有什么用,CSS_Oracle财务管理系统:会计业务周期,下面是使用Oracle财务管理系统 - phpStudy...
  15. 《手机传感器》参数与选择
  16. 如何用计算机打出平方,如何用电脑打出平方?平方米符号输入方法介绍
  17. MTK6737功能展示
  18. nodejs+koa2实现微信小程序签名和请求支付(二)
  19. 高德地图截屏、标记鼠标跟随示例
  20. Java工程师是做什么的?学习java能干什么?

热门文章

  1. wordmaker html转为word,PHP HTML生成word
  2. (数论)逆元的线性算法
  3. 今天闲着没事弄个几个表情包
  4. 【bzoj1911】[Apio2010]特别行动队 斜率优化dp
  5. POJ3728 THE MERCHANT LCA RMQ DP
  6. 《神经网络和深度学习》系列文章五:用简单的网络结构解决手写数字识别
  7. [Logstash]使用详解
  8. ffmpeg结构体SpecifierOpt说明文档
  9. indexof的使用
  10. hibernate---id生成策略