Redis读写分离技术解析

背景

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

为知足读多写少的业务场景,最大化节约用户成本,云数据库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的数据同步方式,能够分为两种架构:星型复制和链式复制。markdown

星型复制网络

星型复制就是将全部的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中可能读到旧的数据,使用读写分离须要业务能够容忍必定程度的数据不一致,后续将会给客户更灵活的配置和更大的自由,好比配置能够容忍的最大延迟时间。
相关文章
相关标签/搜索