下面几节将介绍如何部署一个新的生产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
变量。的expelTimeout
Option可设置为0 ~ 3600之间的整数值。所有运行MySQL server 8.0.13及以上版本的实例被添加到集群中expelTimeout
都自动配置为具有相同的expelTimeout
在种子实例上配置的值。
有关其他选项的信息,您可以传递到dba.createCluster ()
,请参阅第7.5节“使用InnoDB集群”.
使用
函数向集群添加更多实例,其中集群
.addInstance (实例
)实例
连接信息是否已配置实例,参见配置生产实例.从8.0.17版本开始,组复制实现了考虑实例的补丁版本和
操作检测这一点,如果发生不兼容,则操作终止并出现错误。看到检查实例上的MySQL版本而且在一个组中组合不同的成员版本集群
.addInstance ()
集群中至少需要三个实例,才能容忍一个实例的失败。添加更多的实例将增加实例失败的容忍度。向集群问题中添加一个实例。
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和更高版本中,您可以配置如何
行为,让恢复操作在后台进行,或者在MySQL Shell中监视不同级别的进度。集群
.addInstance ()
根据您从集群中恢复实例所选择的选项,您将在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运行的标准输出引用一个终端,则waitRecovery
Option默认为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集群创建内部恢复用户,启用集群内服务器之间的连接。这些用户位于集群内部,生成的用户的用户名遵循的命名方案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
使用的值。
有关组复制所需的内部用户的详细信息,请参见用于分布式恢复的用户凭证.
属于集群的实例对不同类型的通信使用不同的端口。除了默认的港口
在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”}