简介
RDS为用户提供高透明,高可用,高性能,高灵活的读写分离服务。在最近的版本我们基于短连接的用户进行了优化,使得短连接的用户负载均衡更加完善合理。RDS读写分离有如下特性:
易用/透明性
用户只需要在原来的只读实例的主实例上开通一个读写分离的VIP就可以使用读写分离,而不需要修改任何业务代码。对用户的接入成本几乎为0。
高可用
RDS读写分离服务能够主动判断只读库的健康情况(包括节点crash,主备同步异常,延迟较大等),对于不健康的只读库不再进行路由,从而保证系统的整体可用性。同时在故障节点恢复后重新按权重进行负载均衡。
高性能
RDS的读写分离服务,由RDS的中间件服务提供路由及负载均衡,对于读多写少的业务能够充分利用只读库的资源,使得整体业务性能得到显著的提高。
高灵活
RDS的读写分离服务为用户提供按权重的请求及连接双重负载均衡模式,用户可以根据自己只读库的硬件资源情况,对每个只读库设置相应的读权重,同时也支持把主库放到读列表里,分担部分读请求。
另外,为用户提供读库同步延迟的可用性配置,当用户对数据的实时性要求较高的话,用户可以通过调小该值来保证只有在只读库与主库的同步延迟小于该值时,读写分离服务才会把读请求路由到该只读库。
扩容更灵活,用户可以随着业务的增长适当的扩容只读库,而这个也只需要在控制台上下发一个扩容请求就可以,无需业务上做任务调整。
提供特定的hit语法:如/FORCE_MASTER/ /FORCE_SLAVE/,方便用户指定SQL到master或slave上执行;以及/PROXY_INTERNAL/show last route查看sql路由情况等。
场景应用
随着业务增长,数据越来越大,用户对数据的读取需求也随之越来越多,比如各种AP操作,都需要把数据从数据库中读取出来,同时,随着数据量的增加,读请求的性能消耗也可能随之增加,从而导致影响到用户的写请求,反之亦然,写请求也可能会影响到用户的读请求,使得DB的总体吞吐量下降。为了解决该问题,RDS之前提供了只读实例的方案,用户可以通过开通多个只读实例,将读请求业务直接连接到只读实例上,该方案能够解决上述问题,但引来的问题也很明显,用户的使用成本增大了:需要手动区分读写业务,有多个访问地址维护性差,无法做负载均衡,容易受只读实例的可用性影响等。
RDS云数据库读写分离就是为了解决如上问题而产生的。用户只需要一个请求地址,业务不需要做任何修改,由RDS自带的读写分离中间件服务来完成读写请求的路由及根据不同的只读实例规格进行不同的负载均衡,同时当只读实例出现故障时能够主动摘除,减少对用户的影响。对用户达到一键开通,一个地址,快速使用。
架构简介
图1 用户链路视图
对于用户来说看到的还是一个普通的mysql连接,只是这个连接先直接访问RDS的中间件服务,再由中间件服务进行转发,对用户来说是完全透明的。
内部框架
图2 RDS中间件内部组件
RDS中间件服务的读写分离功能,主要由图2所示的模块组成。
RW SESSION:每个用户连接对应的RDS中间件服务里的一个rw session,其中主要维护着一个与主库的socket以及与只读库的ro_session,同时负责session状态的保持及恢复
RO SESSION:负责与只读库的请求处理
ROUTE STRATEGT:该模块也是读写分离的核心模块,负责sql的路由决策
LB:load balance,负责读请求的负载均衡,使用常用的weighted round robin算法
QOS:负责只读库的健康检查
PS:当前PGSQL暂时不支持读写分离
总结
RDS云数据库自带的读写分离服务能够有效的解决用户数据量大读请求多,带来的DB吞吐量下降等问题;一键开通、一个地址、快速使用极大的减少了用户的使用成本;配置灵活,自动检测消除了单点故障提高了系统的可用性。