AdminAPI包含对InnoDB ReplicaSet的支持,使您能够以类似于管理InnoDB cluster的方式构建与管理基于异步GTID的复制的一组MySQL实例。InnoDB ReplicaSet由一个主节点和多个从节点构成。您可以使用ReplicaSet对象和AdminAPI操作管理复制集,例如检查InnoDB复制集的状态,并在发生故障时手动故障转移到新的主服务器。与InnoDB cluster类似,MySQL Router支持针对InnoDB replicset的引导,这意味着您可以自动配置MySQL Router以使用InnoDB replicset,而无需手动配置文件。这使得InnoDB ReplicaSet成为一种快速简便的方法,可以启动和运行MySQL复制和MySQL Router,非常适合扩展读取,并在不需要InnoDB集群提供高可用性的用例中提供手动故障转移功能。
与InnoDB集群相比,InnoDB复制集有几个限制,因此,建议尽可能部署InnoDB Cluster。
通常,InnoDB Cluster集本身并不提供高可用性。InnoDB复制集的局限性包括:
1.没有自动故障转移。在主服务器不可用的情况下,需要使用AdminAPI手动触发故障转移,然后才能再次进行任何更改。但是,从实例仍然可供读取。
2.由于意外停止或不可用,无法防止部分数据丢失。到暂停时尚未应用的事务可能会丢失。
3.在崩溃或不可用之后,没有针对不一致性的保护。如果故障转移在前一个主节点仍然可用(例如由于网络分区)的情况下提升从节点,则可能会由于脑裂而导致不一致。
以与InnoDB cluster相似的方式部署InnoDB ReplicaSet。首先配置一些MySQL服务器实例,最少配置两个实例。
InnoDB ReplicaSet 先决条件
要使用InnoDB ReplicaSet,您应该了解以下先决条件:
1.只支持运行MySQL8.0及更高版本的实例。
2.仅支持基于GTID的复制。
3.支持一多从。
4.副本集必须完全由MySQL Shell来进行管理,不支持对MySQL Shell外部实例进行配置更改。
IP | 操作系统 | 安装软件及版本 | hostname |
---|---|---|---|
10.210.1.1 | centos7.x | mysql-shell-8.0.19-1.el7.x86_64 | mysqlmonitor |
10.210.1.2 | centos7.x | mysql-community-server-8.0.19-1.el7.x86_64,mysql-router-community-8.0.19-1.el7.x86_64 | mysqlnode1 |
10.210.1.3 | centos7.x | mysql-community-server-8.0.19-1.el7.x86_64,mysql-router-community-8.0.19-1.el7.x86_64 | mysqlnode2 |
软件安装步骤略过
使用dba.configureReplicaSetInstance(instance)配置要在副本集中使用的每个实例。MySQL Shell可以连接到一个实例,然后对其进行配置,也可以传入实例来配置特定的远程实例。如何继续取决于实例是否支持持久化设置。
首先在10.210.1.1输入mysqlsh连接上服务器10.210.1.2
MySQL JS > \connect root@10.210.1.2:3306
配置完实例后,连接到实例并使用dba.createReplicaSet() 创建使用MySQL异步复制的托管ReplicaSet,而不是InnoDB cluster使用的MySQL Group Replication。MySQL Shell当前连接到的MySQL实例用作Replication的初始主实例。此操作仅支持TCP/IP连接。 createReplicaSet()操作执行若干检查,以确保实例状态和配置与托管Replication兼容,如果兼容,则在实例上初始化元数据架构。如果您想检查操作,但实际上没有对实例进行任何更改,请使用dryRun选项。这显示了MySQL Shell将采取哪些操作来创建ReplicaSet。如果ReplicaSet创建成功,则返回一个ReplicaSet对象。因此,最好将返回的ReplicaSet赋给一个变量。这使您能够使用ReplicaSet,例如通过调用ReplicaSet.status()操作。下面的例子是在实例mysqlnode1创建一个叫做example的ReplicaSet
\connect root@10.210.1.2:3306
var rs = dba.createReplicaSet("example")
rs.status()
{
"replicaSet": {
"name": "example",
"primary": "mysqlnode1:3306",
"status": "AVAILABLE",
"statusText": "All instances available.",
"topology": {
"mysqlnode1:3306": {
"address": "mysqlnode1:3306",
"instanceRole": "PRIMARY",
"mode": "R/W",
"status": "ONLINE"
}
},
"type": "ASYNC"
}
}
添加第二节点
rs.addInstance('root@10.210.1.3')
rs.status()
{
"replicaSet": {
"name": "example",
"primary": "mysqlnode1:3306",
"status": "AVAILABLE",
"statusText": "All instances available.",
"topology": {
"mysqlnode1:3306": {
"address": "mysqlnode1:3306",
"instanceRole": "PRIMARY",
"mode": "R/W",
"status": "ONLINE"
},
"mysqlnode2:3306": {
"address": "mysqlnode2:3306",
"instanceRole": "SECONDARY",
"mode": "R/O",
"replication": {
"applierStatus": "APPLIED\_ALL",
"applierThreadState": "Slave has read all relay log; waiting for more updates",
"receiverStatus": "ON",
"receiverThreadState": "Waiting for master to send event",
"replicationLag": null
},
"status": "ONLINE"
}
},
"type": "ASYNC"
}
}
下一次连接需要输入接入集群
var rs = dba.getReplicaSet()
通过\help命令可以查看帮助文档
通过
\? ReplicaSet
可以查看帮助文档
如果要删除集群需要先通过removeInstance删除第二节点,再通过stop slave 以及reset slave all,并删除mysql_innodb_cluster_metadata数据库实现
之前的8.0.18 的clone插件已经大大简化了主从复制的构建,8.0.19在这基础上更近一步.通过mysql shell近一步简化了操作.可自建平台调用mysqlshell完成实例的构建和管理.对比innodb cluster该部署方式性能上有一定提升,后续将会写mysql8.0.19关于innodb cluster与ReplicaSet(基于gtid的主从复制)的压力测试对比报告.
官方文档地址
https://dev.mysql.com/doc/refman/8.0/en/mysql-innodb-replicasets.html
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。