21章InnoDB集群

目录

21.1介绍InnoDB集群
21.2创建一个InnoDB集群
21.2.1部署方案
21.2.2 InnoDB集群的要求
21.2.3安装方法
21.2.4 InnoDB集群生产部署
21.2.5沙箱InnoDB集群部署
21.2.6采用一组复制的部署
21.3使用MySQL InnoDB集群路由器
21.4 InnoDB集群的工作
21.5 known limitations

本章涵盖了MySQL InnoDB集群,结合MySQL技术使您能够创建高可用MySQL服务器实例集群。

21.1介绍InnoDB集群

MySQL InnoDB MySQL集群提供了一个完整的高可用性解决方案。mysql包括adminapi使您轻松地配置和管理一组至少三的MySQL服务器实例作为InnoDB集群。每个MySQL服务器实例运行MySQL组复制,它提供了将数据复制在InnoDB集群机制,内置故障转移。adminapi删除需要在InnoDB集群组复制的直接工作,但更多信息见18章,组复制这解释了的细节MySQL的路由器可以自动配置本身基于集群部署,客户端应用程序透明地连接到服务器实例。在一个意想不到的失败的一个服务器实例的集群事件自动重新配置。在默认的单个主模式,InnoDB集群有一个读写服务器实例的主要。多个辅助服务器实例的主副本。如果主失败,一次是自动晋升为初级的作用。MySQL的路由器检测到这个转发客户端应用程序的新发。高级用户可以配置一个集群也有多个初选。

重要

InnoDB集群不提供MySQL NDB Cluster支持。NDB集群取决于NDB存储引擎以及一些程序具体到NDB簇不配置MySQL服务器8;NDB只可作为mysql的ndb集群分布。此外,MySQL服务器的二进制(mysqld),提供MySQL服务器时不能使用NDB集群。关于MySQL NDB集群的更多信息,参见MySQL NDB集群7.5%和NDB集群7.6使用InnoDB和NDB集群相比MySQL服务器之间的差异,提供有关信息InnoDBNDB存储引擎

下面的关系图显示了这些技术如何工作的一个概述:

图21.1数字集群概述

Three MySQL servers are grouped together as a high availability cluster. One of the servers is the read/write primary instance, and the other two are read-only secondary instances. Group Replication is used to replicate data from the primary instance to the secondary instances. MySQL Router connects client applications (in this example, a MySQL Connector) to the primary instance.

使用adminapi

包括adminapi mysql,这是通过dba全局变量和相关的方法。这个DBA变量的方法使你的部署、配置和管理集群,InnoDB。例如,使用dba.createCluster()创建一个InnoDB聚类方法。

重要

mysql可以通过插座连接连接到服务器,但adminapi需要TCP连接到一个服务器实例。基于socket的连接都不支持AdminAPI。

mysql提供在线帮助的adminapi。列出所有可用的dba命令,使用help() DBA。方法在线帮助在一个特定的方法,使用通用格式object.help('methodname')。。。。。。。例如:

MySQL的JS >dba.help('getCluster')从检索元数据store.syntax DBA群集。getcluster([名] [选项]),名称:参数指定要返回的群集的名称。选项:字典与额外的options.returns没有指定的名字或默认cluster.descriptionif名称识别聚类对象或为空,默认群集将被返回。如果名字是指定的,以显示名称不群被发现,一个误差提高。选项字典接受connecttoprimary选项,默认的真实并指出内核自动连接到在以下情形下的主要成员,cluster.exceptions metadataerror:如果元数据访问。如果元数据更新操作失败。在下列情况下argumenterror:如果群集名称是空的。如果群集名无效。如果群集是不存在的。在下列情况下运行时出错:如果当前连接不能用于组复制。

21.2创建一个InnoDB集群

本节说明你可以创建一个InnoDB集群的方式不同,要求服务器实例和软件需要安装部署一个集群。

21.2.1部署方案

InnoDB集群支持以下部署方案:

  • 生产部署:如果你想使用InnoDB集群在完整的生产环境需要配置所需的机器数量,然后部署你的服务器实例的机器。生产部署使您能够利用InnoDB的集群的高可用性功能,充分发挥其潜力。看到第21.2.4,“生产部署InnoDB集群”说明

  • 沙盒部署:如果你想测试一下Innodb集群之前,一个完整的生产部署,提供的沙箱功能使您能够快速在本地机器上建立一个集群。沙盒服务器实例所需的配置创建,你可以尝试innodb集群成为熟悉的技术。看到第21.2.5,“沙盒部署InnoDB集群”说明

    重要

    一个沙箱的部署是不适合用在一个完整的生产环境。

21.2.2 InnoDB集群的要求

在安装InnoDB集群生产部署,确保服务器的情况下,你打算使用符合下列要求。

  • InnoDB群集使用组复制和因此你的服务器实例必须满足同样的要求。看到第18.7.1,“组复制的要求”。adminapi提供dba.checkInstanceConfiguration()验证实例符合集团要求的复制方法dba.configureinstance()配置实例来满足要求的方法。

    笔记

    当使用一个沙箱配置实例配置为自动满足这些要求。

  • 组成员可以包含复制表格的使用比其他存储引擎InnoDBFor example,MyISAM。这样的表不能被复制到组写的,因此使用InnoDB群集时。能写这样的表INNODB集群,将所有的表InnoDB在使用实例在InnoDB集群。

  • 配置脚本,mysql使用配置使用InnoDB集群服务器需要访问Python版本2.7。一个沙盒部署Python是用于部署单机生产部署要求,需要在每个服务器实例将运行mysql本地Python,看保留设置

    在Windows mysql包括Python和没有用户配置要求。在UNIX python必须发现的shell环境的一部分。检查你的系统有Python正确配置问题:

    $ /usr/bin/env python

    如果一个Python解释器开始,没有进一步的行动是必需的。如果前一个命令失败,创造之间的软连接/usr/bin/python和你选择的Python二进制。

21.2.3安装方法

你使用安装InnoDB聚类的方法取决于使用的部署你的类型。一个沙盒部署安装InnoDB集群组件到一个单独的机。沙盒部署本地单机,因此安装只需要做一次本地机器上。对于生产部署安装的组件的每个机器,你想添加到您的集群。生产部署使用多个远程主机运行MySQL服务器实例,所以你需要连接到每台机器使用一个工具,如SSH或远程桌面来执行任务,如安装组件。以下方法安装InnoDB集群是可用的:

一旦你已经安装了innodb的集群所需的软件选择遵循第21.2.5,“沙盒部署InnoDB集群”第21.2.4,“生产部署InnoDB集群”

21.2.4 InnoDB集群生产部署

在生产环境中工作时,MySQL服务器实例组成的多主机集群运行InnoDB作为网络的一部分而不是单一的机器描述第21.2.5,“沙盒部署InnoDB集群”。之前,这些指令必须安装所需的软件,每一台机器,你打算添加一个服务器实例群集,看21.2.3节,“安装方法”

下面的图表说明了你的工作与本节中的情景:

图1生产部署

Three MySQL servers are grouped together as a production InnoDB cluster. One of the servers is the primary instance, and the other two are secondary instances. The IP address for the primary server is 139.59.177.10, and the IP addresses for the two secondary instances are 139.59.177.11 and 139.59.177.12. MySQL Router connects a client application to the primary instance. The admin capability in MySQL Shell interacts directly with the production InnoDB cluster.

重要

不像一个沙箱的部署,在所有情况下都部署在本地一机,adminapi具有本地文件访问和可以持续配置的变化,对于生产部署必须坚持实例的任何配置的变化。你怎么做这取决于MySQL的实例运行的版本,看保留设置

通过服务器的连接信息,adminapi使用URI类型的字符串,看使用URI字符串连接,或一个数据字典。在这个文件的URI类型的字符串显示。

用户权限

