7.2.1部署新的InnoDB生产集群

下面几节将介绍如何部署一个新的生产InnoDB集群。在此过程中为主机名集成电路,数量在例子中使用。

配置生产实例

AdminAPI提供dba.configureInstance ()函数检查一个实例是否适合InnoDB集群的使用,如果发现任何设置与InnoDB集群不兼容,则对该实例进行配置。你运行dba.configureInstance ()命令,它检查所有需要的设置,以使该实例用于InnoDB集群的使用。如果实例不需要更改配置,则不需要修改实例的配置dba.configureInstance ()命令的输出确认该实例已准备好使用InnoDB Cluster。如果要使实例与InnoDB Cluster兼容,需要进行任何更改,则会显示不兼容设置的报告,您可以选择让命令对实例的选项文件进行更改。根据MySQL Shell连接到实例的方式,以及在实例上运行的MySQL版本,您可以通过将这些更改持久化到远程实例的选项文件中,使这些更改永久存在第6.1.5节“持久设置”.不支持自动持久化配置更改的实例要求您在本地配置该实例,请参见使用dba.configureLocalInstance ().或者,您也可以手动更改实例的选项文件,参见使用选项文件更多信息。无论您以何种方式进行配置更改,都可能需要重新启动MySQL以确保检测到配置更改。

的语法dba.configureInstance ()命令是:

dba.configureInstance ([实例] [,选项])

在哪里实例是实例定义,和选项是具有配置操作的附加选项的数据字典。该操作返回关于结果的描述性文本消息。

实例定义是实例的连接数据。例如:

