全面上市前:2022-11-17
示例任务使用带有 AdminAPI 的沙箱部署来部署 InnoDB 集群。
部署和使用 MySQL 的本地沙箱实例使您能够在部署到生产服务器之前在本地测试功能。AdminAPI 具有用于创建沙盒实例的内置功能,这些实例被预先配置为在本地部署的场景中与 InnoDB Cluster、InnoDB ClusterSet 和 InnoDB ReplicaSet 一起使用。
沙盒实例仅适用于出于测试目的在本地机器上部署和运行。
要提供对一次故障的容忍度,请创建一个具有三个实例的 InnoDB 集群。在此示例中,您使用在同一台计算机上运行的三个沙箱实例。在真实世界的设置中,这三个实例可以在网络上的不同主机上运行。
打开 MySQL Shell 控制台会话。
-
将活动语言更改为 Python:
\py
-
要创建和启动 MySQL 沙箱实例,请使用该
dba.deploy_sandbox_instance()
方法。在 MySQL Shell 中发出以下三个语句并为每个实例输入根密码:dba.deploy_sandbox_instance(3310) dba.deploy_sandbox_instance(3320) dba.deploy_sandbox_instance(3330)
笔记对所有实例使用相同的 root 密码。
要创建 InnoDB 集群,请完成以下步骤:
-
连接到您希望成为 InnoDB 集群中主实例的 MySQL 实例。
shell.connect('root@localhost:3310')
-
发出
dba.create_cluster()
创建名为 的 InnoDB 集群的方法devCluster
,并使用分配的变量cluster
来保存输出值:cluster = dba.create_cluster('devCluster')
此命令输出:
将在实例“localhost:3310”上创建一个新的 InnoDB 集群。 正在 localhost:3310 验证实例配置... 注意:实例被检测为沙盒。 请注意,沙箱实例仅适用于部署测试集群 在同一主机内使用。 此实例将其自身地址报告为 127.0.0.1:3310 实例配置合适。 注意:组复制将使用“127.0.0.1:33101”与其他成员通信。 使用 localAddress 选项覆盖。 在“127.0.0.1:3310”上创建 InnoDB 集群“devCluster”... 添加种子实例... 集群创建成功。使用 Cluster.addInstance() 添加 MySQL 实例。 集群至少需要3个实例才能承受高达 一台服务器故障。 <集群:devCluster>
-
cluster.status()
通过使用具有分配变量 的方法验证创建是否成功cluster
:cluster.status()
输出以下状态:
{ “clusterName”:“devCluster”, “默认副本集”:{ “名称”:“默认”, “主要”:“127.0.0.1:3310”, “ssl”:“必需”, “状态”:“OK_NO_TOLERANCE”, "statusText": "集群不能容忍任何故障。", “拓扑”:{ “127.0.0.1:3310”:{ “地址”:“127.0.0.1:3310”, "memberRole": "主要", “模式”:“读/写”, “读取副本”:{}, “复制滞后”:空, “角色”:“哈”, “状态”:“在线”, “版本”:“8.0.28” } }, “topologyMode”:“单主” }, “groupInformationSourceMember”: “127.0.0.1:3310”}
-
集群已启动并正在运行,但还不能容忍故障。使用以下方法将另一个 MySQL 服务器实例添加到集群
add_instance()
:{ cluster.add_instance('root@localhost:3320')
输出是:
注意:目标实例“127.0.0.1:3320”尚未预先配置 (GTID 集为空)。 Shell 无法决定是否进行增量状态恢复 可以正确配置它。最安全方便的方式 提供新实例是通过自动克隆提供, 这将完全覆盖“127.0.0.1:3320”的状态 来自现有集群成员的物理快照。要使用这个 默认情况下,将“recoveryMethod”选项设置为“clone”。 如果你确定所有的增量状态恢复可以安全地使用 在集群中执行过的更新是在启用 GTID 的情况下完成的, 没有被清除的事务并且新实例包含 与集群或其子集相同的 GTID 集。使用此方法 默认情况下,将“recoveryMethod”选项设置为“增量”。 请选择一种恢复方法 [C]lone/[I]incremental recovery/[A]bort (default Clone): ) }
-
从提示中选择一种恢复方法。选项是:
Clone
:克隆要添加到主集群的实例,删除实例包含的所有事务。MySQL 克隆插件会自动安装。假设您要添加一个空实例(尚未处理任何交易)或包含您不希望保留的交易的实例,请选择克隆选项。Incremental recovery
:使用异步复制将集群处理的所有事务恢复到加入实例。如果您确定集群曾经处理过的所有更新都是在GTID
启用全局事务 ID ( ) 的情况下完成的,则增量恢复是合适的。没有清除事务,新实例包含与GTID
集群相同的集合或它的子集。
在此示例中,选择C 表示
Clone
:选择
Clone
选项后,输出为:请选择恢复方式 [C]lone/[I]增量恢复/[A]bort(默认克隆):C 正在 localhost:3320 验证实例配置... 注意:实例被检测为沙盒。 请注意,沙箱实例仅适用于部署测试集群 在同一主机内使用。 此实例将其自身地址报告为 127.0.0.1:3320 实例配置合适。 注意:组复制将使用“127.0.0.1:33201”与其他成员通信。 使用 localAddress 选项覆盖。 一个新实例将被添加到 InnoDB 集群中。取决于数量 集群上的数据,这可能需要几秒钟到几个小时。 将实例添加到集群... 监控新集群成员的恢复过程。按 ^C 停止监听 让它在后台继续。 基于克隆的状态恢复正在进行中。 注意:作为克隆过程的一部分,预计会发生服务器重启。如果 服务器不支持 RESTART 命令或在 同时,您可能需要手动重新启动它。 * 等待克隆完成... 注意:127.0.0.1:3320 是从 127.0.0.1:3310 克隆而来的 **阶段删除数据:已完成 ** 克隆转移 文件复制################################################ ############ 100% 完成 页面复制 ################################################ ############ 100% 完成 重做复制################################################ ############ 100% 完成 注意:127.0.0.1:3320 正在关闭... * 等待服务器重启...准备就绪 * 127.0.0.1:3320 已重新启动,等待克隆完成... **阶段重启:已完成 * 克隆过程已完成:大约 1 秒内传输了 72.61 MB(~72.61 MB/s) “127.0.0.1:3320”的状态恢复已经完成 实例“127.0.0.1:3320”已成功添加到集群中。
-
添加创建的第三个实例并再次选择
C
克隆恢复方法:cluster.add_instance('root@localhost:3330')
-
通过输入以下命令检查集群的状态:
cluster.status()
这将输出以下内容:
{ "clusterName": "devCluster", “默认副本集”:{ “名称”:“默认”, “主要”:“127.0.0.1:3310”, “ssl”:“必需”, “状态”:“好的”, "statusText": "集群在线并且最多可以容忍一次故障。", “拓扑”:{ “127.0.0.1:3310”:{ “地址”:“127.0.0.1:3310”, "memberRole": "主要", “模式”:“读/写”, “读取副本”:{}, “复制滞后”:空, “角色”:“哈”, “状态”:“在线”, “版本”:“8.0.28” }, “127.0.0.1:3320”:{ “地址”:“127.0.0.1:3320”, "memberRole": "次要", “模式”:“R/O”, “读取副本”:{}, “复制滞后”:空, “角色”:“哈”, “状态”:“在线”, “版本”:“8.0.28” }, “127.0.0.1:3330”:{ “地址”:“127.0.0.1:3330”, "memberRole": "次要", “模式”:“R/O”, “读取副本”:{}, “复制滞后”:空, “角色”:“哈”, “状态”:“在线”, “版本”:“8.0.28” } }, “topologyMode”:“单主” }, “groupInformationSourceMember”:“127.0.0.1:3310” } InnoDB集群设置成功!
集群现在最多可以容忍一次故障。
停止主实例,检查 InnoDB Cluster 的状态,最后重启实例。
-
使用
dba.kill_sandbox_instance()
方法停止 MySQL 服务器实例:dba.kill_sandbox_instance(3310)
输出是:
杀死 MySQL 实例... 实例 localhost:3310 成功终止。
-
检查 InnoDB Cluster 的状态:
cluster.status()
输出是:
{ "clusterName": "devCluster", “默认副本集”:{ “名称”:“默认”, “主要”:“127.0.0.1:3320”, “ssl”:“必需”, “状态”:“OK_NO_TOLERANCE”, "statusText": "集群不能容忍任何故障。 1 位成员不活跃。", “拓扑”:{ “127.0.0.1:3310”:{ “地址”:“127.0.0.1:3310”, "memberRole": "次要", “模式”:“不适用”, “读取副本”:{}, “角色”:“哈”, “外壳连接错误”: “MySQL 错误 2003:无法打开与“127.0.0.1:3310”的连接: 无法连接到“127.0.0.1:3310”(10061) 上的 MySQL 服务器, “状态”:“(失踪)” }, “127.0.0.1:3320”:{ “地址”:“127.0.0.1:3320”, "memberRole": "主要", “模式”:“读/写”, “读取副本”:{}, “复制滞后”:空, “角色”:“哈”, “状态”:“在线”, “版本”:“8.0.28” }, “127.0.0.1:3330”:{ “地址”:“127.0.0.1:3330”, "memberRole": "次要", “模式”:“R/O”, “读取副本”:{}, “复制滞后”:空, “角色”:“哈”, “状态”:“在线”, “版本”:“8.0.28” } }, “topologyMode”:“单主” }, “groupInformationSourceMember”:“127.0.0.1:3320” }
正式运行在 3310 端口的 MySQL 服务器实例是
MISSING
. -
dba.start_sandbox_instance()
通过使用端口号 发出方法来重新启动这个丢失的实例 :dba.start_sandbox_instance(3310)
检查集群的状态显示该实例已在集群中恢复为活动状态,但作为次要成员:
cluster.status()
输出是:
{ "clusterName": "devCluster", “默认副本集”:{ “名称”:“默认”, “主要”:“127.0.0.1:3320”, “ssl”:“必需”, “状态”:“好的”, "statusText": "集群在线并且最多可以容忍一次故障。", “拓扑”:{ “127.0.0.1:3310”:{ “地址”:“127.0.0.1:3310”, "memberRole": "次要", “模式”:“R/O”, “读取副本”:{}, “复制滞后”:空, “角色”:“哈”, “状态”:“在线”, “版本”:“8.0.28” }, “127.0.0.1:3320”:{ “地址”:“127.0.0.1:3320”, "memberRole": "主要", “模式”:“读/写”, “读取副本”:{}, “复制滞后”:空, “角色”:“哈”, “状态”:“在线”, “版本”:“8.0.28” }, “127.0.0.1:3330”:{ “地址”:“127.0.0.1:3330”, "memberRole": "次要", “模式”:“R/O”, “读取副本”:{}, “复制滞后”:空, “角色”:“哈”, “状态”:“在线”, “版本”:“8.0.28” } }, “topologyMode”:“单主” }, “groupInformationSourceMember”:“127.0.0.1:3320” }
所有实例都重新上线,InnoDB Cluster 可以再次容忍一次故障。