0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文解析Redis读写分离技术

西西 来源:Java小寒 作者:今日头条 2020-03-01 15:00 次阅读

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

背景

云数据库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。

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

链式复制

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

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

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

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

结合上述的讨论和比较,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数量。

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

后续

Redis主从异步复制,从read-only replica中可能读到旧的数据,使用读写分离需要业务可以容忍一定程度的数据不一致,后续将会给客户更灵活的配置和更大的自由,比如配置可以容忍的最大延迟时间。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Redis
    +关注

    关注

    0

    文章

    362

    浏览量

    10491
收藏 人收藏

    评论

    相关推荐

    Python如何使用MySQL 8.2读写分离

    如您所知,MySQL 8.2 发布了最令人期待的功能之一:读写分离
    的头像 发表于 11-22 09:39 272次阅读
    Python如何使用MySQL 8.2<b class='flag-5'>读写</b><b class='flag-5'>分离</b>?

    【2018开年知识盛会】15位大咖直播分享,全方位解析NoSQL数据库

    集群及读写分离规格等,并且架构全面支持Memcache协议,产品专家将深度解读云数据库Redis在游戏等行业中的应用,技术专家将深度解读读写
    发表于 01-15 14:53

    企业打开Redis的正确方式,来自阿里云云数据库团队的解读

    的送礼物、讨论评论等大部分数据操作都适合非关系型数据库,而仅有充值等少量场景需要关系性数据库,因此重度依赖Redis数据库,相应地则有“稳定性高于切、低内存高QPS、连接数较大”的技术要求。相应
    发表于 02-07 14:06

    Redis Stream应用案例

    读取结果,在APP或者web页面上进行展示,从而整个系统形成个闭环。作者简介夏德军,花名夏周,阿里云Redis技术专家,负责阿里云Redis内核开发和维护。活跃于开源社区,
    发表于 06-26 17:15

    浅析数据库的读写分离

    Mysql读写分离——主从数据库+Atlas
    发表于 10-10 09:01

    Mycat的读写分离实现

    Mycat基于主从复制实现读写分离
    发表于 04-17 06:36

    labview读写操作REDIS

    本帖最后由 SevenLi8408 于 2022-9-15 08:07 编辑 分享个好用的非关系型缓存数据库的使用方法。REDIS桌面管理软件https://github.com
    发表于 08-15 10:32

    基于mycat的Mysql主从复制读写分离全攻略

    基于mycat的Mysql主从复制读写分离全攻略
    发表于 09-08 10:10 4次下载
    基于mycat的Mysql主从复制<b class='flag-5'>读写</b><b class='flag-5'>分离</b>全攻略

    利用Mycat实现MySQL读写分离、分库分表最佳实践

    利用Mycat实现MySQL读写分离、分库分表最佳实践
    发表于 09-08 10:20 14次下载
    利用Mycat实现MySQL<b class='flag-5'>读写</b><b class='flag-5'>分离</b>、分库分表最佳实践

    ddr3的读写分离方法有哪些?

    DDR3是目前DDR的主流产品,DDR3的读写分离作为DDR最基本也是最常用的部分,本文主要阐述DDR3读写分离的方法。最开始的DDR, 芯片采用的是TSOP封装,管脚露在芯片两侧的,
    的头像 发表于 11-06 13:44 8482次阅读
    ddr3的<b class='flag-5'>读写</b><b class='flag-5'>分离</b>方法有哪些?

    Redis为什么这么快!深入了解Redis的内存模型!

    Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分。
    的头像 发表于 05-02 16:57 4232次阅读
    <b class='flag-5'>Redis</b>为什么这么快!深入了解<b class='flag-5'>Redis</b>的内存模型!

    读写分离的两种实现方式

    1. 引言 读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做。因此,一般来讲,读写分离有两种实现方
    的头像 发表于 09-29 14:51 1.2w次阅读

    Redis的主从、哨兵、Redis Cluster集群

    主从。 1.1 Redsi主从概念 Redis主从模式,就是部署多台Redis服务器,有主库和从库,它们之间通过主从复制,以保证数据副本的一致。 主从库之间采用的是 读写分离
    的头像 发表于 06-12 14:58 483次阅读
    <b class='flag-5'>Redis</b>的主从、哨兵、<b class='flag-5'>Redis</b> Cluster集群

    阐述DDR3读写分离的方法

    DDR3是2007年推出的,预计2022年DDR3的市场份额将降至8%或以下。但原理都是一样的,DDR3的读写分离作为DDR最基本也是最常用的部分,本文主要阐述DDR3读写分离的方法。
    的头像 发表于 10-18 16:03 572次阅读
    阐述DDR3<b class='flag-5'>读写</b><b class='flag-5'>分离</b>的方法

    redis的原理和使用场景

    Redis(Remote Dictionary Server)是一个开源的、高性能的非关系型(NoSQL)的键值对数据库管理系统。它以其快速读写能力和多种数据结构支持而闻名,并被广泛应用于缓存
    的头像 发表于 12-04 16:29 222次阅读