五年再出发,RDS MySQL集群版助力客户降本增效
1.客户案例
主库是在线业务,备库仅仅是一个Standby; 主库是在线业务,备库1是Standby,备库2是在线分析业务; 主库是在线业务,备库1是实时查询业务,备库2是在线分析,备库3是希望一个小规格实例,仅拿来做公司业务员访问用; ……
面对纷繁复杂的业务场景,RDS MySQL现在给客户提供了一个新的选择:RDS MySQL集群版!它基于阿里云关系型数据库RDS团队多年技术的沉淀,同时深入洞察用户需求,RDS MySQL集群版围绕着经济性、灵活性、可靠性三个方面,提供了多项重要产品功能,包括:备节点可读、按需增删节点、多可用区容灾、节点级别监控、集群拓扑管理等。
注:
2.数据安全性
MySQL集群版和以往产品形态最大的区别在于数据的保障性上。众所周知MySQL复制有三种方式:异步模式、半同步、以及GroupReplication。RDS MySQL集群版支持了用户自助切换数据复制方式,下面我们来看看他们三者的区别:
2.1 异步复制
异步复制是MySQL默认的复制模式,事务在主节点执行完后,会立即返回给应用,事务数据通过binlog异步同步到备节点上,主节点不关心备节点接收以及应用binlog的情况。异步复制的主要优点在于高性能,以及备节点不可用不会影响主节点写入。然而,如果在事务提交后,binlog传输到备节点之前,主节点发生宕机,此时将备节点提升为主节点,会出现数据丢失和不一致的情况。
2.2 半同步复制
图源:
https://dev.mysql.com/doc/refman/8.0/en/group-replication-primary-secondary-replication.html
2.3 MGR--MySQL Group Replication
到MySQL8.0.21为止,MGR(MySQL Group Replication)已经有了一套完整的错误响应机制。整体架构见下面的图。这套机制由三部分构成:
1.故障探测(Failure Detection) 当任何节点因故障或者网络分裂无法响应其他节点时,MGR能够识别出发生故障的节点。
2.移除故障节点(Expel Member) 将故障节点从集群中移除出去。
2.3.1 故障探测(Failure Detection)
故障探测是由MySQL内核的xcom(MGR的Paxos实现)完成的。xcom在每次成功的发送数据到某节点或者从某个节点接收到数据时都会记录当前时间(detected time)。意味着这个节点在当前时间还活着,如果故障了,他会做相应的移除操作。
2.3.2 移除故障节点(Expel Member)
疑似死亡节点列表
移除死亡节点的线程
当节点疑似死亡超过一定时间后,Gcs_suspicions_manager的处理线程会发送移除指令给XCOM,将该节点从集群中移除出去。这个时间通过group_replication_member_expel_timeout设置。
2.3.3 自动重新加入(Auto-rejoin)
当故障节点恢复后,会发现自己被移除出了集群。这时,这个节点会尝试自动加入集群。自动加入集群的过程和START GROUP REPLICATION不同。这个过程不需要做全局恢复(Global Recovery)。全局恢复需要通过group_replication_recovery异步通道复制加入集群前的数据。而自动加入时,所有的数据都是通过XCOM复制,包括加入前的数据。
3.产品竞争力
3.1 更经济:备节点开放读
3.1.1 通过集群可读地址访问备节点
3.1.2 通过独享代理访问备节点
RDS MySQL集群版实例同时支持通过开通代理实例实现主备节点的读写分离。相较于集群可读地址,独享代理提供了更多高阶的能力,包括:自动读写分离、连接池、延迟阈值、事务拆分等。
3.2 更灵活:按需增删节点&按需调整复制模式
3.3 更可靠:多可用区容灾
4.最佳实践
4.1 创建RDS MySQL
在RDS MySQL下单页面(https://rdsbuy.console.aliyun.com/create/rds/mysql),系列选择集群版,即可快速创建RDS MySQL集群版实例。
4.2 创建集群可读地址
实例创建完成后,在实例详情页面的实例拓扑管理区,点击增加地址,完成集群可读地址的创建。集群可读地址创建后,默认带有一个内网连接。
4.3 连接实例
[root@rdsmysql ~]# mysql -h rm-mysql-cluster-rw.mysql.zhangbei.rds.aliyuncs.com -u rdsmysqlcluster -p
mysql> use rds
Database changed
mysql> CREATE TABLE `demo` (`id` int(11) NOT NULL, `message` varchar(64));
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> INSERT INTO `demo` (`id`, `message`) VALUES (1, "RDS MySQL Cluster");
Query OK, 1 row affected (0.00 sec)
mysql> ^DBye
[root@rdsmysql ~]# mysql -h rm-mysql-cluster-ro.mysql.zhangbei.rds.aliyuncs.com -u rdsmysqlcluster -p
mysql> use rds
Database changedmysql> select * from demo;
+----+-------------------+
| id | message |
+----+-------------------+
| 1 | RDS MySQL Cluster |
+----+-------------------+
1 row in set (0.01 sec)
mysql> ^DBye
5.展望
目前RDS MySQL集群版能力在持续不断迭代中,相信在不远的将来,无论业务如何使用数据库,总有一款配置满足您的业务需求!
作者介绍
文峰,RDS MySQL集群版研发负责人,关于集群版的任何问题和建议可以发邮件至:vogts.wangt@alibaba-inc.com进行咨询!