五、 配置 InnoDB 集群

1、InnoDB集群的设置选项

当实例处于联机状态时,您可以检查并修改InnoDB集群的设置。要检查群集的当前设置,请使用以下操作:

  • Cluster.options(),它列出了集群及其实例的配置选项。还可以指定布尔选项all,以在输出中包含有关所有组复制系统变量的信息。

您可以在集群级别或实例级别配置InnoDB集群的选项,同时实例保持在线。这避免了删除、重新配置然后再次添加实例以更改InnoDB Cluster选项的需要。使用以下操作:

  • Cluster.setOption(option,value)全局更改所有集群实例的设置或集群全局设置(如clusterName)。
  • Cluster.setInstanceOption(实例、选项、值)更改单个群集实例的设置

在列出的操作中使用InnoDB Cluster选项的方式取决于该选项是否可以在所有实例上更改为相同。这些选项在集群(所有实例)和每个实例级别都是可变的:

  • autoRejoinTries:一个整数值,用于定义实例在被驱逐后试图重新加入集群的次数。
  • exitStateAction:指示组复制退出状态操作的字符串值。
  • memberWeight:带百分比权重的整数值,用于故障转移时的自动主选择。
  • ipAllowList:以逗号分隔的IP地址列表或子网CIDR表示法。例如:192.168.1.0/24,10.0.1。默认情况下,该值设置为AUTOMATIC,允许自动为allowlist设置来自实例专用网络的地址。
  • tag:option::要关联到集群的内置和用户定义的标记

这些选项只能在集群级别更改:

  • clusterName:用于定义集群名称的字符串值
  • disableClone:用于在群集上禁用克隆使用的布尔值。请参阅dba.createCluster()和MySQL克隆。
  • replicationAllowedHost:用于定义严格的基于子网的筛选的字符串值,以便内部管理的复制帐户只能从允许的主机连接。请参阅InnoDB Cluster replicationAllowedHost。
  • expelTimeout:一个整数值,用于定义集群成员在从集群中驱逐未响应成员之前应等待的时间段(以秒为单位)。
  • failoverConsistency:指示集群提供的一致性保证的字符串值。
  • transactionSizeLimit:正整数值,用于设置组复制系统变量Group_Replication_transaction_size_limit。这将设置集群接受的最大事务大小(以字节为单位)。较大的事务会回滚,而不会广播到集群。添加到集群的所有成员都使用相同的值。

此选项仅可在每个实例级别更改:

  • label:实例的字符串标识符

2、自定义InnoDB集群成员服务器

创建集群并向其中添加实例时,AdminAPI会自动配置组名和本地地址等值。建议大多数部署使用默认值,但高级用户可以通过将以下选项传递给dba.createCluster()和Cluster.addInstance()命令来覆盖默认值:

  • 将groupName选项传递给dba.createCluster()命令,以自定义InnoDB Cluster创建的复制组的名称。这将设置group_replication_group_name系统变量。名称必须是有效的UUID。
  • 将localAddress选项传递给dba.createCluster()和cluster.addInstance()命令,以自定义实例为来自其他实例的连接提供的地址。以host:port格式指定地址。这将设置实例上的group_replication_local_address系统变量。该地址必须可供群集中的所有实例访问,并且必须仅保留用于内部群集通信。换句话说,不要使用此地址与实例进行通信。

有关更多信息,请参阅由这些AdminAPI选项配置的系统变量的文档。

3、配置选举过程

      您可以选择配置单个主集群选择新主集群的方式,例如,选择一个实例作为故障转移到的新主集群。在创建集群时,使用memberWeight选项并将其传递给dba.createCluster()和cluster.addInstance()方法。memberWeight选项接受0到100之间的整数值,这是故障转移时自动主选择的百分比权重。当一个实例的memberWeight设置的百分比数字较高时,它更有可能在单个主集群中被选为主实例。当进行初选时,如果多个实例具有相同的memberWeight值,则会根据其服务器UUID按字典顺序(最低)排列实例的优先级,并选择第一个实例。
      设置memberWeight的值将配置实例上的group_replication_member_weight系统变量。组复制将值范围限制在0到100之间,如果提供了更高或更低的值,则会自动调整该值。如果未提供值,则组复制使用默认值50。有关详细信息,请参阅单一主模式。
