「助力降本增效」RDS MySQL云盘版只读基础版发布及其最佳实践
引子
阿里云RDS MySQL云盘版只读在原来 "高可用只读" 的基础上推出了"基础版只读"。尽管"基础版只读"在价格上比"高可用版只读"便宜了40%左右,两者对于故障的容错能力、异常的应对能力方面还是有差异的。本文通过两款产品的差异性对比,对"基础版只读"的最佳实践进行分享。
基础版只读 vs 高可用只读
高可用只读架构图
异常场景 | HA组件应对措施 |
只读主库hang | 切换备库 |
只读主库所在主机异常 | 切换备库 |
只读主库复制中断 | 切换备库 |
只读主库复制延迟 | 切换备库 |
只读备库hang | 切换备库 |
只读备库所在主机异常 | 迁移 |
只读备库复制中断 | 迁移 |
只读备库复制延迟 | 迁移 |
基础版只读架构图
异常场景 | HA组件应对措施 |
只读主库hang | 重启 |
只读主库所在主机异常 | 迁移 |
只读复制中断 | 迁移 |
只读复制延迟 | 迁移 |
小结
基础版只读 | 高可用只读 | |
购买前提 | 主实例云盘高可用版 | 主实例云盘高可用版 or 本地高可用版 |
链接地址 | 1个 | 1个 |
实际购买节点数 | 1个 | 2个 |
实例规格变配 | 业务闪断 | 业务闪断 |
高压力情况* | 无应对 | 有应对 |
异常情况* | 无 | HA自动切换 |
节点异常* | 无SLA | 60秒SLA |
节点自愈能力 | 有 | 有,客户无需关心 |
高压力情况是指数据库CPU、内存打满情况下,RDS MySQL只读可以自动failover,进行切换; 异常情况包含但不限于MySQL复制中断、复制延迟、硬件故障等情况; 节点异常主要是指在提供服务只读出现异常的情况下,HA的切换时间;
基础版只读最佳实践
如何购买
基于数据库代理做高可用
基于JDBC的高可用
如果您的应用是Java,那么JDBC驱动可以做一些简单的自动failover。众所周知,JDBC链接数据库有4种模式:
该方式就是当一个数据库宕的情况下,failover到你配置的另外一个数据库。其中还有一个fallback功能,这个是指回切到老数据库;
针对fallback功能需要做一点说明:默认参数配置情况下,当老主库拉起来以后,连接就会立马连接到新主库,这个需要改配置;
标准的主备模式,既主库挂了,可以自动连到备库;前提是在JDBC链接字符串里配置多个数据库;但是需要注意的地方:
默认新创建的数据库连接是Read only,需要代码显示设置;
默认会对读做“round robin”;
按照文档进行了配置,并未对Master挂的情况下做failover。
负载均衡有一个特点,他的轮询特点可以是“random”或"bestResponseTime"来做决策。这个今天不是本文重点,不做过多阐述;
基于以上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不用的原因就在这里;
后记
作者信息
推荐阅读
高可用只读