dba.configureInstance ('用户@例子3306”)

有关更多信息,请参见使用类似uri的字符串或键值对连接到服务器.如果目标实例已经属于一个InnoDB Cluster,则会产生错误并导致进程失败。

选项字典可以包含以下内容:

  • mycnfPath-实例的MySQL选项文件的路径。

  • outputMycnfPath-可选输出路径写入实例的MySQL选项文件。

  • 密码-连接所使用的密码。

  • clusterAdmin—要创建的InnoDB集群管理员用户名。支持的格式是标准的MySQL帐户名格式。支持用户名和主机名的标识符或字符串。默认情况下,如果不加引号,它假定输入是字符串。看到第6.1.7节“为管理创建用户帐户”

  • clusterAdminPassword—用于创建InnoDB集群管理员帐号的密码clusterAdmin.尽管您可以指定使用此选项,但这是一个潜在的安全风险。如果不指定此选项,但指定clusterAdmin选项,将在交互提示符中提示您输入密码。

  • 已弃用,计划在未来版本中删除

    clearReadOnly-用于确认的布尔值super_read_only应该设置为关闭,看到了吗超级只读和实例

  • 互动—一个布尔值,用于禁用命令执行中的交互向导,这样就不会向用户提供提示,也不会显示确认提示。

  • 重新启动-一个布尔值,用于指示应该执行目标实例的远程重新启动以完成操作。

尽管连接密码可以包含在实例定义中,但这是不安全的,不建议这样做。使用MySQL Shell第4.4节,“可插入密码存储”安全地存储实例密码。

一次dba.configureInstance ()该命令检查该实例的设置是否适合InnoDB Cluster的使用。显示一个报告,其中显示了InnoDB集群所需的设置。如果实例不需要改变它的设置,你可以在一个InnoDB集群中使用它,并可以继续创建集群.如果实例的设置对InnoDB集群的使用无效dba.configureInstance ()命令显示需要修改的设置。在配置实例之前,系统会提示您确认表中显示的更改,其中包含以下信息:

  • 变量-无效的配置变量。

  • 当前值-无效配置变量的当前值。

  • 要求值—配置变量的所需值。

如何进行取决于实例是否支持持久化设置,参见第6.1.5节“持久设置”.当dba.configureInstance ()是针对MySQL Shell当前运行的MySQL实例发出的,换句话说就是本地实例,它尝试自动配置该实例。当dba.configureInstance ()是针对远程实例发出的,如果该实例支持自动持久化配置更改,则可以选择这样做。如果一个远程实例不支持持久化更改来配置它以供InnoDB集群使用,你必须在本地配置该实例。看到使用dba.configureLocalInstance ()

通常,之后不需要重新启动实例dba.configureInstance ()配置选项文件,但对于某些特定的设置,可能需要重新启动。这些信息显示在发布后生成的报告中dba.configureInstance ().如果实例支持重新启动语句,MySQL Shell可以关闭然后启动实例。这确保了mysqld能够检测到对实例选项文件所做的更改。有关更多信息,请参见重新启动

请注意

在执行重新启动语句,则与实例的当前连接将丢失。如果启用了auto-reconnect功能,则服务器重启后将重新建立连接。否则,必须手动重新建立连接。

dba.configureInstance ()方法验证是否有合适的用户可用于集群使用(用于集群成员之间的连接),请参见第6.1.7节“为管理创建用户帐户”

如果您没有指定一个用户来管理集群,在交互模式下,向导允许您选择以下选项之一:

  • 为root用户启用远程连接,不建议在生产环境中使用

  • 创建一个新用户

  • 没有自动配置,在这种情况下,您需要手动创建用户

提示

如果实例具有super_read_only =对那么您可能需要确认AdminAPI可以设置super_read_only =了.看到超级只读和实例更多信息。

创建集群

准备好实例后,使用dba.createCluster ()函数来创建集群,使用MySQL Shell所连接的实例作为集群的种子实例。种子实例被复制到您添加到集群的其他实例中,使它们成为种子实例的副本。在这个过程中,ic-1实例被用作种子。当你发出dba.createCluster (的名字MySQL Shell创建一个经典的MySQL协议会话到连接到MySQL Shell当前全局会话的服务器实例。例如,要创建一个名为testCluster并将返回的集群分配给一个名为集群

mysql-js> var cluster = dba.createCluster('testCluster')在icadmin@ic-1:3306验证实例…这个实例报告它自己的地址作为ic-1实例配置是合适的。在“icadmin@ic-1:3306”上创建InnoDB集群testCluster…添加种子实例…集群创建成功。使用Cluster.addInstance()添加MySQL实例。集群至少需要3个实例才能承受最多一个服务器故障。

这种将返回的集群分配给变量的模式使您能够使用cluster对象的方法对集群执行进一步的操作。返回的Cluster对象使用一个新的会话,独立于MySQL Shell的全局会话。这确保了如果您更改MySQL Shell全局会话,Cluster对象将维护其到实例的会话。

要能够管理集群,必须确保您拥有一个具有所需特权的合适用户。推荐的方法是创建一个管理用户。如果在配置实例时没有创建管理用户,请使用集群.setupAdminAccount ()操作。例如,创建一个名为icadmin可以管理分配给变量的InnoDB集群集群问题:

mysql-js > cluster.setupAdminAccount (icadmin

看到配置AdminAPI用户有关集群管理用户的详细信息。

dba.createCluster ()操作支持MySQL Shell的互动选择。当互动时,在以下情况下会出现提示:

  • 当在属于集群的实例上运行时adoptFromGr选项为false时,将询问您是否希望采用现有的集群

  • 选项未使用(未设置为。真正的)时,系统会提示确认多主集群的创建

请注意

如果遇到与无法访问元数据相关的错误,则可能配置了环回网络接口。为了正确使用InnoDB集群,关闭环回接口。

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

提示

一旦服务器实例属于一个集群,只使用MySQL Shell和AdminAPI管理它们是很重要的。不支持在实例已添加到集群后手动更改该实例的组复制配置。类似地,修改对InnoDB集群至关重要的服务器变量,例如server_uuid使用AdminAPI配置实例后,不支持。

当您使用MySQL Shell 8.0.14及更高版本创建集群时,您可以设置实例从集群中驱逐之前的等待时间,例如当它们变得不可访问时。通过expelTimeout的选项dba.createCluster ()操作,该操作配置group_replication_member_expel_timeout变量。的expelTimeoutOption可设置为0 ~ 3600之间的整数值。所有运行MySQL server 8.0.13及以上版本的实例被添加到集群中expelTimeout都自动配置为具有相同的expelTimeout在种子实例上配置的值。

有关其他选项的信息,您可以传递到dba.createCluster (),请参阅第7.5节“使用InnoDB集群”

向集群中添加实例

使用集群.addInstance (实例函数向集群添加更多实例,其中实例连接信息是否已配置实例,参见配置生产实例.从8.0.17版本开始,组复制实现了考虑实例的补丁版本和集群.addInstance ()操作检测这一点,如果发生不兼容,则操作终止并出现错误。看到检查实例上的MySQL版本而且在一个组中组合不同的成员版本

集群中至少需要三个实例,才能容忍一个实例的失败。添加更多的实例将增加实例失败的容忍度。向集群问题中添加一个实例。

mysql-js> cluster. addinstance ('icadmin@ic-2:3306')根据集群上的数据量,这可能需要几秒钟到几个小时。请提供'icadmin@ic-2:3306': ********的密码。正在验证ic-2:3306实例…这个实例报告它自己的地址作为ic-2实例配置是合适的。实例“icadmin@ic-2:3306”成功加入集群。

当向集群添加一个新实例时,该实例的本地地址将自动添加到group_replication_group_seeds变量,以便允许它们在需要时使用新实例重新加入组。

请注意

中列出的实例group_replication_group_seeds是根据它们在列表中出现的顺序使用的。这确保优先使用用户指定的设置。看到定制InnoDB集群更多信息。

如果您使用的是MySQL 8.0.17或更高版本,您可以选择实例如何恢复与集群同步所需的事务。只有当连接实例恢复了集群以前处理的所有事务时,它才能作为在线实例加入并开始处理事务。有关更多信息,请参见第7.2.2节“使用InnoDB集群克隆MySQL”

同样在8.0.17和更高版本中,您可以配置如何集群.addInstance ()行为,让恢复操作在后台进行,或者在MySQL Shell中监视不同级别的进度。

根据您从集群中恢复实例所选择的选项,您将在MySQL Shell中看到不同的输出。假设您将实例ic-2添加到集群中,而ic-1是种子或供体。

  • 当你使用MySQL Clone从集群中恢复一个实例时,输出如下:

    正在验证ic-2:3306实例…这个实例报告它自己的地址ic-2:3306实例配置是合适的。一个新的实例将被添加到InnoDB集群中。根据集群上的数据量,这可能需要几秒钟到几个小时。正在向集群添加实例…监控新增集群成员的恢复进程。按^C停止监控,让它在后台继续。基于克隆的状态恢复正在进行中。注意:作为克隆过程的一部分,预计会发生服务器重新启动。如果服务器不支持RESTART命令或过一段时间后不返回,您可能需要手动将其重新启动。 * Waiting for clone to finish... NOTE: ic-2:3306 is being cloned from ic-1:3306 ** Stage DROP DATA: Completed ** Clone Transfer FILE COPY ############################################################ 100% Completed PAGE COPY ############################################################ 100% Completed REDO COPY ############################################################ 100% Completed NOTE: ic-2:3306 is shutting down... * Waiting for server restart... ready * ic-2:3306 has restarted, waiting for clone to finish... ** Stage RESTART: Completed * Clone process has finished: 2.18 GB transferred in 7 sec (311.26 MB/s) State recovery already finished for 'ic-2:3306' The instance 'ic-2:3306' was successfully added to the cluster.

    应该注意有关服务器重新启动的警告,您可能必须手动重新启动一个实例。看到重新声明

  • 当你使用增量恢复从集群中恢复实例时,输出如下所示:

    增量分布式状态恢复正在进行中。*等待增量恢复完成…注意:'ic-2:3306'正在从'ic-1:3306'中恢复*分布式恢复已完成

要取消对恢复阶段的监视,发出控制+ C.这将停止监视,但恢复过程将在后台继续进行。的waitRecovery整数选项可与集群.addInstance ()操作来控制命令关于恢复阶段的行为。接受以下值:

  • 0:不要等待并让恢复过程在后台完成;

  • 1:等待恢复进程完成;

  • 2:等待恢复进程完成;并显示详细的静态进度信息;

  • 3:等待恢复进程完成;并显示详细的动态进度信息(进度条);

默认情况下,如果MySQL Shell运行的标准输出引用一个终端,则waitRecoveryOption默认为3。否则,它默认为2。看到监控恢复操作

要验证已经添加了实例,请使用集群实例的状态()函数。例如,这是添加第二个实例后沙箱集群的状态输出:

mysql-js > cluster.status(){“clusterName”:“testCluster”、“defaultReplicaSet”:{“名称”:“默认”,“主要”:“ic-1:3306”、“ssl”:“要求”,“状态”:“OK_NO_TOLERANCE”、“statusText”:“集群不容忍任何失败。”,“拓扑”:{" ic-1:3306 ":{“地址”:“ic-1:3306”、“模式”:“R / W”、“readReplicas”:{},“角色”:“哈”,“状态”:“在线”},“ic-2:3306”:{“地址”:“ic-2:3306”、“模式”:“R / O”、“readReplicas”:{},“角色”:“哈”,“状态”:"ONLINE"}}}, "groupInformationSourceMember": "mysql://icadmin@ic-1:3306"}

如何进行取决于该实例是本地的还是远程的,以及该实例是否支持自动持久化配置更改,参见第6.1.5节“持久设置”.如果实例支持自动持久化配置更改,则不需要手动持久化设置,可以添加更多实例或继续下一步。如果实例不支持自动持久化配置更改,则必须在本地配置该实例。看到使用dba.configureLocalInstance ().这对于确保实例在离开集群时重新加入集群非常重要。

提示

如果实例具有super_read_only =对那么您可能需要确认AdminAPI可以设置super_read_only =了.看到超级只读和实例更多信息。

一旦你部署了你的集群,你可以配置MySQL路由器提供高可用性,见章节6.4“使用AdminAPI、InnoDB集群和InnoDB副本集的MySQL路由器”

InnoDB集群创建的用户帐号

作为使用组复制的一部分,InnoDB集群创建内部恢复用户,启用集群内服务器之间的连接。这些用户位于集群内部,生成的用户的用户名遵循的命名方案mysql_innodb_cluster_server_id@ %,在那里server_id对实例是惟一的。在8.0.17之前的版本中,生成的用户的用户名遵循的命名方案mysql_innodb_cluster_r [10 _numbers.用于内部用户的主机名取决于ipAllowlist选项已配置。如果ipAllowlist未配置时,默认为自动内部用户是使用这两个通配符创建的性格和本地主机为主机名值。当ipAllowlist已配置,对于ipAllowlist已创建内部用户。有关更多信息,请参见创建服务器允许列表

每个内部用户都有一个随机生成的密码。从8.0.18版本开始,AdminAPI允许您更改内部用户生成的密码。看到重置恢复帐户密码.随机生成的用户被授予以下权限:

在*上授予复制从端。*internal_user

在种子实例上创建内部用户帐户,然后复制到集群中的其他实例。内部用户为:

  • 在通过发布创建新集群时生成dba.createCluster ()

  • 在向集群添加新实例时生成集群.addInstance ()

此外,集群.rejoinInstance ()操作还可能导致生成一个新的内部用户ipAllowlist选项用于指定主机名。例如,通过发布:

集群。rejoinInstance ({ipAllowlist: " 192.168.1.1/22 "});

所有以前存在的内部用户将被删除,并创建一个新的内部用户ipAllowlist使用的值。

有关组复制所需的内部用户的详细信息,请参见用于分布式恢复的用户凭证

配置InnoDB集群端口

属于集群的实例对不同类型的通信使用不同的端口。除了默认的港口在3306,它用于通过经典的MySQL协议的客户端连接,和mysqlx_port,默认为33060,用于X协议客户端连接,还有一个用于集群中实例之间的内部连接的端口,不用于客户端连接。该端口由localAddress选项,用于配置group_replication_local_address系统变量,这个端口必须打开,这样集群中的实例才能相互通信。例如,如果您的防火墙阻塞了这个端口,那么实例之间就不能通信,集群就不能工作。类似地,如果您的实例正在使用SELinux,你需要确保所有InnoDB集群使用的端口都是开放的,这样实例之间才能互相通信。看到设置MySQL特性的TCP端口上下文而且MySQL Shell端口

在创建集群或向集群添加实例时,默认情况下localAddress端口是通过乘以目标实例的值来计算的港口值为10,然后对结果加1。例如,当港口的值为默认值3306,计算得到的localAddress端口是33061。您应该确保集群实例使用的端口号与这种方式兼容localAddress计算。例如,如果用于创建集群的服务器实例具有港口大于6553的dba.createCluster ()操作失败,因为计算的localAddress端口号超过最大有效端口号65535。为了避免这种情况,要么使用较低的港口的值,或者手动分配localAddress值,例如:

mysql-js > dba。createCluster (testCluster,{“localAddress”:“icadmin@ic-1:33061”}