数据库:一文解析Redis读写分离技术

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

文章图片

背景
云数据库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读写分离技术
文章图片

文章图片

链式复制
链式复制将所有的read-only replica组织成一个复制链 , 如下图所示 , master只需要将数据同步给replica和复制链上的第一个read-only replica 。
链式复制解决了星型复制的扩展问题 , 理论上可以无限增加read-only replica的数量 , 随着节点的增加整个集群的性能也可以基本上呈线性增长 。
链式复制的架构下 , 复制链越长 , 复制链末端的read-only replica和master之间的同步延迟就越大 , 考虑到读写分离主要使用在对一致性要求不高的场景下 , 这个缺点一般可以接受 。但是如果复制链中的某个节点异常 , 会导致下游的所有节点数据都会大幅滞后 。更加严重的是这可能带来全量同步 , 并且全量同步将一直传递到复制链的末端 , 这会对服务带来一定的影响 。为了解决这个问题 , 读写分离的Redis都使用阿里云优化后的binlog复制版本 , 最大程度的降低全量同步的概率 。
数据库:一文解析Redis读写分离技术


推荐阅读