重磅新品!MySQL InnoDB ClusterSet

最近属实有些忙碌,距MySQL 8.0.27的发布已经过去一个多月的时间了,还没有仔细研究8.0.27的发布内容。经过一番研究,8.0.27版本看似平淡无奇,实则不然,在这个版本里面推出了一款新品——MySQL InnoDB ClusterSet。下面让我们来一探究竟。

相信熟悉MySQL的小伙伴对MySQL的高可用方案有一定的了解,按照自动化程度和高可用级别排序:MySQL Replication->MySQL ReplicaSet->MySQL Group Replication->MySQL InnoDB Cluster,从现在开始,还要在后面再加上MySQL InnoDB ClusterSet。相信这一系列的名词对刚接触MySQL的小伙伴而言有些”烧脑“,不要灰心,这一系列的名词所代表的含义可以从”MySQL数据库架构——高可用性演进“文章里获得。

MySQL InnoDB ClusterSet是什么?

MySQL InnoDB ClusterSet 通过将作为主集群的 InnoDB Cluster 与部署在其他位置(例如不同数据中心)的一个或多个副本链接,为 InnoDB Cluster 部署提供容灾能力。InnoDB ClusterSet 使用专用的 ClusterSet 复制通道自动管理从主集群到副本集群的复制。如果主集群由于数据中心损坏或网络连接丢失而变得无法使用,用户可以激活副本集群以恢复服务的可用性。

图片

InnoDB ClusterSet 部署中的主 InnoDB Cluster 和副本集群之间的紧急故障转移可以由管理员通过 MySQL Shell,使用 AdminAPI触发,同时,管理员也可以在主集群仍然可用时执行从主集群到副本集群的主动切换。MySQL Router自动将客户端应用程序路由到 InnoDB ClusterSet 部署中的正确集群。

InnoDB ClusterSet 部署中的副本集群无法接受写入处理,但是可以提供读取。所有的数据需要写入到主集群的主要成员。由于集群间采用异步复制进行数据同步,可能会产生数据延迟,因此在进行紧急故障转移时数据可能会产生缺失。副本集群可以由单个MySQL实例构成,但为了容错,建议至少部署三个成员实例。如果需要更多成员,用户可以随时通过 MySQL Shell 使用 AdminAPI 添加更多实例。InnoDB ClusterSet 部署中可以拥有的副本集群数量没有定义限制。

需要注意,InnoDB ClusterSet 在设计上优先考虑可用性而不是数据一致性,以最大限度地提高容灾能力。因此,在主集群发生故障时,应该优先考虑修复主集群,如果短时间内无法对其进行修复,可以由管理员实施紧急故障转移。

MySQL InnoDB ClusterSet的限制和要求有哪些?

部署使用MySQL InnoDB ClusterSet有如下要求和限制:

  • MySQL服务器版本为8.0.27之后
  • 新加入的InnoDB Cluster不能是已有MySQL InnoDB ClusterSet的一部分
  • InnoDB Cluster必须使用单主模式
  • 任何成员服务器上都不能有来自组外服务器的入站复制通道
  • 在创建 InnoDB ClusterSet 部署时,InnoDB Cluster 必须在线,并且其主要成员服务器必须可以使用 MySQL Shell 访问
  • MySQL Shell与MySQL Router均须使用8.0.27之后版本
  • InnoDB ClusterSet 优先考虑可用性而不是一致性,以最大限度地提高容灾能力。如果用户不能容忍故障转移期间事务或数据的任何丢失,那么不要使用 InnoDB ClusterSet ,可以考虑使用单个 InnoDB Cluster
  • InnoDB ClusterSet 不会自动故障转移到副本集群。需要管理员确认后执行操作。
  • InnoDB ClusterSet 只支持异步复制,不能使用半同步复制
  • InnoDB ClusterSet 部署只能包含一个读写主集群。所有副本集群都是只读的。不允许使用具有多个主集群的双活设置,因为在集群发生故障时无法保证数据一致性。
  • 一个 InnoDB Cluster 只能参与一个 InnoDB ClusterSet 部署
  • InnoDB ClusterSet 不支持使用运行 MySQL Server 5.7 的实例

如何部署 MySQL InnoDB ClusterSet?

部署InnoDB ClusterSet 时,需要按照以下步骤操作:

  1. 使用 MySQL Shell 连接到现有 InnoDB Cluster 中的任何成员服务器
    mysql-js> connect icadmin@127.0.0.1:3310
  2. 执行dba.getCluster()命令以获取Cluster表示 InnoDB Cluster的 对象
    mysql-js> cluster1 = dba.getCluster()<Cluster:clusterone>
  3. 使用返回的Cluster对象执行命令cluster.createClusterSet() ,以现有 InnoDB Cluster 作为主集群创建 InnoDB ClusterSet
    mysql-js> myclusterset = cluster1.createClusterSet('testclusterset')
  4. 使用返回的ClusterSet 对象发出命令clusterSet.status() 来验证创建的 InnoDB ClusterSet 部署是否正常
    mysql-js> myclusterset.status()
  5. 通过dba.configureInstance()带有clusterAdmin选项的命令,在将成为副本集群一部分的每个独立服务器实例上创建 InnoDB Cluster 配置帐户 
    mysql-js> dba.configureInstance('root@127.0.0.1:4410', {clusterAdmin: 'icadmin'})
  6. 使用 InnoDB Cluster 服务器配置帐户连接到已在 InnoDB ClusterSet 部署中的主集群中的任何活动实例。
  7. 使用ClusterSet对象执行clusterSet.createReplicaCluster() 命令来创建副本集群,命名其中一个独立服务器实例
    mysql-js> cluster2 = myclusterset.createReplicaCluster("127.0.0.1:4410", "clustertwo", {recoveryProgress: 1, timeout: 10}) 
  8. 使用由Cluster为副本集群返回的对象 clusterSet.createReplicaCluster(),执行cluster.addInstance命令,命名另一个独立服务器实例
    mysql-js> cluster2.addInstance('icadmin@127.0.0.1:4420')
  9. 重复 cluster.addInstance 操作以将所有独立服务器实例添加到副本集群。建议最少三个实例以容错
  10. 验证完成的副本集群和 InnoDB ClusterSet 部署是否健康
    mysql-js> myclusterset.status({extended: 1})以上内容是关于InnoDB ClusterSet的一个简要介绍,关于更详细的内容请访问官网 https://dev.mysql.com/doc/mysql-shell/8.0/en/innodb-clusterset.html感谢您关注“MySQL解决方案工程师”!

声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/190983.html

联系我们
联系我们
分享本页
返回顶部