[图文]搭建InnoDB Cluster详细流程

1 概述

InnoDB Cluster 由至少三个 MySQL Server 实例组成,它提供高可用性和扩展功能。

InnoDB Cluster 使用以下 MySQL 技术:

  • MySQL Shell,它是 MySQL 的高级客户端和代码编辑器。

  • MySQL Server 和 Group Replication,它使一组 MySQL 实例能够提供高可用性。 InnoDB Cluster 提供了一种替代的、易于使用的编程方式来使用组复制。

  • MySQL Router,一种轻量级中间件,可在您的应用程序和 InnoDB Cluster 之间提供透明路由。

下图概述了这些技术如何协同工作:

基于 MySQL Group Replication 构建,提供自动成员管理、容错、自动故障转移等功能。 InnoDB Cluster 通常以单主模式运行,有一个主实例(读写)和多个从实例(只读)。高级用户还可以利用多主模式,其中所有实例都是主实例。

您使用作为 MySQL Shell 的一部分提供的 AdminAPI 来处理 InnoDB Cluster。 AdminAPI 在 JavaScript 和 Python 中可用,非常适合 MySQL 部署的脚本和自动化。通过使用 MySQL Shell 的 AdminAPI,您可以避免手动配置许多实例。相反,AdminAPI 为一组 MySQL 实例提供了一个有效的现代接口,使您能够从一个中央工具配置、管理和监控您的部署。

InnoDB Cluster 支持 MySQL Clone,这使您能够简单地配置实例。过去,要在加入一组 MySQL 实例之前配置一个新实例,您需要以某种方式手动将事务传输到加入实例。这可能涉及制作文件副本、手动复制文件等。使用 InnoDB Cluster,您只需将一个实例添加到集群,它就会自动配置。

2 Mysql Shell

2.1Linux上安装mysql shell

# yum install mysql-shell

2.2mysql shell的使用

2.2.1 启动shell

# mysqlsh

2.2.2 会话

会话使用X 协议与MySQL 服务器实例进行通信。要使 X 协议可用,必须在 MySQL 服务器实例上安装并启用 X 插件, MySQL 8.0 默认已安装X插件。在 MySQL 5.7 中,必须手动安装 X Plugin。X协议监听端口为33060

2.2.2.1 启动 MySQL Shell 时创建会话全局对象

# mysqlsh --mysqlx -u user -h localhost -P 33060

2.2.2.2 启动MySQL Shell后创建会话全局对象

# mysqlsh

mysql-js> \connect mysqlx://user@localhost:33060

2.2.2.3 JavaScript 和 Python 模式下的脚本会话

mysql-js> var s3 = mysqlx.getSession('user@localhost:33060', 'password');

mysql-js> s3

Session:user@localhost:33060

3 InnoDB集群环境准备

3.1.1 安装mysql shell

yum install mysql-shell

3.1.2 检查python环境

python -V

linux一般默认安装了python。在 Windows 上,MySQL Shell 包括 Python,不需要用户配置

3.1.3 所有数据库实例允许外部访问

每个数据库实例依次执行

mysql>create user 'root'@'%' identified by '密码';

mysql>grant all on . to 'root'@'%' with grant option;

mysql>flush privileges;

3.1.4 设置所有数据库实例唯一server_id

vim /etc/my.cnf

在[mysqld]下增加server-id=数字。每个数据库实例都要不一样。

server-id=4

3.1.5 设置所有数据库实例唯一uuid

mysql>select uuid();

输出一个uuid,或者你也可以使用其他方法生成一个uuid

vim /var/lib/mysql/auto.cnf

修改auto.cnf中的server-uuid

4 部署生产 InnoDB 集群

4.1创建一个 InnoDB 集群

4.1.1 检查所有mysql server实例的集群配置

# mysqlsh --mysqlx -u user -h localhost -P 33060

MySQL localhost:33060+ ssl JS > dba.checkInstanceConfiguration("root@mysql3:3306")

MySQL localhost:33060+ ssl JS > dba.configureInstance("root@mysql3:3306")

MySQL localhost:33060+ ssl JS > dba.checkInstanceConfiguration("root@mysql3:3306")

mysql3更换为其他数据库实例的主机名,依次执行一遍

4.1.2 给所有mysql server服务器配置帐户授予权限[可选]

若dba.checkInstanceConfiguration('root@mysql4:3306')出现下面的错误,需要给mysql server服务器配置帐户授予权限

MySQL localhost:33060+ ssl JS > dba.checkInstanceConfiguration('root@mysql4:3306')

mysql> grant all on . to 'root'@'%' with grant option;

mysql> flush privileges;

4.1.3 创建集群

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

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

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

This instance reports its own address as 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 needed for the cluster to be able to withstand up to

one server failure.

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

4.1.4 创建InnoDB Cluster 管理员帐户

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

mysql-js> cluster.setupAdminAccount("icadmin")

4.1.5 注意事项

当您运行 dba.createCluster() 时,以及当您通过运行 Cluster.addInstance() 将另一个服务器实例添加到 InnoDB 集群时,以下错误将记录到 MySQL 服务器实例的错误日志中。这些消息是无害的,并且与 AdminAPI 启动组复制的方式有关:

2020-02-10T10:53:43.727246Z 12 [ERROR] [MY-011685] [Repl] Plugin

group_replication reported: 'The group name option is mandatory'

2020-02-10T10:53:43.727292Z 12 [ERROR] [MY-011660] [Repl] Plugin

group_replication reported: 'Unable to start Group Replication on boot'

如果您遇到与元数据不可访问相关的错误,您可能配置了环回网络接口。为了正确使用 InnoDB Cluster,请禁用环回接口。

一旦服务器实例属于一个集群,重要的是只使用 MySQL Shell 和 AdminAPI 来管理它们。不支持在将实例添加到集群后尝试手动更改实例上的组复制配置。同样,不支持在使用 AdminAPI 配置实例后修改对 InnoDB Cluster 至关重要的服务器变量,例如 server_uuid。

当您使用 MySQL Shell 8.0.14 及更高版本创建集群时,您可以设置在实例从集群中驱逐之前等待的时间量,例如当它们变得无法访问时。将 expelTimeout 选项传递给 dba.createCluster() 操作,该操作在种子实例上配置 group_replication_member_expel_timeout 变量。 expelTimeout 选项可以采用 0 到 3600 范围内的整数值。所有运行 MySQL 服务器 8.0.13 及更高版本的实例被添加到配置了 expelTimeout 的集群时,将自动配置为具有与种子实例上配置的相同的 expelTimeout 值.

4.1.6 检查集群状态

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

4.2将实例添加到 InnoDB 集群

cluster.addInstance('root@mysql4:3306')

4.3查看效果

4.3.1 一主二从

图片 1mysql3

 图片 2mysql4

图片 3mysql5

4.3.2 主备切换

初始mysql3是主服务器,mysql4、mysql5是从服务器

模拟主服务器mysql3宕机

在mysql4上连上mysqlsh

var cluster = dba.getCluster("testCluster")

cluster.status()

Primary ,主服务器变为mysql5

重启mysql3

查看集群状态,mysql3恢复后是从服务器

5 核心api

dba.checkInstanceConfiguration()检查数据库实例的配置是否适合集群
dba.configureInstance()自动配置数据库实例适配集群
var cluster = dba.createCluster('testCluster')创建一个集群
cluster.status()获取集群状态
cluster.addInstance('root@mysql4:3306')添加实例到集群
var cluster = dba.getCluster(‘testCluster’)获取集群

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值