例如,要配置一个集群,其中ic-3是在当前主ic-1意外离开集群时故障转移到的首选实例,请使用memberWeight,如下所示:

dba.createCluster('cluster1', {memberWeight:35})
var mycluster = dba.getCluster()
mycluster.addInstance('icadmin@ic2', {memberWeight:25})
mycluster.addInstance('icadmin@ic3', {memberWeight:50})

4、配置故障切换一致性

      如果主故障切换发生在单主模式下,则组复制提供了指定故障切换保证(最终或“读取您的写入”)的功能(请参阅配置事务一致性保证)。您可以在创建时通过将一致性选项(在版本8.0.16之前,此选项是failoverConsistency选项,现在已弃用)传递给dba.createCluster()操作来配置InnoDB集群的故障转移保证,该操作在种子实例上配置group_replication_consistency系统变量。此选项定义在单个主组中选择新主时使用的新围栏机制的行为。围栏限制连接从新主文件写入和读取,直到它应用了来自旧主文件的任何未决的更改积压(有时称为“读取您的写入”)。虽然有围栏机制,但在应用任何积压工作时,应用程序在短时间内不会看到时间倒退。这样可以确保应用程序不会从新选择的主应用程序中读取过时的信息。
       只有当目标MySQL服务器版本为8.0.14或更高版本时,才支持一致性选项,并且添加到已配置一致性选项的集群中的实例会自动配置为在所有支持该选项的集群成员上具有相同的group_replication_consistency。变量默认值由组复制控制,为EVENTUAL,请将一致性选项更改为BEFORE_ON_PRIMARY_FAILOVER以启用围栏机制。或者,对EVENTUAL使用consistency=0,对BEFORE_ON_PRIMARY_FAILOVER使用consistence=1。

5、配置实例的自动重新加入

 运行MySQL 8.0.16及更高版本的实例支持组复制自动重新加入功能,该功能使您能够配置实例在被驱逐后自动重新加入集群。有关背景信息,请参阅故障检测和网络分区响应。AdminAPI提供了autoRejectTries选项,用于配置实例在被驱逐后重新加入集群的尝试次数。默认情况下,实例不会自动重新加入集群。您可以使用以下命令在集群级别或为单个实例配置autoRejectTries选项:

  • dba.createCluster()
  • Cluster.addInstance()
  • Cluster.setOption()
  • Cluster.setInstanceOption()

autoRejectTries选项接受0到2016之间的正整数值,默认值为3。当使用自动重新加入功能时,集群更能容忍故障,尤其是不可靠网络等临时故障。但如果quorum已经丢失,您不应该期望成员自动重新加入集群,因为大多数成员都需要重新加入实例。
运行MySQL 8.0.12及更高版本的实例具有group_replication_exit_state_action变量,您可以使用AdminAPI exitStateAction选项配置该变量。这控制了在意外离开集群的情况下实例的操作。默认情况下,exitStateAction选项为READ_ONLY,这意味着离开集群的实例意外变为只读。如果exitStateAction设置为OFFLINE_MODE(可从MySQL 8.0.18获得),则离开集群的实例会意外变为只读,并进入脱机模式,在脱机模式下,它们会断开现有客户端的连接,不接受新的连接(具有管理员特权的客户端除外)。如果exitStateAction设置为ABORT_SERVER,那么在意外离开集群的情况下,实例会关闭MySQL,并且必须重新启动它才能重新加入集群。请注意,当您使用自动重新加入功能时,exitStateAction选项配置的操作仅在所有重新加入集群的尝试都失败的情况下才会发生。
您可能会连接到一个实例,并尝试使用AdminAPI对其进行配置,但此时该实例可能正在重新加入集群。无论何时使用以下任何操作,都可能发生这种情况:

  • Cluster.status()
  • dba.getCluster()
  • Cluster.rejoinInstance()
  • Cluster.addInstance()
  • Cluster.removeInstance()
  • Cluster.rescan()
  • Cluster.checkInstanceState()

