读写分离功能

针对超高读写比的业务场景,云数据库 Tair(兼容 Redis)支持动态开启或关闭读写分离功能,提供高可用、高性能、灵活的读写分离服务,满足热点数据集中及高并发读取的业务需求。读写分离实例由阿里云Tair团队自研的Proxy组件进行全自动智能识别读写请求及路由、故障切换等服务。您无需处理与读写分离相关的业务代码,也无需考虑故障切换的业务层处理,本功能将显著降低接入复杂度。

标准架构开启读写分离

标准架构开启读写分离功能的实例主要由主节点、只读节点、代理节点(Proxy)和高可用系统等组成,架构图如下。

图 1. 云原生版

image

图 2. 经典版(已停售)

image

组件

云原生版读写分离实例(推荐)

经典版读写分离实例

主节点(Master node)

承担写请求的处理,同时和只读节点共同承担读请求的处理。

只读节点(Read replicas)

承担读请求的处理,特点如下:

  • 所有只读节点均具备容灾功能,可作为备节点进行数据备份。

  • 只读节点均从主节点同步数据,为星型复制架构,数据同步延迟远小于经典版链式复制架构。

  • 支持自定义只读节点数量,范围为1 ~ 9个,并且支持动态调整。

承担读请求的处理,特点如下:

  • 只读节点采取链式复制架构,当只读节点数越多,靠近链路末端的只读节点数据延迟越大。

  • 提供1个、3个、5个只读节点配置。

备节点(Replica node)

任一只读节点均可作为备节点。当主节点发生异常时,高可用系统将选择数据最完整的只读节点作为新的主节点,并在切换完成后立即补充一个新的只读节点。

由于无需该组件,在同样性能下,云原生读写分离实例的价格更低。

冷备节点,作为数据备份使用,不对外提供服务。当主节点发生异常时,会将请求切换至该节点。

代理节点(Proxy server)

客户端和代理节点建立连接后,代理节点会自动识别客户端发起的请求类型,按照权重分发流量(各节点权重相同,且不支持自定义权重),将请求转发到不同的数据节点中。例如将写请求转发给主节点,将读请求转发给主节点和只读节点。

说明
  • 客户端只会与代理节点建立连接,不支持和各节点直接建立连接。

  • 代理节点会将读请求平均分配到主节点和只读节点,暂不支持自定义控制。例如3个只读节点的实例,主节点和3个只读的读权重均为25%。

高可用系统(HA system)

  • 自动监控各节点的健康状态:当各节点异常时,高可用系统将发起主备切换或重建只读节点,并更新相应的路由及权重信息。

  • 故障时选主节点逻辑:数据优先,高可用系统将选取数据最完整的只读节点作为新的主节点。

关于双可用区读写分离实例的说明

云原生读写分离实例(推荐)

经典读写分离实例

主、备可用区都提供服务,最小配置:

  • 主可用区:1个主节点、1个只读节点。

  • 备可用区:1个只读节点。

将分别提供主、备可用区的连接地址,均支持读、写操作。每个可用区的读请求会路由到本可用区的主节点或只读节点中,实现就近访问;而写请求均会路由到主可用区的主节点中。架构图如下:

image
说明

推荐主、备节点均配置2节点以上:

  • 主可用区:1个主节点、1个只读节点。

  • 备可用区:2个只读节点。

主节点与只读节点都部署在主可用区,仅将冷备节点部署在备可用区,作为数据备份,不对外提供服务。当主节点发生异常时,会将请求切换至该节点。

