20.2.4 InnoDB 群集的沙箱部署

本节说明如何设置沙箱 InnoDB 集群部署。您可以使用带有随附的 AdminAPI 的 MySQL Shell 创建和 ManagementInnoDB 集群。本节假定您熟悉 MySQL Shell,有关更多信息,请参见MySQL Shell 8.0(MySQL 8.0 的一部分)

最初部署和使用 MySQL 的本地沙箱实例是开始探索 InnoDB 集群的好方法。在部署到生产服务器上之前,您可以在本地全面测试 InnoDB 集群。 MySQL Shell 具有内置功能,可用于创建沙盒实例,这些实例已正确配置为在本地部署的方案中可与组复制一起使用。

Important

沙盒实例仅适合在本地计算机上部署和运行以进行测试。在生产环境中,MySQL Server 实例被部署到网络上的各种主机上。有关更多信息,请参见第 20.2.5 节“ InnoDB 集群的生产部署”

本教程显示了如何使用 MySQL Shell 创建由三个 MySQL 服务器实例组成的 InnoDB 集群。

部署沙箱实例

MySQL Shell 包含添加dba全局变量的 AdminAPI,该全局变量提供用于 Management 沙箱实例的功能。在此示例设置中,您将使用dba.deploySandboxInstance()创建三个沙箱实例。

发出以下命令,从命令提示符启动 MySQL Shell:

shell> mysqlsh

除了本机 SQL 模式外,MySQL Shell 还提供了两种脚本语言模式,即 JavaScript 和 Python。在本指南中,MySQL Shell 主要用于 JavaScript 模式。 MySQL Shell 启动时,默认情况下处于 JavaScript 模式。通过发出\js(对于 JavaScript 模式),\py(对于 Python 模式)和\sql(对于 SQL 模式)来切换模式。通过发出\js命令来确保您处于 JavaScript 模式,然后执行:

mysql-js> dba.deploySandboxInstance(3310)

Note

在 JavaScript 和 Python 模式下,不需要使用分号终止命令。

传递给deploySandboxInstance()的参数是 MySQL 服务器实例在其中侦听连接的 TCP 端口号。默认情况下,沙箱是在 Unix 系统上的名为$HOME/mysql-sandboxes/port的目录中创建的。对于 Microsoft Windows 系统,目录为%userprofile%\MySQL\mysql-sandboxes\port

提示 Importing 实例的根密码。

Important

每个实例都有其自己的密码。在本教程中,为所有沙箱定义相同的密码会更容易,但是请记住,在生产部署中为每个实例使用不同的密码。

要部署更多的沙箱服务器实例,请对端口 3310 的沙箱实例重复执行以下步骤,选择其他端口号。对于每个其他沙箱实例问题:

mysql-js> dba.deploySandboxInstance(port_number)

要遵循本教程,请对三个沙箱服务器实例使用端口号 3310、3320 和 3330.问题:

mysql-js> dba.deploySandboxInstance(3320)
mysql-js> dba.deploySandboxInstance(3330)

创建沙盒 InnoDB 集群

下一步是在连接到种子 MySQL Server 实例时创建 InnoDB 集群。种子实例包含要复制到其他实例的数据。在此示例中,沙箱实例为空白,因此我们可以选择任何实例。

将 MySQL Shell 连接到种子实例,在这种情况下,将其连接到端口 3310:

mysql-js> \connect root@localhost:3310

\connect MySQL Shell 命令是shell.connect()方法的快捷方式:

mysql-js> shell.connect('root@localhost:3310')

构建连接后,AdminAPI 可以写入本地实例的选项文件。这与生产部署不同,在生产部署中,需要先连接到远程实例并在实例上本地运行 MySQL Shell 应用程序,然后 AdminAPI 才能写入实例的选项文件。

使用dba.createCluster()方法以当前连接的实例作为种子创建 InnoDB 集群:

mysql-js> var cluster = dba.createCluster('testCluster')

createCluster()方法将 InnoDB 集群元数据部署到所选实例,并将您当前连接的实例添加为种子实例。 createCluster()方法返回创建的群集,在上面的示例中,该群集被分配给cluster变量。传递给createCluster()方法的参数是为此 InnoDB 集群提供的符号名称,在本例中为testCluster

Tip

如果实例具有super_read_only=ON,则可能需要确认 AdminAPI 可以设置super_read_only=OFF。有关更多信息,请参见超级只读和实例

将实例添加到 InnoDB 集群

下一步是向 InnoDB 集群添加更多实例。种子实例执行的所有事务都会在添加时由每个辅助实例重新执行。本教程使用先前在端口 3320 和 3330 创建的沙箱实例。

此示例中的种子实例是最近创建的,因此几乎为空。因此,几乎没有数据需要从种子实例复制到辅助实例。在生产环境中,种子实例上具有现有数据库,则可以使用 MySQL Enterprise Backup 之类的工具来确保在复制开始之前,辅助数据库具有匹配的数据。这样可以避免在将数据从主数据库复制到辅助数据库时出现长时间延迟的可能性。参见第 17.4.4 节“将 MySQL Enterprise Backup 与组复制一起使用”

将第二个实例添加到 InnoDB 集群:

mysql-js> cluster.addInstance('root@localhost:3320')

提示 Importingroot 用户的密码。

添加第三个实例:

mysql-js> cluster.addInstance('root@localhost:3330')

提示 Importingroot 用户的密码。

至此,您已经创建了具有三个实例的集群:一个主实例和两个辅助实例。

Tip

如果实例是沙箱实例,则只能在addInstance()中指定localhost。这也适用于发出createCluster()之后的隐式addInstance()

坚持配置

将沙箱实例添加到群集后,必须将 InnoDB 群集所需的配置持久化到该实例的每个选项文件中。连接到每个实例。

mysql-js> \connect instance

问题dba.configureLocalInstance(instance)

mysql-js> dba.configureLocalInstance('instance')

提示您 Importing 实例的密码。配置更改将持久保存到实例。

Important

如果连接到实例时未发出dba.configureLocalInstance(),则配置不会持久保存到选项文件中。这不会阻止实例最初加入集群,但这确实意味着实例无法自动重新加入集群,例如在停止之后。

重复连接到添加到群集的每个沙箱实例并保留配置的过程。在此示例中,我们在端口 3310、3320 和 3330 处添加了沙箱实例。因此,请为端口 3320 和 3330 发出此实例:

mysql-js> \connect root@localhost:port_number
mysql-js> dba.configureLocalInstance('root@localhost:port_number')

要检查是否已创建集群,请使用集群实例的status()函数。参见检查 InnoDB 集群状态

部署群集后,可以配置 MySQLRouter 以提供高可用性,请参阅第 20.3 节“将 MySQLRouter 与 InnoDB 集群一起使用”