当实例自动重新加入集群时,这些操作可能会提供额外的信息。此外,当您使用Cluster.removeInstance()时,如果目标实例自动重新加入集群,则操作将中止,除非您传入force:true。

6、配置并行复制应用程序

从8.0.23版本开始,实例支持并启用并行复制应用程序线程,有时称为多线程副本。并行使用多个副本应用程序线程可以提高复制应用程序和增量恢复的吞吐量。
这意味着,在运行8.0.23及更高版本的实例上,必须配置以下系统变量:

  • binlog_transaction_dependency_tracking=WRITESET
  • slave_preserve_commit_order=ON
  • slave_parallel_type=LOGICAL_CLOCK
  • transaction_write_set_extraction=XXHASH64

默认情况下,应用程序线程数(由slave_pilel_workers系统变量配置)设置为4。
升级运行8.0.23之前版本的MySQL server和MySQL Shell的集群时,实例未配置为使用并行复制应用程序。如果未启用并行应用程序,Cluster.status()操作的输出会在instanceErrors字段中显示一条消息,例如:

...
"instanceErrors": [
	"NOTE: The required parallel-appliers settings are not enabled on 
		the instance. Use dba.configureInstance() to fix it."
...

在这种情况下,您应该重新配置实例,以便它们使用并行复制应用程序。对于属于InnoDB集群的每个实例,通过发出dba.configureInstance(instance)来更新配置。请注意,通常在将实例添加到集群之前使用dba.configure instance(),但在这种特殊情况下,不需要删除实例,配置更改是在其联机时进行的。
有关并行复制应用程序的信息显示在Cluster.status(extended=1)操作的输出中。例如,如果启用了并行复制应用程序,则实例的拓扑部分输出将显示applierWorkerThreads下的线程数。为并行复制应用程序配置的系统变量显示在Cluster.options()操作的输出中。
您可以使用applierWorkerThreads选项配置实例用于并行复制应用程序的线程数,该选项默认为4个线程。该选项接受0到1024范围内的整数,并且只能与dba.configureInstance()和dba.configure ReplicaSetInstance()操作一起使用。例如,要使用8个线程,请发出: 

mysql-js> dba.configureInstance(instance, {applierWorkerThreads: 8, restart: true})

7、InnoDB集群和自动增量

当您使用实例作为InnoDB集群的一部分时,配置auto_increment_increment和auto_increment_offset变量以避免大小不超过9(组复制组支持的最大大小)的多主集群发生自动增量冲突的可能性。用于配置这些变量的逻辑可以概括为:

  • 如果组以单一主模式运行,则将auto_increment_increment设置为1,将auto_increment_offset设置为2。
  • 如果组在多主模式下运行,则当集群具有7个或更少实例时,将auto_increment_increment设置为7,将auto_increment_offset设置为1+server_id%7。如果多主集群具有8个或更多实例,则将auto_increment_increment设置为实例数,将auto_increment_offset设置为1+server_id%实例数。

 8、InnoDB集群和二进制日志清除

 在MySQL 8中,二进制日志是自动清除的(由binlog_expire_logs_conds定义)。这意味着,运行时间超过binlog_expire_logs_conds的集群最终可能无法包含具有完整二进制日志的实例,该日志包含实例应用的所有事务。这可能导致实例在加入集群之前需要自动配置,例如使用MySQL Enterprise Backup。运行8.0.17及更高版本的实例支持MySQL Clone插件,该插件通过提供不依赖增量恢复的自动配置解决方案来解决此问题,请参阅第7.4.6节“将MySQL Clone与InnoDB Cluster一起使用”。运行8.0.17之前版本的实例只支持增量恢复,结果是,根据实例运行的MySQL版本,可能需要自动配置实例。否则,依赖分布式恢复的操作(如Cluster.addInstance()等)可能会失败。
在运行早期版本MySQL的实例上,以下规则用于二进制日志清除:

  • 运行8.0.1之前版本的实例没有自动清除二进制日志,因为expire_logs_days的默认值为0。
  • 运行版本早于8.0.1但早于8.0.4的实例在30天后清除二进制日志,因为expire_logs_days的默认值为30。
  • 运行8.0.10之后版本的实例会在30天后清除二进制日志,因为binlog_expire_logs_conds的默认值为2592000,expire_log_days的缺省值为0。

因此,根据集群运行的时间长短,二进制日志可能已被清除,您可能需要手动配置实例。同样,如果手动清除二进制日志,可能会遇到同样的情况。因此,强烈建议您升级到8.0.17之前的MySQL版本,以充分利用MySQL Clone为分布式恢复提供的自动配置,并在为InnoDB集群配置实例时最大限度地减少停机时间。

9、配置主从通信堆栈组

从MySQL Shell 8.0.30开始,InnoDB Cluster和ClusterSet支持MySQL 8.0.27中为组复制引入的MySQL通信堆栈。
新选项communicationStack:XCOM|MYSQL设置组复制系统变量Group_Replication_communication_stack的值。

通信堆栈类型

支持以下通信堆栈:

  • MYSQL:(MySQL Server 8.0.27或更高版本的默认值)
  • 通过使用简化 InnoDB 集群的创建 MySQL 服务器的连接安全性代替了 组复制实现。
  • 无需额外的网络地址,或 端口,用于内部组复制通信。
  • 使用 MYSQL 协议意味着标准方法 的用户身份验证可用于授予,或 撤销,访问组以代替允许 列表。
  • 支持组复制的网络命名空间。

Oracle建议使用MYSQL通信堆栈,而不是XCOM。

  • XCOM:(MySQL Server 8.0.26或更早版本的默认版本)。您可以 将XCOM通信堆栈与MySQL 8.0.27一起使用,或者 更高,但必须在创建中明确定义 或重新启动命令。
    XCOM保护群组通信连接和 成员之间的分布式恢复连接使用 安全性的组复制实现 协议,包括 TLS/SSL 和允许列表的使用 用于传入的组通信系统 (GCS) 连接。

选择通信堆栈


通信堆栈选择由dba.createCluster()和<clusterSet>.createReplicaCluster()命令中的communicationStack选项设置。
例如:

js> dba.createCluster("testCluster", {communicationStack: "mysql"})

js> clusterset.createReplicaCluster("hostname:3306", "replica", {communicationStack: "mysql"})

每个命令都会检查MySQL服务器,以确保它可以使用MySQL协议。如果它不支持MYSQL,则会显示一个错误,并且命令失败。
addInstance、rejectInstance和rescan命令还检查目标实例是否支持通信堆栈,并相应地设置所需的配置选项。

  • ipAllowList.
  • XCOM:默认情况下自动设置。
  • MYSQL:未设置。ipAllowList不允许与MYSQL通信堆栈一起使用。
  • localAddress
  • XCOM:(高级选项,不推荐)自动生成。需要额外的网络地址或端口。
  • MYSQL:自动更新以使用MySQL服务器报告的值。
    localAddress可以手动定义,但端口必须是MySQL正在侦听的端口,正如bind_address所定义的那样。
  • groupSeeds
  • XCOM:自动生成。需要额外的网络地址或端口。
  • MYSQL:会自动更新为使用每个MySQL实例使用的bind_address值。
  • 更新SSL设置。两种通信协议使用相同的SSL设置。如果memberSslMode设置为VERIFY_CA或VERIFY_IDENTITY,则会从MySQL服务器复制设置。如果memberSslMode设置为REQUIRED,则不会进行任何更改。

交换通信堆栈

在从完全中断操作重新启动期间,可以切换通信堆栈。
例如:

js> dba.rebootClusterFromCompleteOutage("testcluster", {switchCommunicationStack: "mysql"})

从MYSQL协议切换到XCOM需要localAddress的额外网络地址,还可能需要ipAllowList值。
如果从XCOM切换到MYSQL堆栈,将进行以下更改:

  • ipAllowList未设置。
  • localAddress更新为使用MySQL服务器报告的值。
  • groupSeeds更新为使用每个MySQL实例使用的bind_address值。
  • 更新SSL设置。如果memberSslMode设置为VERIFY_CA或VERIFY_IDENTITY,则会从MySQL服务器复制设置。如果memberSslMode设置为REQUIRED,则不会进行任何更改。