部署InnoDB ReplicaSet
您以与InnoDB群集类似的方式部署InnoDB ReplicaSet。首先,您配置一些MySQL服务器实例,最少为两个实例。在本教程中,其中一个作为主要功能rs-1
;在本教程中,其他实例充当辅助实例rs-2
;复制主数据库应用的事务。这等效于异步MySQL复制中已知的主服务器和从服务器。然后,使用MySQL Shell连接到实例之一,并创建一个副本集。创建副本集后,您可以向其添加实例。
InnoDB ReplicaSet与沙箱实例兼容,您可以将其用于本地部署(例如出于测试目的)。有关说明,请参阅部署沙盒实例。但是,本教程假定您正在部署生产InnoDB ReplicaSet,其中每个实例都在不同的主机上运行。
InnoDB ReplicaSet先决条件
要使用InnoDB ReplicaSet,您应该了解以下先决条件:
- 仅支持运行MySQL 8.0及更高版本的实例
- 仅支持基于GTID的复制,二进制日志文件位置复制与InnoDB ReplicaSet不兼容
- 仅支持基于行的复制(RBR),不支持基于语句的复制(SBR)
- 不支持复制过滤器
- 在任何情况下都不允许非托管复制通道
- 一个副本集最多包含一个主实例,并且支持一个或多个第二实例。尽管可以添加到副本集的辅助副本数量没有限制,但是连接到副本集的每个MySQL路由器都会监视每个实例。因此,添加到副本集的实例越多,必须执行的监视越多。
- 复制集必须完全由MySQL Shell管理。例如,复制帐户由MySQL Shell创建和管理。不支持在MySQL Shell之外对实例进行配置更改,例如,直接使用SQL语句更改主实例。始终使用MySQL Shell与InnoDB ReplicaSet一起使用。
AdminAPI和InnoDB ReplicaSet使您可以在不深入了解基础概念的情况下使用MySQL复制。但是,有关背景信息,请参见复制。
配置InnoDB副本集实例
使用配置要在副本集中使用的每个实例。MySQL Shell可以连接到实例然后进行配置,也可以传入以配置特定的远程实例。进行方式取决于实例是否支持持久设置,请参阅持久设置。例如,在不支持持久设置的实例上,以适当的权限与用户连接以配置实例:dba.configureReplicaSetInstance(instance)
instance
mysql-js> \connect root@example1.com:3306
dba.configureReplicaSetInstance()
如果clusterAdmin
提供该功能,则该功能可以选择创建管理员帐户。创建的帐户具有管理InnoDB集群和InnoDB ReplicaSet所需的正确特权集。创建用户以管理副本集的首选方法是使用该clusterAdmin
选项。
在同一群集或副本集的所有实例中,管理员帐户必须具有相同的用户名和密码。
要rs-1:3306
使用名为rsadmin
issue 的集群管理员在处配置实例,请执行以下操作:
mysql-js> dba.configureReplicaSetInstance('root@rs-1:3306', \ {clusterAdmin: "'rsadmin'@'rs-1%'"});
交互式提示要求指定用户所需的密码。要配置MySQL Shell当前连接的实例,可以指定一个空实例定义。例如问题:
mysql-js> dba.configureReplicaSetInstance('', {clusterAdmin: "'rsadmin'@'rs-1%'"});
交互式提示要求指定用户所需的密码。这将检查当前与MySQL Shell连接的实例是否可在InnoDB ReplicaSet中使用。如果可能,请配置与InnoDB ReplicaSet不兼容的设置。使用InnoDB ReplicaSet所需的特权创建集群管理员帐户。
创建一个InnoDB副本集
配置完实例后,连接到实例并用于dba.createReplicaSet()
创建使用MySQL异步复制(而不是InnoDB群集使用的MySQL组复制)的托管副本集。MySQL Shell当前连接到的MySQL实例用作副本集的初始主实例。此操作仅支持TCP / IP连接。
该dba.createReplicaSet()
操作将执行多项检查,以确保实例状态和配置与托管副本集兼容,如果是,则在实例上初始化元数据架构。如果要检查操作,但实际上不对实例进行任何更改,请使用该dryRun
选项。这显示了MySQL Shell将采取哪些行动来创建副本集。如果成功创建了副本集,ReplicaSet
则返回一个对象。因此,最佳实践是将返回ReplicaSet
值分配给变量。这使您可以使用副本集,例如通过调用ReplicaSet.status()
操作。创建名为的副本集example
在实例上rs-1
并将其分配给rs
变量,发出:
mysql-js> \connect root@rs-1:3306 ... mysql-js>var rs = dba.createReplicaSet("example") Anew replicasetwith instance 'rs-1:3306' will be created. * Checking MySQL instance at rs-1:3306 This instance reports its own addressas rs-1:3306 rs-1:3306: Instance configuration is suitable. * Updating metadata... ReplicaSet object successfully createdfor rs-1:3306. Use rs.add_instance() to add more asynchronously replicated instances tothis replicaset and rs.status() to check its status.
要验证操作是否成功,您可以使用返回的ReplicaSet
对象。例如,这提供了ReplicaSet.status()
操作,该操作显示有关副本集的信息。我们已经将return分配ReplicaSet
给了变量rs
,所以发出:
mysql-js> rs.status() { "replicaSet": { "name": "example", "primary": "rs-1:3306", "status": "AVAILABLE", "statusText": "All instances available.", "topology": { "rs-1:3306": { "address": "rs-1:3306", "instanceRole": "PRIMARY", "mode": "R/W", "status": "ONLINE" } }, "type": "ASYNC" } }
此输出显示example
已创建名为的副本集,并且主副本集为rs-1
。当前只有一个实例,下一个任务是将更多实例添加到副本集。