引子
阿里云RDS MySQL云盘版只读在原来 "高可用只读" 的基础上推出了"基础版只读"。尽管"基础版只读"在价格上比"高可用版只读"便宜了40%左右,两者对于故障的容错能力、异常的应对能力方面还是有差异的。本文通过两款产品的差异性对比,对"基础版只读"的最佳实践进行分享。
基础版只读 vs 高可用只读
高可用只读架构图
高可用只读架构图如下,通过只读备节点来保证SLA, 遇到异常情况可以通过HA组件切换到备库快速恢复业务。
针对故障场景,能够快速的failover,应用无需做任何改造。
异常场景 |
HA组件应对措施 |
只读主库hang |
切换备库 |
只读主库所在主机异常 |
切换备库 |
只读主库复制中断 |
切换备库 |
只读主库复制延迟 |
切换备库 |
只读备库hang |
切换备库 |
只读备库所在主机异常 |
迁移 |
只读备库复制中断 |
迁移 |
只读备库复制延迟 |
迁移 |
基础版只读架构图
基础版只读架构图如下。由于没有备库,遇到异常无法保证SLA, 用户可以通过设置代理或者通过JDBC自动Failover来自动把流量切换到其他实例来避免业务受到影响。
异常场景 |
HA组件应对措施 |
只读主库hang |
重启 |
只读主库所在主机异常 |
迁移 |
只读复制中断 |
迁移 |
只读复制延迟 |
迁移 |
小结
我们针对两款产品做一个大致对比介绍:
基础版只读 |
高可用只读 |
|
购买前提 |
主实例云盘高可用版 |
主实例云盘高可用版 or 本地高可用版 |
链接地址 |
1个 |
1个 |
实际购买节点数 |
1个 |
2个 |
实例规格变配 |
业务闪断 |
业务闪断 |
高压力情况* |
无应对 |
有应对 |
异常情况* |
无 |
HA自动切换 |
节点异常* |
无SLA |
60秒SLA |
节点自愈能力 |
有 |
有,客户无需关心 |
说明:
- 高压力情况是指数据库CPU、内存打满情况下,RDS MySQL只读可以自动failover,进行切换;
- 异常情况包含但不限于MySQL复制中断、复制延迟、硬件故障等情况;
- 节点异常主要是指在提供服务只读出现异常的情况下,HA的切换时间;
基础版只读最佳实践
如何购买
用户首先需要创建高可用主实例,然后在实例详情里面找到“只读实例”菜单,点击“添加”
基于数据库代理做高可用
数据库代理可以通过权重来控制各个实例的业务流量,当某个只读实例不可用时,可自动将异常实例剔除并将流量切换到其他正常实例, 同时应用无需感知实例的变化。用户可以通过主实例详情界面的“数据库代理”菜单进行开通。
开通成功后, 点击“设置代理终端”进行实例的添加和权重的设置。
设置完代理终端后, 切换到“代理服务”菜单可以获取到数据库代理的连接地址信息。
基于JDBC的高可用
JDBC链接数据库的几种模式
如果您的应用是Java,那么JDBC驱动可以做一些简单的自动failover。众所周知,JDBC链接数据库有4种模式:
Single模式
平时默认使用直连方式,即:ip:port方式。
Failover模式
- 该方式就是当一个数据库宕的情况下,failover到你配置的另外一个数据库。其中还有一个fallback功能,这个是指回切到老数据库;
- 针对fallback功能需要做一点说明:默认参数配置情况下,当老主库拉起来以后,连接就会立马连接到新主库,这个需要改配置;
Replication模式
- 标准的主备模式,既主库挂了,可以自动连到备库;前提是在JDBC链接字符串里配置多个数据库;但是需要注意的地方:
- 默认新创建的数据库连接是Read only,需要代码显示设置;
- 默认会对读做“round robin”;
- 按照文档进行了配置,并未对Master挂的情况下做failover。
LoadBalancing模式
- 负载均衡有一个特点,他的轮询特点可以是“random”或"bestResponseTime"来做决策。这个今天不是本文重点,不做过多阐述;
基于Failover模式的一些提示
基于以上4种模式,综合来看Failover模式比较适合RDS MySQL基础版只读。
数据库链接参数调优
以下JDBC链接参数需要额外关注:
- autoReconnect:自动重连
- failOverReadOnly:切换过去以后,是否ReadOnly
- secondsBeforeRetryMaster:当master挂了以后,多久重试主库
- queriesBeforeRetryMaster:当master挂了以后,多少次query以后重试主库
- connectTimeout: 创建连接超时时间
- socketTimeout:SQL执行超时时间
范例:
jdbc:mysql://ip1:port1,ip2:port2/dbname?autoReconnect=true&failOverReadOnly=false&secondsBeforeRetryMaster=0&queriesBeforeRetryMaster=0&connectTimeout=1000&socketTimeout=3000
测试验证
- 当数据库链接字符串中第一地址数据库("ip1:port1") Crash以后,能够自动failover到第二地址数据库("ip2:port2");
- 当第一地址数据库起来以后,配置"secondsBeforeRetryMaster","queriesBeforeRetryMaster"为0后,连接不会自动飘回来,除非kill掉老连接;这个非常重要,replication不用的原因就在这里;
后记
通过本文我们大致介绍了基础版只读的主要特性以及与高可用只读的差异,希望对您有一定的帮助。未来RDS只读会在更多的地方进行产品能力提升。
作者信息
马佳,花名涤余,来自RDS MySQL产品部,主要负责RDS MySQL管控研发相关工作。如果您对MySQL基础版只读有任何产品或者技术疑问,欢迎来信咨询:vogts.wangt@alibaba-inc.com