特点:

  • 动态开关、简单易用

    标准架构能够直接开启读写分离功能。由于客户端请求的读写类型是通过Proxy智能识别与转发,在开启该功能后,您可以直接使用任何支持Redis的客户端访问读写分离实例,从而实现读性能的提升,且无需进行业务改造。读写分离实例完全兼容Redis协议命令,但少量命令存在一些限制,更多信息请参见读写分离实例的命令限制

  • 高可用

    • 通过阿里云自研的高可用系统自动监控所有数据节点的健康状态,为整个实例的可用性保驾护航。主节点不可用时自动选择新的主节点并重新搭建复制拓扑。某个只读节点异常时,高可用系统能够自动探知并重新启动新节点完成数据同步,下线异常节点。

    • 代理节点会实时感知每个只读节点的服务状态。在某个只读实例异常期间,代理节点会自动降低该节点的服务权重,发现只读节点连续失败超过一定次数以后,会停止异常节点的服务权利,并具备继续监控后续重新启动节点服务的能力。

  • 高性能

    读写分离实例可以通过扩展只读实例个数使整体实例性能呈线性增长,同时基于源码层面对Redis复制流程的定制优化,可以最大程度地提升线性复制的系统稳定性,充分利用每一个只读节点的物理资源。

使用场景:

读取请求QPS(Queries Per Second)压力较大的场景。如果业务为读多写少的场景,标准架构可能无法满足较高的QPS需求。在这种情况下,您可以通过部署多个只读节点来突破单节点的性能瓶颈。开启读写分离后实例可承载的QPS最高提升9倍。

说明

由于Redis异步同步机制,在写入量较大的情况下可能会发生数据同步延迟。选用此架构时,业务需要能接受一定程度的脏数据。

集群架构开启读写分离

云原生版集群架构代理模式支持开启读写分离功能,服务架构示例如下。

image

组件说明

组件

说明

代理服务器(Proxy Server)

当客户端与代理服务器(Proxy Server)建立连接后,Proxy会自动识别客户端发起的请求,将请求转发到各数据分片以及对应的读写节点上。例如将写请求转发给主节点,将读请求均衡地转发给主节点和只读节点。

数据分片(Data Shards)

每个数据分片由1个主节点(Master)、最多4个只读节点(Read Replicas)组成。

  • 主节点:承担写请求的处理,同时和只读节点共同承担读请求的处理。固定部署在主可用区。

  • 只读节点:承担读请求的处理,只读节点均从主节点同步数据(星型复制架构)。只读节点的数量范围为1 ~ 4,并且支持动态调整。您也可以选择部署只读节点在备可用区,所以只读节点均具备容灾功能。

高可用服务(HA)

  • 自动监控各节点的健康状态:当各节点异常时,高可用系统将发起主备切换或重建只读节点,并更新相应的路由及权重信息。

  • 故障时选主节点逻辑:数据优先,高可用系统将选取数据最完整的只读节点作为新的主节点。

说明
  • 若实例为单可用区,则所有节点均在主可用区,实例仅提供主可用区的连接地址。

  • 若实例为双可用区,则实例将分别提供主、备可用区的连接地址,均支持读、写操作。写请求均会路由到主可用区的主节点中;每个可用区的读请求会路由到本可用区的主节点或只读节点中,实现就近访问。若发生极端情况,备可用区的所有只读节点都不可用,备可用区的读请求也会路由到主节点中,不会影响业务运行。

建议与使用须知

  • 当一个只读节点发生故障时,请求会转发到其他节点;如果所有只读节点均不可用,请求会全部转发到主节点。只读节点异常可能导致主节点负载提高、响应时间变长,因此在读负载高的业务场景建议使用多个只读节点。

  • 只读节点发生异常时,高可用系统会暂停异常节点的服务,重新挂载一个可用的只读节点。该过程涉及资源分配、实例创建数据同步以及服务加载,消耗的时间与业务负载及数据量有关。云数据库Tair(兼容 Redis)不承诺只读节点的恢复时间指标。

  • 某些场景会触发只读节点的全量同步,例如在主节点触发高可用切换后。全量同步期间只读节点不提供服务并返回-LOADING Redis is loading the dataset in memory\r\n信息。

  • 更多关于路由转发的规则,请参见Tair Proxy特性说明

操作指南

  • 若未创建实例,可以在创建实例时选择开启读写分离,更多信息请参见创建实例

  • 若您已创建云原生版实例,可直接开启读写分离,更多信息请参见开启读写分离功能