用户帐户用于管理的实例不需要root帐户,但是用户需要指定完整读写在InnoDB集群元数据表除了全MySQL管理员权限的权限(SUPER起重机CREATE等等)。创建用户来管理群集的首选方法是使用clusterAdmin期权与dba.configureinstance(),和Cluster.addInstance()运营在这一过程中用户IC在examples is shown。

如果只有读操作的需要(如监测的目的),更多的限制特权的帐户可以使用。给用户your_user需要监测InnoDB集群问题的特权:

格兰特选择mysql_innodb_cluster_metadata。*your_user@'%'格兰特performance_schema.global_status来选择;your_user@'%'格兰特performance_schema.replication_applier_configuration来选择;your_user@'%'格兰特performance_schema.replication_applier_status来选择;your_user@'%'格兰特performance_schema.replication_applier_status_by_coordinator来选择;your_user@'%'格兰特performance_schema.replication_applier_status_by_worker来选择;your_user@'%'格兰特performance_schema.replication_connection_configuration来选择;your_user@'%'格兰特performance_schema.replication_connection_status来选择;your_user@'%'格兰特performance_schema.replication_group_member_stats来选择;your_user@'%'格兰特performance_schema.replication_group_members来选择;your_user@'%'格兰特performance_schema.threads来选择;your_user@'%'授予期权;

配置主机名

使在单独的计算机集群上运行的生产情况,因此每台机器必须有一个唯一的主机名和能够解决运行服务器实例的集群中的其他机器的主机名。如果不是这样的话,你可以:

  • 配置每台机器地图对方机器IP主机名。详情请查看你的操作系统文档。这是推荐的解决方案。

  • 设置DNS服务

  • 配置report_host变量在每个实例的MySQL的配置到合适的外部联系地址

在这一过程中的主机名ic-number应用实例

验证是否一个MySQL服务器的主机名配置正确,执行以下查询看看实例报告自己的地址给其他服务器尝试连接到MySQL服务器从其他主机使用返回的地址:

SELECT coalesce(@@report_host, @@hostname);

保留设置

的adminapi命令你与集群工作和它的服务器实例修改实例的配置。根据mysql连接到实例和安装实例MySQL版本的方式,这些配置的变化可以持续到实例自动。坚持设置实例使配置更改后重新启动实例保留背景资料看,SET PERSIST。这是可靠的集群使用的必要,例如,如果设置不保存然后实例已被添加到群集不重启后由于配置的更改都会丢失重新加入群集。持续的改变是在下面的操作要求:

  • dba.configureInstance()

  • dba.createCluster()

  • Cluster.addInstance()

  • Cluster.removeInstance()

  • Cluster.rejoinInstance()

的情况下,满足下列要求的支持,坚持配置自动改变:

实例不符合这些要求不支持坚持配置自动改变,当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.

当adminapi命令对MySQL实例正在运行mysql发行,换句话说,本地实例,mysql中存在配置的变化直接实例。在当地的情况下支持坚持配置自动改变,配置更改保存到实例的mysqld-auto.cnf文件和配置变化不需要任何进一步的步骤。在不支持坚持配置自动改变当地的情况下,你需要在本地进行更改,看配置本地实例

当运行在远程实例,换句话说,除了一个mysql中当前正在运行的实例,如果该实例支持配置自动改变的坚持,坚持adminapi命令实例的配置更改mysql-auto.conf选项文件。如果远程实例不支持坚持配置自动改变,这adminapi命令不能自动配置实例的选项文件。这意味着,adminapi命令可以从实例中读取信息,例如显示当前配置,但结构的变化不能坚持到实例的选项文件。在这种情况下,你需要坚持改变局部,看配置本地实例

详细记录

当工作与生产部署可以配置详细记录MySQL内核有用,日志中的信息可以帮助你找到和解决任何问题,可能发生在你准备服务器实例作为群集的一部分会。启动MySQL内核的详细日志记录级别使用--log-level选项:

内核&#62;mysqlsh --log-level=DEBUG3

这个DEBUG3推荐,看--log-level更多信息。什么时候debug3设置mysql日志文件包含线等Debug: execute_sql( ... )它包含有每个adminapi调用的一部分执行的SQL查询。通过mysql生成日志文件位于/ / mysqlsh.log .mysqlsh ~基于UNIX的系统;微软的Windows系统位于%APPDATA%\MySQL\mysqlsh\mysqlsh.log。看到mysql应用程序日志更多信息

除了让mysql的日志级别,您可以配置在mysql中提供了输出adminapi量发行每个命令后。为了使adminapi输出量,在mysql中的问题:

mysql-js> dba.verbose=2

这使得最大输出adminapi电话。输出可用的水平:

  • 0或是默认的。这提供了最小输出,推荐的水平时,不排除。

  • 1、增加了每个输出到adminapi啰嗦。

  • 2增加了调试输出的详细输出到adminapi提供有关每个叫什么信息充分执行。

配置生产实例

adminapi提供dba.configureInstance()功能检查,如果一个实例被适当地配置InnoDB集群使用,并配置实例,如果发现任何设置不兼容InnoDB集群。你运行dba.configureinstance()命令与实例,它检查所有需要启用实例用于InnoDB集群使用的设置。如果实例不需要更改配置,不需要修改实例的配置,和dba.configureInstance()命令的输出确认实例准备使用InnoDB集群。如果有任何变化均需使实例InnoDB集群兼容,不兼容设置的一份报告显示,你可以选择让命令实例的选项文件进行更改。根据mysql连接到实例的方式,和MySQL的实例运行的版本,你可以坚持到远程实例的选项文件作出这些改变是永久的,看保留设置。实例不支持坚持配置自动改变需要配置实例的局部,看配置本地实例。或者你可以到实例的选项文件手动进行更改,看第4.2.6、“使用选项文件”更多信息。无论你的方式进行配置更改,您可能必须重新启动MySQL确保配置变化检测。

的语法dba.configureInstance()命令:

[ dba.configureinstance(instance] [,options])

哪里instance是一个实例的定义,和options数据字典是一个额外的选项来配置操作。命令返回操作的描述性文本信息的结果。

实例定义的实例连接数据。如果目标实例已经属于InnoDB簇生成一个错误一个进程失败。

字典可以包含以下选项:

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

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

  • password要连接使用的密码

  • clusterAdmin-一个InnoDB集群管理员用户要创建的名字。支持的格式是标准的MySQL帐户名格式。支持标识符或字符串作为用户名和主机名。默认情况下,如果它假定输入字符串的引号。

  • clusterAdminPassword对于InnoDB群集管理员帐户创建使用密码clusteradmin

  • clearReadOnly一种用于确认的布尔值super_read_only应设置为关,见超级只读和实例

  • interactive一种用于禁用交互式向导在命令执行布尔值,所以提示不提供给用户确认提示不显示。

  • restart一个用来显示远程重启目标实例应完成操作的布尔值。

连接密码可以包含在实例定义。或者,它可以被指定使用password选项

一旦dba.configureInstance()对实例发出命令检查实例的设置适用于InnoDB集群使用。报告显示由InnoDB集群所需要的设置。如果实例不需要任何更改其设置,你可以用它在InnoDB集群,可以继续创建群集。如果实例的设置不是有效的集群使用InnoDBdba.configureInstance()命令显示需要设置修改。配置前提示您确认是否显示表中的下列信息变化的实例:

  • Variable-无效的配置变量

  • Current Value为无效的配置变量的当前值。

  • Required Value对于配置变量所需的值。

你如何进行取决于实例支持保留设置,看保留设置。什么时候dba.configureInstance()对MySQL实例正在运行mysql发行,换句话说,本地实例,尝试自动配置实例。什么时候dba.configureinstance()对远程实例发出,如果实例支持坚持配置自动改变,你可以选择做这个。如果远程实例不支持持续的变化配置InnoDB集群使用,您必须配置实例局部。看到配置本地实例

在一般情况下,重启实例不需要经过dba.configureInstance()配置文件的选项,但对于一些特定的设置重新启动可能需要。此信息在产生后发布报告显示dba.configureinstance()。如果实例支持RESTART语句,mysql可以关机再启动实例。这确保了该实例的选项文件变化检测mysqld。更多信息见RESTART

