RDS MySQL上次发布新的产品系列是5年前的RDS MySQL三节点企业版。面对客户需求的不断变化,以及数据库技术不断的推陈出新,RDS MySQL将云原生技术到底,推出RDS MySQL集群版帮助客户降本增效,解决数据库架构多样化需求的问题。
1.客户案例
越来越多的客户希望在一定RPO保障的前提下,以一套数据库满足各种业务要求,例如,
- 主库是在线业务,备库仅仅是一个Standby;
- 主库是在线业务,备库1是Standby,备库2是在线分析业务;
- 主库是在线业务,备库1是实时查询业务,备库2是在线分析,备库3是希望一个小规格实例,仅拿来做公司业务员访问用;
- ……
面对纷繁复杂的业务场景,RDS MySQL现在给客户提供了一个新的选择:RDS MySQL集群版!它基于阿里云关系型数据库RDS团队多年技术的沉淀,同时深入洞察用户需求,RDS MySQL集群版围绕着经济性、灵活性、可靠性三个方面,提供了多项重要产品功能,包括:备节点可读、按需增删节点、多可用区容灾、节点级别监控、集群拓扑管理等。
通过下面的表格,清晰的罗列了各系列之间的区别:
注:
1.MGR模式计划近期逐步上线;2.节点数当前开放2~3,后续逐步开放到最大9节点。
2.数据安全性
MySQL集群版和以往产品形态最大的区别在于数据的保障性上。众所周知MySQL复制有三种方式:异步模式、半同步、以及GroupReplication。RDS MySQL集群版支持了用户自助切换数据复制方式,下面我们来看看他们三者的区别:
2.1 异步复制
异步复制是MySQL默认的复制模式,事务在主节点执行完后,会立即返回给应用,事务数据通过binlog异步同步到备节点上,主节点不关心备节点接收以及应用binlog的情况。异步复制的主要优点在于高性能,以及备节点不可用不会影响主节点写入。然而,如果在事务提交后,binlog传输到备节点之前,主节点发生宕机,此时将备节点提升为主节点,会出现数据丢失和不一致的情况。
图源:https://dev.mysql.com/doc/refman/8.0/en/group-replication-primary-secondary-replication.html
2.2 半同步复制
半同步复制是在异步复制的基础之上,增加备节点确认机制。在事务提交之前,主节点等待至少一个备节点接收到事务数据,备节点接收到事务数据后,会向主节点发送ACK响应。主节点等待ACK超时时间可通过参数rpl_semi_sync_master_timeout配置(默认1秒),主节点等待超时后,会正常提交事务,同时退化成异步复制,直到备节点重新恢复。半同步复制的主要优点在于,正常情况下能够保证已提交的事务,至少已经传输到一个备节点上。不足在于,备节点不可用时,会短暂影响主节点的写入,影响时长取决于超时时间配置,同时,备节点不可用后,会自动退化成异步复制,失去数据安全性。因此,在使用半同步复制的时候,为了避免单个备节点不可用导致主节点写入延迟或退化成异步复制,推荐搭配多个备节点组成集群。
图源:
https://dev.mysql.com/doc/refman/8.0/en/group-replication-primary-secondary-replication.html
2.3 MGR--MySQL Group Replication
MySQL Group Replication又称为组复制或MGR。MGR跟以往的异步/半同步复制一样,都是通过Binlog进行复制,最大的不同在于,MGR复制主备节点之间通过Paxos协议组成集群,在主节点的事务提交之前,需要将事务先发生到备节点上,多数派节点通过事务提议后,事务才能提交。
图源:https://dev.mysql.com/doc/refman/8.0/en/group-replication-summary.html
到MySQL8.0.21为止,MGR(MySQL Group Replication)已经有了一套完整的错误响应机制。整体架构见下面的图。这套机制由三部分构成:
1.故障探测(Failure Detection) 当任何节点因故障或者网络分裂无法响应其他节点时,MGR能够识别出发生故障的节点。
2.移除故障节点(Expel Member) 将故障节点从集群中移除出去。
3.自动重新加入(Auto-Rejoin) 当故障消除后,恢复的节点能够知道自己被移除了,并且自动加入集群中。
2.3.1 故障探测(Failure Detection)
故障探测是由MySQL内核的xcom(MGR的Paxos实现)完成的。xcom在每次成功的发送数据到某节点或者从某个节点接收到数据时都会记录当前时间(detected time)。意味着这个节点在当前时间还活着,如果故障了,他会做相应的移除操作。
2.3.2 移除故障节点(Expel Member)
开除成员的流程由MySQL内核的Gcs_suspicions_manager实现。Gcs_suspicions_manager两个重要的步骤:
- 疑似死亡节点列表
前面说了xcom通过回调函数将处理权交给GCS模块。Gcs_suspicions_manager将可能已经死亡节点加入到疑似死亡节点列表中. 同时将这些节点的状态设置为UNREACHABLE。从replication_group_members表可以查询到节点的状态。
- 移除死亡节点的线程
当节点疑似死亡超过一定时间后,Gcs_suspicions_manager的处理线程会发送移除指令给XCOM,将该节点从集群中移除出去。这个时间通过group_replication_member_expel_timeout设置。
2.3.3 自动重新加入(Auto-rejoin)
当故障节点恢复后,会发现自己被移除出了集群。这时,这个节点会尝试自动加入集群。自动加入集群的过程和START GROUP REPLICATION不同。这个过程不需要做全局恢复(Global Recovery)。全局恢复需要通过group_replication_recovery异步通道复制加入集群前的数据。而自动加入时,所有的数据都是通过XCOM复制,包括加入前的数据。
和自动加入功能紧密相关的一个参数是group_replication_message_cache_size. 它定义了XCOM数据缓存的大小。当缓存无法保存所有数据时,就会将老的数据清除掉。如果缓存太小或者节点故障的时间过长,可能会导致一部分数据无法通过XCOM复制的情况发生。这时自动加入就会失败,必须要通过START GROUP REPLICATION 方式加入集群。
3.产品竞争力
3.1 更经济:备节点开放读
在经济性上,RDS MySQL集群版备节点可读,无需再额外创建只读实例,可快速实现线性读能力扩展,大幅度缩减了资源开销和资源闲置成本。对比以往的高可用加只读实例,在相同读写能力下,集群版最高可节省40%的成本。RDS MySQL集群版实例支持通过集群可读地址或独享代理两种方式访问备节点。
3.1.1 通过集群可读地址访问备节点
RDS MySQL集群版实例可以免费创建集群可读地址,集群可读地址支持将多个备节点添加到一个连接地址进行访问,实现多个备节点的连接数负载均衡,同时支持灵活调配备节点的访问权重,满足不同场景下的负载分摊需求。
3.1.2 通过独享代理访问备节点
RDS MySQL集群版实例同时支持通过开通代理实例实现主备节点的读写分离。相较于集群可读地址,独享代理提供了更多高阶的能力,包括:自动读写分离、连接池、延迟阈值、事务拆分等。
3.2 更灵活:按需增删节点&按需调整复制模式
在灵活性上,区别于传统的固定节点数形态,RDS MySQL集群版实现了节点数可变的拓扑管理,支持2 ~ 3节点,即一主一备或一主两备,主备数据复制方式支持异步或半同步。用户可以在创建实例的时候选择备节点数,也可以在实例创建后,根据实际的业务负载需求,按需增删节点。
同时,RDS MySQL集群版提供了节点级别的监控数据,用户可以直观的看到每个节点的监控情况。
3.3 更可靠:多可用区容灾
在可靠性上,相较于高可用版一主一备两个可用区容灾,因为RDS MySQL集群版每个备节点都参与选主以及单独配置可用区,所以RDS MySQL集群版支持三可用区容灾,集群版三节点跨三可用区的SLA最高可达99.99%。
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进行咨询!
目前RDS MySQL集群版包月8.5折、包年7.5折的优惠活动,请点击「阅读原文」了解优惠活动详情。
/ End /