InnoDB集群的生产部署
在生产环境中工作时,构成InnoDB群集的MySQL服务器实例作为网络的一部分在多台主机上运行,而不是如“ InnoDB Cluster的沙盒部署”中所述在单台计算机上运行。在按照这些说明进行操作之前,必须在要作为服务器实例添加到群集的每台计算机上安装必需的软件,请参见“安装方法”。
下图说明了本节中使用的方案:
生产部署

重要与沙盒部署不同,在沙盒部署中,所有实例都本地部署到AdminAPI可以访问本地文件并可以保留配置更改的一台计算机上,对于生产部署,您必须保留实例上的所有配置更改。如何执行此操作取决于实例上运行的MySQL版本,请参阅持久设置。
要将服务器的连接信息传递给AdminAPI,请使用类似URI的连接字符串或数据字典。请参见“使用类似URI的字符串或键值对连接到服务器”。在本文档中,显示了类似URI的字符串。
以下各节描述了如何部署生产型InnoDB集群。
- 用户权限
- InnoDB群集创建的用户帐户
- 配置主机名
- 配置端口
- 持续设置
- 详细记录
- 配置生产实例
- 创建集群
- 将实例添加到群集
用户权限
用于管理实例不必是root帐户的用户帐户,但用户需要在除了全面的MySQL管理员权限分配上InnoDB的集群元数据表完全读写权限(SUPER
,GRANT OPTION
,CREATE
,DROP
等)。创建用户来管理集群的首选方法是使用clusterAdmin
带有dba.configureInstance()
和Cluster.addInstance()
操作的选项。在此过程ic
中,示例中将显示用户。
在clusterAdmin
属于集群的所有实例上,用户名和密码必须相同。
如果仅需要读操作(例如出于监视目的),则可以使用具有更多受限特权的帐户。请参阅为InnoDB集群配置用户。
InnoDB群集创建的用户帐户
作为使用组复制的一部分,InnoDB群集将创建内部恢复用户,以启用群集中服务器之间的连接。这些用户在群集内部,并且生成的用户的用户名遵循的命名方案,其中实例唯一。在8.0.17之前的版本中,生成的用户的用户名遵循的命名方案。内部用户使用的主机名取决于是否配置了该选项。如果未配置,则默认为,并且使用通配符和mysql_innodb_cluster_server_id@%
server_id
mysql_innodb_cluster_r[10_numbers]
ipWhitelist
ipWhitelist
AUTOMATIC
%
localhost
表示主机名值。当ipWhitelist
已配置,在每个地址ipWhitelist
列表中创建一个内部用户。有关更多信息,请参见创建服务器白名单。
每个内部用户都有一个随机生成的密码。随机生成的用户将获得以下赠款:
GRANT REPLICATION SLAVE ON *.*to internal_user;
内部用户帐户在种子实例上创建,然后复制到群集中的其他实例。内部用户是:
- 通过发行创建新集群时生成
dba.createCluster()
- 通过发出将新实例添加到集群时生成
Cluster.addInstance()
。
此外,Cluster.rejoinInstance()
当使用该ipWhitelist
选项指定主机名时,该操作还可能导致生成新的内部用户。例如,通过发出:
Cluster.rejoinInstance({ipWhitelist: "192.168.1.1/22"});
考虑到ipWhitelist
使用的值,将删除所有以前存在的内部用户,并创建一个新的内部用户。
有关组复制所需的内部用户的更多信息,
配置主机名
组成集群的生产实例在不同的计算机上运行,因此,每台计算机必须具有唯一的主机名,并且能够解析在集群中运行服务器实例的其他计算机的主机名。如果不是这种情况,则可以:
- 配置每台计算机以将其他计算机的IP映射到主机名。有关详细信息,请参见您的操作系统文档。这是推荐的解决方案。
- 设置DNS服务
- 将
report_host
每个实例的MySQL配置中的变量配置为合适的外部可访问地址
InnoDB集群支持使用IP地址而不是主机名。从MySQL Shell 8.0.18开始,如果目标MySQL Server版本高于8.0.13,则AdminAPI支持IPv6地址。当使用MySQL壳牌8.0.18或更高,如果所有的集群实例正在运行8.0.14或更高版本,那么你可以使用IPv6或主机名解析为IPv6地址,例如连接字符串,并与选项,例如localAddress
,groupSeeds
和ipWhitelist
。有关使用IPv6的更多信息,请参见“对IPv6以及对IPv6和IPv4混合组的支持”。以前的版本仅支持IPv4地址。
在此过程中,示例中使用主机名。ic-number
要验证是否正确配置了MySQL服务器的主机名,请执行以下查询,以参见实例如何向其他服务器报告其自身的地址,并尝试使用返回的地址从其他主机连接至该MySQL服务器:
SELECT coalesce(@@report_host, @@hostname);
配置端口
属于集群的实例具有localAddress
,即为group_replication_local_address
,并且该地址用于集群中的实例之间的内部连接,而不供客户端使用。创建集群或将实例添加到集群时,默认情况下,localAddress
端口的计算方法是将目标实例的port
值乘以10,然后在结果中加上一个。例如,当port
目标实例的的默认值为3306时,计算出的localAddress
端口为33061。您应确保集群实例使用的端口号与以下方式兼容:localAddress
被计算。例如,如果用于创建集群的服务器实例的port
数字大于6553,则dba.createCluster()
操作将失败,因为计算的localAddress
端口号超过了最大有效端口65535。为避免这种情况port
,请在您的实例上使用较小的值用于InnoDB集群,或手动分配localAddress
值,例如:
mysql-js> dba.createCluster('testCluster', {'localAddress':'icadmin@ic-1:33061'}
如果您的实例使用SELinux,则需要确保InnoDB集群使用的端口是打开的,以便实例可以相互通信。请参阅如何将组复制与SELinux一起使用?。
持续设置
您用于群集及其服务器实例的AdminAPI命令会修改实例的配置。根据MySQL Shell连接到实例的方式以及实例上安装的MySQL版本,这些配置更改可以自动保存到实例中。将实例的设置持久化可确保实例重新启动后保留配置更改,有关背景信息,请参阅SET PERSIST
。这对于可靠地使用群集非常重要,例如,如果设置未保留,则重新添加后已添加到群集的实例将不会重新加入群集,因为配置更改会丢失。执行以下操作后,需要进行永久更改:
dba.configureInstance()
dba.createCluster()
Cluster.addInstance()
Cluster.removeInstance()
Cluster.rejoinInstance()
满足以下要求的实例支持自动持久配置更改:
- 实例运行的是MySQL 8.0.11或更高版本
persisted_globals_load
设定为ON
- 该实例尚未使用该
--no-defaults
选项启动
不满足这些要求的实例不自动支持持久配置更改,当AdminAPI操作导致对实例设置的更改要持久保存时,您会收到以下警告:
WARNING: On instance 'localhost:3320' membership change cannot be persisted since MySQL version 5.7.21 does not support the SET PERSIST command (MySQL version >= 8.0.5 required). Please use the <Dba>.configureLocalInstance command locally to persist the changes.
当针对当前正在运行MySQL Shell的MySQL实例(即本地实例)发出AdminAPI命令时,MySQL Shell会将配置更改直接保留到该实例。在支持自动保留配置更改的本地实例上,配置更改将保留到实例的mysqld-auto.cnf
文件中,并且配置更改不需要任何其他步骤。在不支持自动持久保存配置更改的本地实例上,您需要在本地进行更改,请参阅使用配置实例dba.configureLocalInstance()
。
当针对一个远程实例运行时,换句话说,一个实例而不是当前正在运行的MySQL Shell实例,如果该实例自动支持持久配置更改,则AdminAPI命令可以将实例的配置更改持久mysql-auto.conf
选项文件。如果远程实例不支持自动进行持久配置更改,则AdminAPI命令将无法自动配置实例的选项文件。这意味着AdminAPI命令可以从实例读取信息,例如以显示当前配置,但是对配置的更改不能持久保存到实例的选项文件中。在这种情况下,您需要将更改保留在本地,请参阅使用配置实例dba.configureLocalInstance()
。
详细记录
在进行生产部署时,为MySQL Shell配置详细日志记录可能会很有用,日志中的信息可以帮助您查找和解决准备服务器实例作为InnoDB集群的一部分时可能发生的任何问题。要使用详细的日志记录级别启动MySQL Shell,请使用以下--log-level
选项:
shell>mysqlsh --log-level=DEBUG3
该DEBUG3
建议,请--log-level
以获取更多信息。当DEBUG3
设置了MySQL壳牌日志文件包含例如线Debug: execute_sql(...)
,其包含被作为各AdminAPI呼叫的一部分执行的SQL查询。MySQL Shell生成的日志文件位于~/.mysqlsh/mysqlsh.log
基于Unix的系统中。在Microsoft Windows系统上,它位于中%APPDATA%\MySQL\mysqlsh\mysqlsh.log
。有关更多信息,请参见 MySQL Shell日志记录和调试。
除了启用MySQL Shell日志级别,您还可以在发出每个命令后配置AdminAPI在MySQL Shell中提供的输出量。要启用AdminAPI输出的数量,请在MySQL Shell中发出:
mysql-js> dba.verbose=2
这将启用AdminAPI调用的最大输出。可用的输出级别为:
- 默认值为0或OFF。这提供了最小的输出,并且是不进行故障排除时的建议级别。
- 或ON将每个调用的详细输出添加到AdminAPI。
- 将调试输出添加到详细输出,以提供有关每个AdminAPI调用执行内容的完整信息。
配置生产实例
AdminAPI提供了以下dba.configureInstance()
功能:检查实例是否已针对InnoDB集群使用进行了适当配置;如果发现任何与InnoDB集群不兼容的设置,则对实例进行配置。您dba.configureInstance()
对一个实例运行命令,它检查使该实例可用于InnoDB群集使用所需的所有设置。如果实例不需要更改配置,则无需修改实例的配置,并且dba.configureInstance()
命令输出确认实例已准备就绪,可以使用InnoDB集群。如果需要进行任何更改以使实例与InnoDB集群兼容,则会显示不兼容设置的报告,您可以选择让命令对实例的选项文件进行更改。根据MySQL Shell与实例的连接方式以及实例上运行的MySQL版本的不同,您可以通过将更改持久保存到远程实例的选项文件中来使这些更改永久生效,请参见持久设置。不支持持久配置更改的实例会自动要求您在本地配置实例,请参阅使用配置实例dba.configureLocalInstance()
。或者,您可以手动更改实例的选项文件,有关更多信息,请参见“使用选项文件”。无论您以何种方式进行配置更改,都可能必须重新启动MySQL以确保检测到配置更改。
该dba.configureInstance()
命令的语法为:
dba.configureInstance([instance][, options])
其中instance
是实例定义,options
是带有附加选项的数据字典,用于配置操作。该命令返回有关操作结果的描述性文本消息。
该instance
定义是实例连接数据,请参见 4.2.5节,“连接到服务器使用URI,例如字符串或键值对”。如果目标实例已经属于InnoDB集群,则会生成错误,并且该过程将失败。
选项字典可以包含以下内容:
mycnfPath
-实例的MySQL选项文件的路径。outputMycnfPath
-写实例的MySQL选项文件的替代输出路径。password
-连接使用的密码。clusterAdmin
-要创建的InnoDB集群管理员用户的名称。支持的格式是标准的MySQL帐户名称格式。支持用户名和主机名的标识符或字符串。默认情况下,如果不加引号,则假定输入为字符串。clusterAdminPassword
-使用创建的InnoDB集群管理员帐户的密码clusterAdmin
。尽管可以指定使用此选项,但这是潜在的安全风险。如果您未指定此选项,但确实指定了该clusterAdmin
选项,则在交互式提示中会提示您输入密码。clearReadOnly
-用于确认super_read_only
应将其设置为off 的布尔值,请参见 Super Read-only和Instances。interactive
-一个布尔值,用于禁用命令执行中的交互式向导,以便不向用户提供提示,也不显示确认提示。restart
-一个布尔值,用于指示应执行目标实例的远程重新启动以完成操作。
尽管连接密码可以包含在实例定义中,但这是不安全的,不建议这样做。使用MySQL Shell 可插拔密码存储区安全地存储实例密码。
一旦dba.configureInstance()
针对实例发出该命令,该命令将检查该实例的设置是否适合InnoDB集群使用。显示报告,显示InnoDB集群所需的设置。如果实例不需要对其设置进行任何更改,则可以在InnoDB集群中使用它,然后继续进行创建集群。如果实例的设置对于InnoDB集群使用无效,该dba.configureInstance()
命令将显示需要修改的设置。在配置实例之前,系统会提示您确认表中显示的更改,其中包含以下信息:
Variable
-无效的配置变量。Current Value
-无效配置变量的当前值。Required Value
-配置变量的必需值。
进行方式取决于实例是否支持持久设置,请参阅持久设置。当dba.configureInstance()
针对当前正在运行MySQL Shell的MySQL实例(即本地实例)发出时,它将尝试自动配置该实例。当dba.configureInstance()
对远程实例发出通知时,如果实例支持自动持久配置更改,则可以选择执行此操作。如果远程实例不支持持久化更改以针对InnoDB集群使用对其进行配置,则必须在本地配置该实例。请参阅使用dba.configureLocalInstance()
。
通常,dba.configureInstance()
配置选项文件后不需要重新启动实例,但是对于某些特定设置,可能需要重新启动。此信息显示在发布后生成的报告中dba.configureInstance()
。如果实例支持该RESTART
语句,则MySQL Shell可以关闭然后启动实例。这样可以确保mysqld检测到对实例的选项文件所做的更改。有关更多信息,请参见RESTART
。
注意执行
RESTART
语句后,与实例的当前连接丢失。如果启用了自动重新连接,则服务器重新启动后将重新建立连接。否则,必须手动重新建立连接。
该dba.configureInstance()
方法验证是否有合适的用户可用于群集使用,该用户用于群集成员之间的连接,请参阅“用户权限”。建议的添加合适用户的方法是使用该clusterAdmin
选项,该选项使您可以在调用操作时配置集群用户和密码。例如:
mysql-js> dba.configureInstance('root@ic-1:3306', \ {clusterAdmin: "'icadmin'@'ic-1%'"});
交互式提示要求指定用户所需的密码。该选项应与基于用户的连接一起使用,该用户具有创建具有适当特权的用户的特权,在此示例中,使用的是root用户。已创建的clusterAdmin
用户被授予能够管理群集的特权。有关更多信息,请参见为InnoDB集群配置用户。该clusterAdmin
选项接受的用户名格式遵循标准的MySQL帐户名格式,请参见“创建账户”。在此过程中,名称icadmin
使用,并且该名称对于进一步的操作(例如将实例添加到集群)是必需的。
如果您没有指定用户来管理集群,则在交互模式下,向导可以使您选择以下选项之一:
- 为root用户启用远程连接
- 创建一个新用户,相当于指定
clusterAdmin
选项 - 没有自动配置,在这种情况下,您需要手动创建用户
以下示例演示了创建用于群集使用的新用户的选项。
mysql-js> dba.configureLocalInstance('root@localhost:3306') Please provide the password注意for 'root@localhost:3306': Please specify the path to the MySQL configuration file: /etc/mysql/mysql.conf.d/mysqld.cnf Validating instance... The configuration has been updated but it is required to restart the server. { "config_errors": [ { "action": "restart", "current": "OFF", "option": "enforce_gtid_consistency", "required": "ON" }, { "action": "restart", "current": "OFF", "option": "gtid_mode", "required": "ON" }, { "action": "restart", "current": "0", "option": "log_bin", "required": "1" }, { "action": "restart", "current": "0", "option": "log_slave_updates", "required": "ON" }, { "action": "restart", "current": "FILE", "option": "master_info_repository", "required": "TABLE" }, { "action": "restart", "current": "FILE", "option": "relay_log_info_repository", "required": "TABLE" }, { "action": "restart", "current": "OFF", "option": "transaction_write_set_extraction", "required": "XXHASH64" } ], "errors": [], "restart_required": true, "status": "error" } mysql-js>
如果实例具有,super_read_only=ON
则可能需要确认AdminAPI可以设置super_read_only=OFF
。有关更多信息,请参见超级只读和实例。
创建集群
一旦准备好实例,就可以使用该dba.createCluster()
函数创建集群,并使用与MySQL Shell连接的实例作为集群的种子实例。种子实例将复制到您添加到群集中的其他实例,从而使它们成为种子实例的副本。在此过程中,ic-1实例用作种子。发行 MySQL外壳程序时,它将创建一个经典的MySQL协议会话,以连接到连接到MySQL Shell当前全局会话的服务器实例。例如,创建一个名为的集群并将返回的集群分配给一个名为的变量:dba.createCluster(name)
testCluster
cluster
mysql-js>var cluster = dba.createCluster('testCluster') Validating instance at icadmin@ic-1:3306... This instance reports its own addressas ic-1 Instance configuration is suitable. Creating InnoDB cluster 'testCluster' on 'icadmin@ic-1:3306'... Adding Seed Instance... Cluster successfully created. Use Cluster.addInstance() to add MySQL instances. At least 3 instances are neededfor the cluster to be able to withstand up to one server failure.
这种将返回的集群分配给变量的模式使您可以使用Cluster对象的方法对集群执行进一步的操作。返回的Cluster对象使用一个新会话,而独立于MySQL Shell的全局会话。这样可以确保,如果您更改MySQL Shell全局会话,则Cluster对象将维持其与实例的会话。
该dba.createCluster()
操作支持MySQL Shell的interactive
选项。当interactive
是时,提示出现在以下几种情况:
- 在属于集群的实例上运行且
adoptFromGr
选项为false时,系统会询问您是否要采用现有集群 - 当
force
不使用该选项(未设置为true
)时,系统会要求您确认创建多主集群
注意如果遇到与无法访问元数据有关的错误,则可能已配置了环回网络接口。为了正确使用InnoDB集群,请禁用回送接口。
要检查集群是否已创建,请使用集群实例的status()
功能。请参阅使用检查集群的状态Cluster.status()
。
一旦服务器实例属于集群,仅使用MySQL Shell和AdminAPI对其进行管理就很重要。不支持在实例上将组复制添加到群集后对其进行手动更改的尝试。同样,server_uuid
在使用AdminAPI配置实例后,不支持修改对InnoDB群集至关重要的服务器变量。
使用MySQL Shell 8.0.14和更高版本创建集群时,可以设置从集群驱逐实例之前的超时时间,例如当实例不可访问时。将expelTimeout
选项传递给dba.createCluster()
操作,该操作将group_replication_member_expel_timeout
在种子实例上配置变量。该expelTimeout
选项可以采用0到3600之间的整数值。所有运行MySQL服务器8.0.13及更高版本(添加到expelTimeout
配置了配置的集群中)的实例将自动配置为具有与expelTimeout
种子实例上配置的值相同的值。
有关您可以传递给其他选项的信息dba.createCluster()
,请参见“NDB群集的管理”。
将实例添加到群集
使用此功能可以向集群添加更多实例,其中包括到已配置实例的连接信息,请参阅配置生产实例。从版本8.0.17开始,组复制实现考虑实例的修补程序版本的兼容性策略,并且该操作将检测到该错误,并且在出现不兼容性的情况下,操作会因错误而终止。请参见在实例上检查MySQL版本和“在组中组合不同的成员版本”Cluster.addInstance(instance)
instance
Cluster.addInstance()
群集中至少需要三个实例,以使其能够容忍一个实例的故障。添加更多实例会增加实例失败的容忍度。要将实例添加到集群问题:
mysql-js> cluster.addInstance('icadmin@ic-2:3306') Anew instance will be added to the InnoDB cluster. Depending on the amountof data on the clusterthis might takefrom a few seconds to several hours. Please provide the passwordfor 'icadmin@ic-2:3306': ******** Adding instance to the cluster ... Validating instance at ic-2:3306... This instance reports its own addressas ic-2 Instance configuration is suitable. The instance 'icadmin@ic-2:3306' was successfully added to the cluster.
如果您使用的是MySQL 8.0.17或更高版本,则可以选择实例如何恢复与集群同步所需的事务。只有在加入实例恢复了群集先前处理的所有事务之后,它才能作为联机实例加入并开始处理事务。有关更多信息,请参见“将MySQL克隆与InnoDB集群一起使用”。
同样在8.0.17及更高版本中,您可以配置Cluster.addInstance()
行为方式,让恢复操作在后台进行或监视MySQL Shell中的不同进度。
根据您选择从集群恢复实例的选项,您会在MySQL Shell中看到不同的输出。假设您将实例ic-2添加到集群中,而ic-1是种子或施主。
当您使用MySQL Clone从集群中恢复实例时,输出如下所示:
Validating instance at ic-2:3306... This instance reports its own address as ic-2:3306 Instance configuration is suitable. A new instance will be added to the InnoDB cluster. Depending on the amount of data on the cluster this might take from a few seconds to several hours. Adding instance to the cluster... Monitoring recovery process of the new cluster member. Press ^C to stop monitoring and let it continue in background. Clone based state recovery is now in progress. NOTE: A server restart is expected to happen as part of the clone process. If the server does not support the RESTART command or does not come back after a while, you may need to manually start it back. * 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.
应该遵守有关服务器重新启动的警告,您可能必须手动重新启动实例。请参见“ RESTART语句”。
当您使用增量恢复从群集中恢复实例时,输出如下所示:
Incremental distributed state recovery is now in progress. * Waiting for incremental recovery to finish... NOTE: 'ic-2:3306' is being recovered from 'ic-1:3306' * Distributed recovery has finished
要取消恢复阶段,问题的监测控制+ C。这将停止监视,但是恢复过程将在后台继续。的waitRecovery
整数选项可与被用于Cluster.addInstance()
操作控制命令的关于恢复阶段的行为。接受以下值:
- :不要等待,让恢复过程在后台完成;
- :等待恢复过程完成;
- :等待恢复过程完成;并显示详细的静态进度信息;
- :等待恢复过程完成;并显示详细的动态进度信息(进度条);
默认情况下,如果运行MySQL Shell的标准输出指向终端,则该waitRecovery
选项默认为3。否则,默认为2。请参见监视恢复操作。
要验证是否已添加实例,请使用群集实例的status()
功能。例如,这是添加第二个实例后沙盒群集的状态输出:
mysql-js> cluster.status() { "clusterName": "testCluster", "defaultReplicaSet": { "name": "default", "primary": "ic-1:3306", "ssl": "REQUIRED", "status": "OK_NO_TOLERANCE", "statusText": "Cluster is NOT tolerant to any failures.", "topology": { "ic-1:3306": { "address": "ic-1:3306", "mode": "R/W", "readReplicas": {}, "role": "HA", "status": "ONLINE" }, "ic-2:3306": { "address": "ic-2:3306", "mode": "R/O", "readReplicas": {}, "role": "HA", "status": "ONLINE" } } }, "groupInformationSourceMember": "mysql://icadmin@ic-1:3306" }
进行的方式取决于实例是在本地运行还是在远程运行的MySQL Shell上,以及该实例是否自动支持持久配置更改,请参阅持久设置。如果实例支持自动保留配置更改,则无需手动保留设置,可以添加更多实例或继续进行下一步。如果实例不支持自动进行持久配置更改,则必须在本地配置实例。请参阅使用dba.configureLocalInstance()
。这对于确保实例在离开集群时重新加入集群至关重要。
如果实例具有,super_read_only=ON
则可能需要确认AdminAPI可以设置super_read_only=OFF
。有关更多信息,请参见超级只读和实例。
一旦部署了集群,就可以配置MySQL路由器以提供高可用性,请参见“将MySQL路由器与InnoDB集群一起使用”。