笔记

在执行一个RESTART声明,对实例的当前连接丢失。如果启用自动重新连接,重新建立连接后,服务器将重新启动。否则,必须重新手动连接。

这个dba.configureInstance()方法验证合适的用户可用的集群使用,这是用于集群成员之间的联系,看用户权限。推荐的方式添加一个合适的用户使用clusterAdminclusteradminpassword选项,使您能够配置群集的用户和密码,当你调用一个函数。例如:

mysql-js> dba.configureInstance('ic@ic-1:3306', \ 
{clusterAdmin: 'icadmin@ic-1%',clusterAdminPassword: 'password'});

该用户被授予的权限可以管理群集。用户名的接受的格式遵循标准的MySQL帐户名的格式,看第6.2.4,“指定的帐户名”

如果你不指定管理群集的用户交互模式,在一个向导允许您选择下列选项之一:

  • 启用root用户远程连接

  • 创建一个新用户,相当于指定clusterAdminclusteradminpassword选项

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

下面的示例演示选择创建集群使用一个新的用户。

	
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作为聚类种子审机。种子实例复制到其他实例添加到集群中,使它们的种子实例副本。

mysql之前你必须创建一个群集因为当你连接到一个实例的问题dba.createCluster(name)mysql中创建一个MySQL协议会话连接到mysql服务器实例的当前全球会议。使用createCluster(DBA。name函数来创建群集指定返回给一个变量称为集群集群

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

Validating instance at ic@ic-1:3306...

This instance reports its own address as ic-1

Instance configuration is suitable.
Creating InnoDB cluster 'testCluster' on 'ic@ic-1:3306'...

Adding Seed Instance...
Cluster successfully created. Use Cluster.addInstance() to add MySQL instances.
At least 3 instances are needed for the cluster to be able to withstand up to
one server failure.

返回的聚类对象使用一个新的会话,独立于mysql的主会议。这样可以确保如果你改变mysql的全球会议,聚类对象保持会话实例。

小贴士

如果实例super_read_only=ON那么你可能需要确认adminapi可以设置super_read_only=OFF。看到超级只读和实例更多信息

笔记

如果你遇到一个错误相关的元数据访问你会环回网络接口配置。正确使用InnoDB集群禁用环回接口。

检查团已经创建,使用群集实例status()功能。看到检查InnoDB集群的现状

小贴士

一旦服务器实例属于一个集群是唯一的管理使用mysql和adminapi重要。尝试手动更改组复制实例的配置一旦被添加到群集不支持。同样,修改服务器变量innodb集群的关键,如server_uuid经过实例配置为使用adminapi不支持。

添加到群集实例

使用cluster.addInstance(instance)功能添加更多实例的集群,其中instance是连接信息配置的实例,看配置生产实例。要宽容失败的一个实例,你至少需要集群中的三个实例。进一步增加的情况下增加实例故障的容错。添加一个实例的聚类问题:

mysql-js> cluster.addInstance('ic@ic-2:3306')
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.

Please provide the password for 'ic@ic-2:3306': ********
Adding instance to the cluster ...

Validating instance at ic-2:3306...

This instance reports its own address as ic-2

Instance configuration is suitable.

The instance 'ic@ic-2:3306' was successfully added to the cluster.

实例验证已被添加,使用群集实例status()功能。例如这是添加一个二审后沙箱集群状态输出:

MySQL的JS &#62;cluster.status(){“:”testcluster集群名“{”、“defaultreplicaset”:“名字”:“默认”,“主”:“本地:3310”、“SSL”:“需要”、“状态”:“不好_ _ tolerance”、“statustext”:“is not to any故障容错群集。“拓扑”:{“localhost”:3310:{“地址”:“本地:3310”、“模式”:“readreplicas R / W”、“角色”:“{ }”:“有”,“状态”:“网络”},“localhost”:3320 {“地址”:“本地:3320”、“模式”:“R”或“{ },readreplicas”:“角色”:“有”,“身份”}:“在线”、“groupinformationsourcemember”:“MySQL”:/ /根本地:3310”}

你如何进行取决于实例的本地或远程实例上运行MySQL的外内核,和是否支持坚持配置自动改变,看保留设置。如果实例支持坚持配置自动改变,不需要你坚持手动设置可以添加更多的实例或继续下一步。如果实例不支持坚持配置自动改变,你必须配置实例局部。看到配置本地实例。这是为了确保实例与离开集群事件的集群的本质。

小贴士

如果实例super_read_only=ON那么你可能需要确认adminapi可以设置super_read_only=OFF。看到超级只读和实例更多信息

一旦你有你的集群部署可以配置MySQL路由器提供的高可用性,看第21.3,使用MySQL InnoDB集群路由器”

21.2.5沙箱InnoDB集群部署

本节说明如何建立一个沙箱InnoDB集群部署。你创建和管理你的InnoDB使用mysql集群与包括adminapi。假设这部分与mysql的熟悉,看MySQL的内核(8.0 8.0 MySQL的一部分)为进一步的信息

最初的部署和使用MySQL本地沙箱实例启动InnoDB集群探索的好方法。你完全可以测试出InnoDB集群本地部署之前,您的生产服务器。mysql已经创建的正确配置为在本地部署方案组的复制工作沙箱实例的内置功能。

重要

沙箱实例部署和运行在本地机器上测试的目的仅仅是合适的。在生产环境中的MySQL服务器实例部署到不同的主机在网络。看到第21.2.4,“生产部署InnoDB集群”更多信息

本教程演示如何使用mysql创建InnoDB集群组成的3 MySQL服务器实例。

部署沙箱实例

mysql中包括adminapi添加dba全局变量,它提供了沙箱实例管理功能。在这个例子中的设置,创建沙箱实例应用三deploysandboxinstance() DBA。

从命令提示符启动mysql的命令:

shell> mysqlsh

mysql提供了两种脚本语言模式、JavaScript和Python,除了本地的SQL模式。在这个指导mysql主要用于JavaScript模式。当mysql开始是JavaScript模式默认。开关方式发行\jsJavaScript的方式\ pyPython的模式,和\sqlSQL模式。确保你在JavaScript的方式发行“JS命令,然后执行:

mysql-js> dba.deploySandboxInstance(3310)
笔记

终止一个分号的命令是不需要在JavaScript和Python的方式。

参数传递到deploySandboxInstance()是TCP端口号在MySQL服务器实例侦听连接。默认情况下,在一个目录下创建沙箱合模/ MySQL / sandboxesport在UNIX系统。微软Windows系统目录%USERPROFILE% \ \ \ sandboxes MySQL的MySQLport

该实例的根用户的密码提示。

重要

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

部署进一步沙盒服务器实例,重复步骤遵循沙箱实例的端口3310,选择不同的端口号。对每一个额外的沙箱实例问题:

mysql-js> dba.deploySandboxInstance(port_number)

要按照本教程,使用端口号3310、3320和3330三个沙盒服务器实例。问题

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

创建沙箱InnoDB集群

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

连接mysql的种子的实例,在这种情况下,在3310个港口:

mysql-js> \connect root@localhost:3310

这个\connectmysql命令的快捷方式shell.connect()方法

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

一旦你连接,adminapi可以编写本地实例的选项文件。这是一个生产部署工作一样,你需要连接到远程实例运行mysql应用本地实例之前adminapi可以写实例的选项文件。

使用dba.createCluster()与当前连接的实例为种子创造innodb的聚类方法:

MySQL的JS &#62;var cluster = dba.createCluster('testCluster')

这个createCluster()方法应用InnoDB集群元数据选择的实例,并增加你当前连接到的种子实例的实例。这个createcluster()方法返回创建的集群,在上面的例子中,这是分配给cluster变量。参数传递到createcluster()方法是一个象征性的名字给了InnoDB的集群,在这种情况下testCluster

小贴士

如果实例super_read_only=ON那么你可能需要确认adminapi可以设置super_read_only=OFF。看到超级只读和实例更多信息

添加实例InnoDB集群

下一步是添加更多的情况下,InnoDB集群。任何由种子实例执行交易重新每次实例执行它添加。本教程使用的沙箱实例被创建之前在港口和3330 3320。

在这个例子中,种子的实例是最近创建的,所以它几乎是空的。因此,很少有数据需要被复制从种子实例二实例。在生产环境中,在那里你有种子实例一个现有的数据库,你可以使用的工具,如MySQL企业备份确保辅助匹配数据复制开始前。这就避免了长时间的延误的可能性,而数据复制从小学到中学。看到第18.4.4,使用MySQL企业备份组的复制”

添加二审InnoDB集群:

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

根用户的密码提示

添加第三的实例:

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

根用户的密码提示

在这一点上你已经创建了一个群3实例:初级、次级和两。

小贴士

你只能指定localhost进入addinstance()如果实例是一个沙箱实例。这也适用于隐addInstance()发行后的createcluster()

坚持沙箱配置

一旦沙盒实例被添加到群集的配置要求,InnoDB集群必须坚持每个实例的选项文件。你如何进行取决于实例支持坚持配置自动改变,看保留设置。当你使用的是MySQL实例支持坚持配置自动改变,添加实例自动配置实例。当MySQL实例,您使用的是不支持坚持配置自动改变,你必须配置实例局部。看到配置本地实例

检查团已经创建,使用群集实例status()功能。看到检查InnoDB集群的现状

一旦你有你的集群部署可以配置MySQL路由器提供的高可用性,看第21.3,使用MySQL InnoDB集群路由器”

21.2.6采用一组复制的部署

如果你有一组复制现有的部署和你想使用它来创建一个集群,通过adoptFromGR选择的createcluster() DBA。功能。创建InnoDB集群是否复制组比赛跑单发或多发。

采用现有的组复制组,连接到一个使用MySQL内核牌集团成员。在下面的例子中采用单一的初级群体。我们连接到gr-member-2一次实例,同时,gr-member-1作为集团的首要。创建一个集群使用dba.createCluster(),通过在adoptfromgr选项。例如:

  
mysql-js> var cluster = dba.createCluster('prodCluster', {adoptFromGR: true});

A new InnoDB cluster will be created on instance 'root@gr-member-2:3306'.

Creating InnoDB cluster 'prodCluster' on 'root@gr-member-2:3306'...
Adding Seed Instance...

Cluster successfully created. Use cluster.addInstance() to add MySQL instances.
At least 3 instances are needed for the cluster to be able to withstand up to
one server failure.
小贴士

如果实例super_read_only=ON那么你可能需要确认adminapi可以设置super_read_only=OFF。看到超级只读和实例更多信息

新的集群相匹配的集团模式。如果采用单组运行的主要模式然后一个主要创建群集。如果采用组多主模式那么多主集群上运行了。

21.3使用MySQL InnoDB集群路由器

本节介绍了如何使用MySQL InnoDB集群路由器来实现高可用性。不管你是否已经部署了一个沙箱或生产集群路由器可以配置MySQL InnoDB本身基于集群的元数据的使用--bootstrap选项这个配置MySQL路由器自动路由连接到群集的服务器实例。客户端应用程序连接到MySQL的端口路由器提供,而不需要知道数据库集群的拓扑结构。在一个意想不到的故障时,InnoDB会自动调整和MySQL集群路由器检测到的变化。这将删除您的客户机应用程序来处理故障转移的需要。有关更多信息,参见MySQL InnoDB分簇路由

笔记

不要试图配置MySQL路由器手动重定向到InnoDB的港口集群。总是使用--bootstrap选择以保证路由器的配置MySQL InnoDB集群的元数据。看到集群元数据和状态

MySQL路由器推荐部署在同一台主机的应用。使用沙盒部署时,一切都是在一个主机上运行,因此您部署MySQL路由器相同的主机。采用生产部署时,我们建议部署一个MySQL路由器实例每台机器用来举办一个你的客户端应用程序。它也可能部署MySQL路由器普通机通过连接你的应用实例。

假设MySQL路由器已经安装(见安装MySQL路由器),使用的--bootstrap选项提供一个服务器实例属于InnoDB群的位置。MySQL的路由器使用包括元数据缓存插件检索InnoDB集群的元数据,包括一个列表的服务器实例的地址构成InnoDB集群和集群中的作用。你通过服务器,MySQL InnoDB集群路由器应该从中检索元数据的URI字符串类型。例如:

内核&#62;mysqlrouter --bootstrap ic@ic-1:3306 --user=mysqlrouter 

提示你的MySQL路由器实例使用密码和加密密钥。这种加密密钥用于加密的路由器用于连接到MySQL集群实例的密码。端口可以使用连接到InnoDB集群也显示。MySQL路由器启动过程中创建一个mysqlrouter.conf文件,基于地址传递检索集群元数据的设置--bootstrap选项,在上面的例子中IC@IC - 1:3306396。基于集群的元数据检索MySQL InnoDB,路由器自动配置mysqlrouter.conf文件,包括A_元数据缓存部分bootstrap_server_addresses含有对集群中的所有服务器实例的地址。例如:

[metadata_cache:prodCluster]router_id=1bootstrap_server_addresses=mysql://ic@ic-1:3306,mysql://ic@ic-2:3306,mysql://ic@ic-3:3306user=mysql_router1_jy95yozko3k2metadata_cluster=prodClusterttl=300
小贴士

当你改变一个集群的拓扑结构在你举MySQL Router添加另一个服务器实例,您需要更新bootstrap_server_addresses基于更新的元数据。请重新启动路由器使用MySQL--bootstrap选项,或手动编辑bootstrap_server_addresses部分的mysqlrouter.conf文件和MySQL重启路由器。

生成的MySQL路由器配置创建TCP端口可以用来连接到群集。端口使用MySQL集群通信协议的经典和X协议的创建。使用X协议的服务器实例必须有X插件的安装和配置。一个沙盒部署实例X插件自动设置。对于生产部署,如果你想使用X协议需要安装在每个实例配置X插件,看20.2节,“建立MySQL作为文档存储”。默认的TCP端口:

  • 6446-经典的MySQL协议读写会话,MySQL路由器重定向到主服务器实例的传入连接。

  • 6447-经典的MySQL协议只读会话,MySQL路由器重定向到一个辅助服务器实例的传入连接。

  • 64460- X协议读写会话,MySQL路由器重定向到主服务器实例的传入连接。

  • 64470- X协议只读会话,MySQL路由器重定向到一个辅助服务器实例的传入连接。

这取决于你的MySQL路由器的配置端口号可能是上述不同。例如,如果你使用--conf-base-port选项,或group_replication_single_primary_mode变量。确切的港口上市当你启动MySQL路由器。

传入连接被重定向的方式取决于集群所使用的类型。使用一个单一的主要集群时,默认情况下MySQL路由器发布X协议和一个经典的协议端口,客户端连接到读写会话,这将被重定向到集群的单原。一个多主集群读写会话重定向到一个循环的方式的主要情况。例如,这意味着到6446端口的第一连接将被重定向到IC-1实例,端口6446的第二连接将被重定向到白细胞介素2例,等等。传入的只读连接MySQL路由器重定向到一个辅助的情况下连接,也以循环的方式。修改这个行为看routing_strategy选项

一旦引导和配置路由器,启动MySQL。如果你使用一个全系统的安装与--bootstrap然后选择问题:

内核&#62;mysqlrouter &

如果你安装MySQL目录使用路由器--directory选项,使用start.sh脚本中发现你安装目录。或者建立一个服务自动启动MySQL路由器系统启动的时候,看到启动MySQL的路由器。你现在可以连接一个MySQL客户端,比如mysql的一个路由器端口输入MySQL如上看看客户获取透明地连接到一个InnoDB集群实例。

shell> mysqlsh --uri root@localhost:6442

验证实例,你实际上是相连的,只是反对一个SQL查询port状态变量

MySQL的JS &#62;\sql切换到SQL模式…命令结束;MySQL的SQL &#62;select @@port;-------- | @ @港| -------- | 3310 | --------

测试高可用性

如果要测试高可用性的作品,通过实例模拟意外停止杀戮。群集检测事实实例离开集群和重新配置。究竟如何集群重新配置本身取决于你使用的是单次或多主集群,和角色实例服务集群内。

在单一的基本模式:

  • 如果当前的初生叶簇,一次的情况下被选为新的主,用实例优先级最低的server_uuid。路由器重定向连接到MySQL读写新当选的原。

  • 如果当前二叶簇,MySQL路由器停止重定向只读连接实例。

更多信息见第18.4.1.1,“单原模式”

在多主模式:

  • 如果当前的“跑道”实例的叶簇,MySQL路由器重定向读写连接到其他的初选。如果这是最后一次离开实例集群中的集群则完全消失,你不能连接到任何MySQL的路由器端口。

更多信息见第18.4.1.2,“多主模式”

有不同的方法来模拟实例离开集群,例如你可以强行停止实例MySQL服务器,或使用adminapidba.killSandboxInstance()如果测试沙盒部署。在这个例子中,假设有一个单一的初级沙盒集群部署3服务器实例和实例的监听端口3310是目前主要的。模拟实例离开集群的意外:

MySQL的JS &#62;dba.killSandboxInstance(3310)

群集检测变化和选举新发自动。假设你的会话连接到端口6446,默认的读写mysql的经典协议端口,路由器应该检测MySQL集群的拓扑结构的变化,将你的会议,新当选的原。为了验证这一点,切换到SQL模式使用mysql\sql命令并选择实例port变量检查,例如您的会话已被重定向到。注意,第一SELECT语句失败作为原始的连接丢失。这意味着当前会话已经关闭,mysql自动重新连接你和当你发出命令再次确认新的港口。

MySQL的JS &#62;\sql切换到SQL模式…命令结束;MySQL的SQL &#62;SELECT @@port;错误:2013(hy000):查询全球会议期间丢失连接到MySQL服务器断开了。正在尝试重新连接到&#39; root@localhost:6446…全球会议成功连接MySQL的SQL &#62;。SELECT @@port;-------- | @ @港| -------- | 3330 | -------- 1行集(0秒)

在这个例子中,在端口3330的实例被选为新的主。这表明,InnoDB群为我们提供了自动故障转移,MySQL的路由器有自动重新连接我们新的主实例,和我们的高可用性。

MySQL的路由器和元数据服务器

当MySQL Router举对集群,它记录的服务器实例的配置文件的地址。如果任何额外的实例引导以后MySQL路由器添加到群集,他们不会自动检测并因此用于连接路由

为了确保新加入的情况下被路由到正确你必须启动MySQL集群路由器对阅读更新的元数据。这意味着你必须重新启动路由器,包括MySQL--bootstrap选项

21.4 InnoDB集群的工作

本节说明如何用InnoDB集群工作,以及如何处理常见的管理任务。

检查实例配置

从服务器实例之前,你需要检查每个实例上的MySQL配置正确创建生产部署。除了dba.configureInstance(),检查配置的配置实例部分,您可以使用Cheeckstance配置()功能。这确保了实例满足21.2.2节,“InnoDB集群要求”在不改变任何配置的实例。这不检查是对实例的任何数据,看检查实例的状态更多信息。下面演示了发行这一运行mysql:

mysql-js> dba.checkInstanceConfiguration('ic@ic-1:3306')
Please provide the password for 'ic@ic-1:3306': ***
Validating MySQL instance at ic-1:3306 for use in an InnoDB cluster...

This instance reports its own address as ic-1
Clients and other cluster members will communicate with it through this address by default.
If this is not correct, the report_host MySQL system variable should be changed.

Checking whether existing tables comply with Group Replication requirements...
No incompatible tables detected

Checking instance configuration...

Some configuration options need to be fixed:
+--------------------------+---------------+----------------+--------------------------------------------------+
| Variable                 | Current Value | Required Value | Note                                             |
+--------------------------+---------------+----------------+--------------------------------------------------+
| binlog_checksum          | CRC32         | NONE           | Update the server variable                       |
| enforce_gtid_consistency | OFF           | ON             | Update read-only variable and restart the server |
| gtid_mode                | OFF           | ON             | Update read-only variable and restart the server |
| server_id                | 1             |                | Update read-only variable and restart the server |
+--------------------------+---------------+----------------+--------------------------------------------------+

Please use the dba.configureInstance() command to repair these issues.

{
    "config_errors": [
        {
            "action": "server_update",
            "current": "CRC32",
            "option": "binlog_checksum",
            "required": "NONE"
        },
        {
            "action": "restart",
            "current": "OFF",
            "option": "enforce_gtid_consistency",
            "required": "ON"
        },
        {
            "action": "restart",
            "current": "OFF",
            "option": "gtid_mode",
            "required": "ON"
        },
        {
            "action": "restart",
            "current": "1",
            "option": "server_id",
            "required": ""
        }
    ],
    "errors": [],
    "status": "error"
}

重复此过程,为每个服务器实例,你打算使用你的群集的一部分。运行后产生的报告dba.checkInstanceConfiguration()提供有关任何配置信息变化之前你可以要求。这个行动场中config_error该报告的部分告诉你是否需要重启实例MySQL来检测任何更改配置文件。

配置本地实例

实例不支持坚持配置自动改变(见保留设置)需要连接到服务器,运行mysql,连接到实例的局部问题dba.configureLocalInstance()。这使得mysql修改实例的选项文件运行以下命令后对远程实例:

  • dba.configureInstance()

  • dba.createCluster()

  • Cluster.addInstance()

  • Cluster.removeInstance()

  • Cluster.rejoinInstance()

重要

未能坚持的实例选项文件配置的变化会导致实例不重新加入集群后,下次重启。

推荐的方法是登录到远程机器,例如使用ssh,mysql作为root用户运行,然后连接到MySQL服务器的地方。例如,使用--uri选择连接到本地instance

内核&#62;sudo -i mysqlsh --uri=instance

交替使用\connect命令登录到本地实例。然后问题dba.configureinstance(instance,在那里instance是本地实例的连接信息,坚持向本地实例的选择文件的任何更改。

MySQL dba.configurelocalinstance JS &#62;(@:3306 IC IC 2)

重复此过程,为每个实例中不支持坚持配置自动改变集群。例如,如果你添加2个实例群集不支持坚持配置自动改变,你必须连接到每台服务器,坚持配置的变化所需的InnoDB集群实例重新启动前。同样,如果你修改的集群结构,例如改变实例的数量,你需要为每个服务器实例更新innodb集群元数据因此每个实例集群中重复这一过程。

InnoDB聚类检索

当你创建一个集群使用dba.createCluster(),操作返回一个集群对象可以赋值给一个变量。你用这个对象与集群工作,例如添加实例或检查集群的现状。如果你想找回一个集群再次在稍后的日期,例如在重启mysql,使用[ dba.getcluster(name],[options])功能。例如:

MySQL的JS &#62;var cluster1 = dba.getCluster()

如果你不指定群集name然后返回默认的簇。默认情况下,mysql尝试连接到集群的主实例,当你使用dba.getcluster()。设置connectToPrimary选择要配置的行为。如果connecttoprimarytrue和积极的全球mysql会话不是初级实例,聚类查询主要构件和聚类对象连接到它。如果集群中有没有法定人数,操作失败。如果connecttoprimaryfalse,群集对象使用活动会话,换句话说,比如mysql的全球会议一样。如果connecttoprimary没有指定,mysql治疗connectToPrimary作为真正的,落回connectToPrimary存在

强制连接到二时得到一个集群,建立一个集群的次要构件的连接和使用connectToPrimary备选案文:

MySQL的JS &#62;shell.connect(secondary_member)MySQL的JS &#62;var cluster1 = dba.getCluster(testCluster, {connectToPrimary:false})
小贴士

记得有次实例super_read_only=ON,所以你不能写它们的变更。

检查InnoDB集群的现状

聚类对象提供status()方法使您可以检查一个集群运行。之前,你可以检查InnoDB集群的状态,你需要通过连接到其任何情况下得到一个参考InnoDB聚类对象。然而,如果你想更改群集的配置,您必须连接到一个“跑道”的实例。发行status()检索基于该服务器实例连接到您的意识和输出状态报告的集群视角的集群状态。

重要

集群中的实例的状态直接影响在状态报告中提供的信息。因此确保你连接到实例的状态ONLINE

有关如何运行使用InnoDB集群,集群status()方法

MySQL的JS &#62;var cluster = dba.getCluster()MySQL的JS &#62;cluster.status(){    &#34;clusterName&#34;: &#34;testcluster&#34;,     &#34;defaultReplicaSet&#34;: {        &#34;name&#34;: &#34;default&#34;,         &#34;primary&#34;: &#34;ic-1:3306&#34;,         &#34;ssl&#34;: &#34;REQUIRED&#34;,         &#34;status&#34;: &#34;OK&#34;,         &#34;statusText&#34;: &#34;Cluster is ONLINE and can tolerate up to ONE failure.&#34;,         &#34;topology&#34;: {            &#34;ic-1:3306&#34;: {                &#34;address&#34;: &#34;ic-1:3306&#34;,                 &#34;mode&#34;: &#34;R/W&#34;,                 &#34;readReplicas&#34;: {},                 &#34;role&#34;: &#34;HA&#34;,                 &#34;status&#34;: &#34;ONLINE&#34;            },             &#34;ic-2:3306&#34;: {                &#34;address&#34;: &#34;ic-2:3306&#34;,                 &#34;mode&#34;: &#34;R/O&#34;,                 &#34;readReplicas&#34;: {},                 &#34;role&#34;: &#34;HA&#34;,                 &#34;status&#34;: &#34;ONLINE&#34;            },             &#34;ic-3:3306&#34;: {                &#34;address&#34;: &#34;ic-3:3306&#34;,                 &#34;mode&#34;: &#34;R/O&#34;,                 &#34;readReplicas&#34;: {},                 &#34;role&#34;: &#34;HA&#34;,                 &#34;status&#34;: &#34;ONLINE&#34;            }        }    },     &#34;groupInformationSourceMember&#34;: &#34;mysql://ic@ic-1:3306&#34;}

信息的输出cluster.status()提供以下信息:

  • clusterName:名称分配给该簇中dba.createCluster()

  • defaultreplicaset:服务器实例属于InnoDB集群和包含的数据集。

  • 原发性:当集群中显示单个主模式操作。显示当前主实例的地址。如果没有显示这一领域,集群在多主模式操作。

  • SSL安全连接:是否由簇或不使用。显示值REQUIRED禁用,这取决于如何memberSslMode在选择配置createcluster()addInstance()。这个值参数返回对应的值group_replication_ssl_mode在实例的服务器变量。看到确保你的集群

  • 现状:该元素的集群状态。对集群整体描述的这个集群提供的高可用性。现状是下列之一:

    • ONLINE:实例在线参与集群

    • OFFLINE:实例已经失去了连接到其他实例。

    • RECOVERING:实例试图用群集同步交易需要通过检索才可以成为一个在线会员

    • UNREACHABLE:实例已经失去了与集群通信。

    • ERROR:实例已在恢复阶段或同时应用事务时遇到了一个错误。

      重要

      一旦一个实例进入ERROR的状态,super_read_only选项设置为打开(放)。离开ERROR你必须手动配置实例super_read_only=OFF

    • (MISSING):一个实例是配置的群集的一部分的国家,但目前不可用。

      笔记

      这个MISSING国家是特定的InnoDB集群,它不是由组复制产生的状态。mysql使用此状态表明在元数据注册实例,但不能在现场查看发现,集群。

  • 拓扑结构:它已被添加到群集实例。

  • 实例:实例的主机名的主机名称,例如本地:3310。

  • 作用:什么功能提供了在集群实例。目前只有哈,高可用性。

  • 模式:服务器是否读写(R / W)或只读(R/O”)。模式说明R/W(读和写)或R/O(只读)。在单一的基本模式,只有一个实例标记为“R/W”可以执行交易,更新数据库,所以它是主要的。如果情况变得遥不可及任何原因(比如意外停机),剩下的“R/O”的情况下,自动接管它的位置,成为新的“跑道”的原。在多主模式,所有实例都标记为“R/W”并没有一个单一的选主。

  • groupinformationsourcemember:内部连接用于获取有关群集的信息,如一个URI字符串类型。通常用于创建群集的连接。

描述InnoDB集群结构

获得关于InnoDB集群本身的结构信息,使用cluster.describe()功能:

MySQL的JS &#62;cluster.describe();{“clusterName”:“testcluster”、“defaultreplicaset”:{“名字”:“默认”、“拓扑”:[ {“地址”:“ic-1:3306”、“标签”:“ic-1:3306”、“角色”:“哈”},{“地址”:“ic-2:3306”、“标签“:”ic-1:2306”、“角色”:“哈”},{“地址”:“ic-3:3306”、“标签”:“ic-3:3306”、“角色”:“哈”} } } ]

这个输出函数显示InnoDB集群包括其所有配置信息的结构,等等。地址标签和角色价值观匹配了检查InnoDB集群的现状

超级只读和实例

组复制的停止的时候,super_read_only变量设置为打开(放)确保没有写了实例。当您尝试使用这样一个实例,下面你可以选择adminapi命令集super_read_only=OFF在实例:

  • dba.configureInstance()

  • dba.configureLocalInstance()

  • dba.createCluster()

  • dba.rebootClusterFromCompleteOutage()

  • dba.dropMetadataSchema()

当遇到一个实例,adminapisuper_read_only=ON在交互模式下,你可以选择设置super_read_only=OFF。。。。。。。例如:

MySQL的JS &#62;var myCluster = dba.createCluster('testCluster')一个新的InnoDB集群将实例“IC”ic-1:3306 &#39;创建。MySQL实例在IC @ ic-1:3306”目前已设置为防止无意更新应用的super_read_only系统变量。你必须先取消它能够执行任何改变这种情况。更多信息见:http:/ / dev.mysql。COM /医生/ refman / EN /服务器系统变量。HTML # sysvar_super_read_only.note:有公开的会议“IC”ic-1:3306’。你可能想杀死这些会话以防止他们表演意想不到的更新:1打开会话(S)“IC”ic-1:3306 &#39;。你想禁用super_read_only并继续吗?【Y | n ]:

对实例的当前活动会话的数量显示。你必须确保没有任何应用程序可以写的实例不经意。通过回答y你确认adminapi可以写的实例。如果有多个打开的会话实例上市,谨慎之前允许adminapi设置super_read_only=OFF

给力的功能设置super_read_only=OFF在脚本中,通过clearreadonly选项设置为true。例如dba.configureinstance(instanceclearreadonly },{:true)。

管理沙盘实例

一旦一个沙箱实例正在运行,可以在任何时间使用下列改变其现状:

  • 停止一个沙箱实例使用dba.stopSandboxInstance(instance)。停止实例优雅,不像killsandboxinstance(DBA。instance

  • 开始一个沙箱实例使用dba.startSandboxInstance(instance)

  • 杀死一个沙箱实例使用dba.killSandboxInstance(instance)。停止实例没有优雅地停止并用于模拟意外停止。

  • 要删除一个沙箱实例使用dba.deleteSandboxInstance(instance)。这完全消除了沙箱实例从您的文件系统。

从群集中删除实例InnoDB

你可以在任何时候从群集删除实例,如果你想这样做。这是可以做到的Cluster.removeInstance(instance)的方法,在以下的例子:

MySQL的JS &#62;cluster.removeInstance('root@localhost:3310')实例将从群集中删除InnoDB。根据instancebeing种子或没有,元数据的会话可能成为无效。如果是这样的话,pleasestart新会话的元数据存储的R / W的实例,试图从组复制组…离开实例的本地:3310成功从群集中删除。

您可以通过在interactive选项控制是否提示您确认从集群移除实例。在交互模式下,系统会提示您继续使用该实例的去除(或没有)的情况下是不可到达的。这个clusterremoveinstance()。操作确保实例是从所有集群成员的元数据删除在线,和实例本身

当实例被删除了,还需要应用交易,adminapi等待到mysql配置的秒数dba.gtidWaitTimeout期权交易(gtids)适用。mysqldba.gtidwaittimeout选项的缺省值为60秒,看配置mysql有关更改默认信息。如果定义的超时值dba.gtidWaitTimeout等待交易时,应与选项false(或不确定)然后发出错误和删除操作被中止。如果定义的超时值dba.gtidwaittimeout等待交易时,应与force选项设置为真正的然后继续运行没有错误,从群集中删除实例。

重要

这个force选项只能用于Clusterremoveinstance(。instance当你想忽略任何错误,例如未经处理的交易或实例遥不可及,和不打算重用的实例与集群。忽略错误时删除实例从群集中可能导致的一个实例是不与集群的同步性,防止它重新加入群集在稍后的时间。只使用force选择当你计划不再使用实例的集群,在所有其他情况下,你应该尽量恢复实例和删除它,当它是可用的和健康的,换句话说,与现状在线

定制InnoDB集群

当你创建一个群集添加实例,价值观等的组名称,本地地址,和种子的情况下adminapi自动配置。这些默认值是建议大多数部署,但高级用户可以通过下列选项来覆盖这些默认值dba.createCluster()addinstance()集群。

定制的InnoDB群集创建复制组的名称,通过groupName选择的createcluster() DBA。命令。这套group_replication_group_name系统变量。名称必须是一个有效的UUID。

自定义地址,从其他实例的连接提供了一个实例,通过localAddress选择的createcluster() DBA。cluster.addInstance()命令。指定格式的地址hostport。这套group_replication_local_address在实例变量系统。地址必须在群集的所有实例的访问,必须保留为内部群集通讯。换句话说,不要使用这个地址的通信实例。

定制作为种子在实例加入集群的情况下,通过groupSeeds选择的createcluster() DBA。cluster.addInstance()命令。种子的实例联系时的一个新实例加入群集,用于提供数据到新的实例。地址指定为一个以逗号分隔的列表如主持:1host2:port2。这个配置group_replication_group_seeds系统变量

更多信息见本系统变量配置这些adminapi选项文件。

重新加入群集

如果一个实例的叶簇,例如因为它失去了联系,没有或不能自动加入集群,可能需要重新加入到群集在稍后的阶段。答辩实例聚类问题cluster.rejoinInstance()

在一个实例没有的情况下过它的配置保存,在重新启动实例不加入集群自动。解决的办法是问题cluster.rejoinInstance()这样的实例被添加到群集再次。然后连接到实例,运行mysql局部问题委托人。这确保了InnoDB群集配置保存到实例的选项文件使其重新加入集群自动。

小贴士

如果实例super_read_only=ON那么你可能需要确认adminapi可以设置super_read_only=OFF。看到超级只读和实例更多信息

恢复从群体损失一簇

如果一个实例(或实例)失败,然后群集失去仲裁,这是一个新的初选投票的能力。在这种情况下,你可以重新仲裁的使用方法cluster.forceQuorumUsingPartitionOf()在下面的示例中所示:mysql

/ /打开一个clustermysql JS &#62;cluster = dba.getCluster("prodCluster")/ /群集失去仲裁,其状态显示/“身份”:“no_quorum MySQL js“&#62;cluster.forceQuorumUsingPartitionOf("localhost:3310")恢复replicaset默认从损失的群体,由[本地分区:3310 ]请提供密码“root@localhost:3310:******恢复InnoDB集群…InnoDB集群成功恢复使用实例的root@localhost分区:3310”。警告:为避免脑裂的情况,确保所有其他成员的replicaset除去或加入到组,恢复。

重启集群从大停电

如果你的集群遭受全面停电,你可以确保它被正确使用dba.rebootClusterFromCompleteOutage()。如果在一个集群已经完全停止,必须启动的情况下才能集群开始。例如,如果机器一个沙箱集群运行于已重新启动,并实例进行港口3310、3320和3330,问题:

mysql-js> dba.startSandboxInstance(3310)mysql-js> dba.startSandboxInstance(3320)mysql-js> dba.startSandboxInstance(3330)

这确保了沙盒中运行的实例。在生产部署,你将不得不启动实例MySQL内核外的情况。一旦情况开始,连接到一个实例并运行mysql。然后重新启动集群通过发行:

        
mysql-js> shell.connect('root@localhost:3310');
mysql-js> var cluster = dba.rebootClusterFromCompleteOutage();

小贴士

如果实例super_read_only=ON那么你可能需要确认adminapi可以设置super_read_only=OFF。看到超级只读和实例更多信息

这保证了集群是正确配置一个完整的中断后。它使用的实例,mysql连接为新种子实例恢复基于实例的现有元数据集群。

如果这个过程失败,和集群元数据已损坏严重,你可能需要把元数据和再次从头开始创建群集。你可以使用集群元数据dba.dropMetadataSchema()

警告

这个dba.dropMetadataSchema()方法只应作为最后的手段,当它是不可能恢复的集群。无法撤消。

重新扫描一个集群

如果一个实例的配置变化是没有用adminapi,你需要重新聚类更新innodb集群元数据。例如,如果你手动添加的一个新实例的组复制组,InnoDB集群元数据并不能改进的基于这种变化的集群由于没有使用mysql。在这种情况下,有必要重新审视集群cluster.rescan()更新innodb集群元数据。

命令之后cluster.rescan()已运行情况确定,新发现的实例。提示您添加这些新发现的情况下进入你的集群的要求,或者你也可以选择忽略它们。

实例不再属于群集或不可用也报道。在这种情况下,提示您删除实例,或者你可以稍后尝试添加到群集使用如下命令cluster.rejoin('ic@ic-4:3306')

检查实例的状态

这个cluster.checkInstanceState()函数可以用来验证实例的现有数据并不妨碍它加入一个集群。这个过程通过验证实例的全局事务标识符(gtid)状态相比,集群已经处理了gtids。在gtids的更多信息见第17.1.3.1”gtid格式和存储”。这个检查可以确定是否已处理的交易实例可以被添加到群集。

下面演示了发行这一运行mysql:

mysql-js> cluster.checkInstanceState('ic@ic-4:3306')

这个函数的输出可以是下列之一:

  • 好新:实例未执行任何gtid交易,因此不能与gtids由群集执行冲突

  • 好采:实例执行gtids不执行gtids群集的情况下冲突的种子

  • 错误的分歧:实例执行gtids发散与执行gtids集群的种子实例

  • 错误lost_transactions:实例更具有执行gtids比执行gtids集群的种子实例

一个好的状态的情况下,可以添加到群集因为在实例的任何数据与集群一致。换句话说,实例被检查没有执行任何交易与gtids由群集执行的冲突,并可以恢复到相同的状态作为集群的其它实例。

溶解InnoDB集群

解散InnoDB集群您连接到读写实例,例如在一个主群小学,并使用Cluster.dissolve()命令。这将删除所有元数据和配置与集群相关,并禁用组复制实例。任何数据都不会被删除的实例之间复制。有没有办法解开一个集群的溶解,因此你必须通过力:真的确认你想解散群。例如:重新创建它dba.createCluster()

MySQL的JS &#62;session<ClassicSession:root@localhost:3310>mysql-js>cluster.dissolve({force:true})集群成功溶解。复制是残疾但用户数据被原封不动。
笔记

发行后的cluster.dissolve(),分配给任何变量集群对象不再有效

确保你的集群

服务器实例可以被配置为使用安全连接。一般信息使用SSL与MySQL看到6.4节,“使用加密的连接”。本节说明如何配置群集使用SSL。一个额外的安全可能是配置的服务器可以访问群集,看创建一个白名单的服务器

重要

一旦你已经配置了一个集群使用SSL必须添加服务器到ipWhitelist

当使用dba.createCluster()建立一个集群,如果服务器实例提供了SSL加密,则自动启用对种子的实例。通过membersslmode选择的dba.createCluster()指定一个不同的SSL模式的方法。一个簇的SSL模式只能设置在创建时。这个membersslmode期权是一个字符串,配置SSL的方式被使用,它的默认值AUTO。允许的值禁用REQUIRED,和汽车。这些模式被定义为:

  • 设置createCluster({memberSslMode:'DISABLED'})SSL加密是保证种子实例残疾人在集群。

  • 设置createCluster({memberSslMode:'REQUIRED'})然后SSL加密启用实例集群中的种子。如果它不能使一个错误了。

  • 设置createCluster({memberSslMode:'AUTO'})(默认)然后SSL加密是如果服务器实例支持自动启用或禁用,如果服务器不支持。

笔记

使用MySQL的商业版的时候,SSL是默认启用的,你可能需要配置白名单中的所有实例。看到创建一个白名单的服务器

当你的问题cluster.addInstance()rejoininstance()集群。命令,实例上的SSL加密是启用或禁用基于设置发现种子实例。

当使用createCluster()adoptfromgr选择采用现有的组复制组,没有SSL的设置都在采用集群改变:

  • memberSslMode不能使用adoptfromgr

  • 如果采用集群SSL设置不同的mysql的支持,换句话说,SSL集团复制恢复和组通信,同时设置不改。这意味着你不能添加新实例的集群,除非你手动更改设置为采用集群。

mysql中始终启用或禁用SSL两组复制恢复和组通信的集群,看第18.5.2,安全套接字层(SSL)的支持”。一个验证,如果这些设置是为种子实例不同发出错误(例如作为一个结果dba.createCluster()使用adoptfromgr)添加到集群中的一个新实例时。SSL加密必须启用或禁用对集群中的所有实例。验证以确保这不变的是集群中添加一个新的实例时。

这个deploySandboxInstance()命令试图用SSL加密默认支持部署沙箱实例。如果这是不可能的,服务器实例配置不支持SSL。使用ignoresslerror选项设置为false,以确保沙箱实例部署SSL支持,发出一条错误如果不能提供SSL支持。什么时候ignoreSslError是真的,这是默认的,没有错误是发布在操作过程中如果不能提供SSL支持的服务器实例部署没有SSL的支持。

创建一个白名单的服务器

当使用一个集群createCluster()addinstance(),和rejoinInstance()方法,您可以选择指定认可的服务器,属于集群,被称为“白名单”。通过指定的白名单,明确这样你可以增加你的集群的安全因为在白名单中唯一的服务器可以连接到群集。默认情况下,如果没有显式指定的白名单,自动设置为私网地址,服务器的网络接口。配置白名单,指定要添加的服务器ipwhitelist在应用这种方法时的选择。通过服务器作为一个逗号分隔的列表,用引号括起。使用ipWhitelist选项配置group_replication_ip_whitelist在实例变量系统。例如:

MySQL的JS &#62; cluster.addInstance("ic@ic-3:3306", {ipWhitelist: "203.0.113.0/24, 198.51.100.110"})

这个配置实例只接受来自服务器的连接地址203.0.113.0/24198.51.100.110。白名单还包括主机名,这是解决只有当一个连接请求是由另一个服务器。

警告

主机名是固有的安全性低于在白名单的IP地址。fcrdns MySQL进行验证,它提供了一个很好的保护水平,但可以通过攻击某些类型的损害。指定主机名称在你的白名单,只有在绝对必要的,并确保所有用于名称解析组件,如DNS服务器,保持在你的控制之下。您也可以执行名称解析使用本地主机文件,避免了外部元件的使用。

使用mysql执行脚本

你可以自动配置脚本。例如:

shell> mysqlsh -f setup-innodb-cluster.jss
笔记

任何命令行选项的脚本文件名后指定传递给脚本MySQL的内核。你可以访问这些选项使用os.argv阵列在JavaScript中,或sys.argv阵列在Python。在这两种情况下,第一个选择拿起阵列中的脚本名称。

一个脚本文件的内容显示在这里:

print('MySQL InnoDB cluster sandbox set up\n');
print('==================================\n');
print('Setting up a MySQL InnoDB cluster with 3 MySQL Server sandbox instances.\n');
print('The instances will be installed in ~/mysql-sandboxes.\n');
print('They will run on ports 3310, 3320 and 3330.\n\n');

var dbPass = shell.prompt('Please enter a password for the MySQL root account: ', {type:"password"});

try {
   print('\nDeploying the sandbox instances.');
   dba.deploySandboxInstance(3310, {password: dbPass});
   print('.');
   dba.deploySandboxInstance(3320, {password: dbPass});
   print('.');
   dba.deploySandboxInstance(3330, {password: dbPass});
   print('.\nSandbox instances deployed successfully.\n\n');

   print('Setting up InnoDB cluster...\n');
   shell.connect('root@localhost:3310', dbPass);

   var cluster = dba.createCluster("prodCluster");

   print('Adding instances to the cluster.');
   cluster.addInstance({user: "root", host: "localhost", port: 3320, password: dbPass});
   print('.');
   cluster.addInstance({user: "root", host: "localhost", port: 3330, password: dbPass});
   print('.\nInstances successfully added to the cluster.');

   print('\nInnoDB cluster deployed successfully.\n');
} catch(e) {
   print('\nThe InnoDB cluster could not be created.\n\nError: ' +
   + e.message + '\n');
}

21.5 known limitations

本节介绍了InnoDB集群的已知的限制。Innodb群集使用组复制,你也应该意识到它的局限性,看第18.7.2”组,复制限制”

  • 包含多字节字符的格式化结果有时没有正确对齐的列。同样,非标准字符集被损坏的结果。

  • adminapi不支持UNIX套接字连接。mysql目前并没有阻止你尝试使用套接字连接到群集,并试图用一个插座连接到群集可能导致意外的结果。

  • 如果会话类型不指定创建全局会话时,mysql提供自动协议检测试图首先创建一个nodesession如果失败,它试图创造一个classicsession。与InnoDB集群由三服务器实例,其中有一个读写端口和两个只读端口,这会导致MySQL内核连接的一个只读实例。因此建议总是指定会话类型创建全局会话时。

  • 当添加非沙盒服务器实例(实例,你必须手动配置而不是使用dba.deploySandboxInstance())到集群,mysql是不能够坚持的实例的配置文件的任何配置变化。这导致一个或两个以下的情景:

    1. 组复制配置不坚持实例的配置文件,在重新启动实例不加入集群。

    2. 实例是不是有效的集群使用。虽然实例可以验证dba.checkInstanceConfiguration(),和mysql进行所需的配置的变化,为了使实例准备集群使用,这些变化并不坚持在配置文件中,失去了一次重新启动时。

    只要a发生的实例不重启后重新加入群集。

    如果b同时发生的时候,你观察到的实例不重启后重新加入群集,您不能使用推荐dba.rebootclusterfromcompleteoutage()在这种情况下获得集群上线。这是因为实例失去任何配置mysql中做出了改变,因为他们没有坚持到底,实例恢复到以前的状态之前被配置为群集。这使得组复制停止响应,并最终命令超时。

    为了避免这个问题,我们强烈建议使用dba.configureInstance()在加入实例以集群坚持配置的变化。

  • 使用的--defaults-extra-file选项指定一个选项文件不支持InnoDB集群服务器实例。

  • MySQL版本8.0.4实例可以无限期地挂在一个失败的尝试加入群集组所有种子事件(group_replication_group_seeds)是遥不可及的。这一事件发生的一个集群完全停运后,换句话说,所有实例的集群崩溃之后重新启动。