MySQL8.0.21 InnoDB Cluster 多主模式集群部署

InnoDB集群
 

MySQL InnoDB Cluster为MySQL提供了完整的高可用性解决方案。通过使用MySQL Shell附带的AdminAPI, 您可以轻松地配置和管理一组至少三个MySQL服务器实例,以充当InnoDB集群。

每个MySQL服务器实例都运行MySQL Group Replication,它提供了具有内置故障转移功能的InnoDB Clusters中复制数据的机制。AdminAPI消除了直接在InnoDB群集中使用组复制的需要。

MySQL路由器可以根据您部署的群集自动进行自我配置,从而将客户端应用程序透明地连接到服务器实例。如果服务器实例发生意外故障,群集将自动重新配置。

在默认的单主服务器模式下,InnoDB集群具有单个读写服务器实例-主服务器。多个辅助服务器实例是主服务器的副本。如果主服务器发生故障,则辅助服务器将自动升级为主服务器角色。MySQL Router会检测到此情况并将客户端应用程序转发到新的主服务器。高级用户还可以将集群配置为具有多个主数据库。

环境信息

这里准备三台虚拟机就可以了, MySQL Router 和 MySQL Shell 可以和 MySQL Server 部署在同一台服务器上,生产环境,可以根据具体场景对标安装,实验环境参考如下:

主机名ip运行的服务
tcs-10-0-129-1410.0.129.14MySQL Shell  MySQL Router  MGR
tcs-10-0-129-1510.0.129.15MySQL Shell  MySQL Router  MGR
HikvisionOS10.0.129.10MySQL Shell  MySQL Router  MGR

安装说明

这里我们先安装 MGR 组复制成功之后, 再安装 MySQL Shell 8.0.21 组件和部署 MySQL Router 8.0.21,即“采用组复制的方式”部署 MySQL InnoDB Cluter 集群

安装顺序: (1)MySQL Server 8.0.21 -> (2)启动MGR组复制 -> (3)MySQL Shell 8.0.21 -> (4)创建 Innodb Cluster 集群 -> (5)MySQL Router 8.0.21

安装MySQL Server 8.0.21

安装之前,请提前下载好的以上三个软件的二进制安装包,所有安装都采用二进制解压安装即可,如下:

1.1.下载安装包

##该命令在三个节点下都执行

wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz


wget https://downloads.mysql.com/archives/get/p/43/file/mysql-shell-8.0.21-linux-glibc2.12-x86-64bit.tar.gz

wget https://downloads.mysql.com/archives/get/p/41/file/mysql-router-8.0.21-linux-glibc2.12-x86_64.tar.xz

1.2. 添加配置文件

安装MySQL Server用二进制安装即可,这里安装一台,剩下两个节点的安装相同,配置文件要稍加注意一下,比如server id不要重复!部分IP改为节点的IP地址,比如 report_host。

三台机器my.cnf的区别

#server-id必须是唯一的
server-id = 201
loose-group_replication_local_address = '{IP}:33081'

第一台节点  10.0.129.10 的my.cnf配置

[root@HikvisionOS log]# cat /etc/my.cnf
[mysql]
default-character-set=utf8

[mysqld]
datadir=/data/mysql/data
socket=/data/mysql/mysql.sock
pid-file=/data/mysql/mysql.pid
log-error=/data/mysql/log/mysql-err.log

default_authentication_plugin=mysql_native_password
max_connections=200
character-set-server=utf8
default-storage-engine=INNODB
lower_case_table_names=1
max_allowed_packet=16M


#开启GTID,必须开启
gtid_mode=on
#强制GTID的一致性
enforce-gtid-consistency=on
#binlog格式,MGR要求必须是ROW,不过就算不是MGR,也最好用row
binlog_format=row
#server-id必须是唯一的
server-id = 201
#MGR使用乐观锁,所以官网建议隔离级别是RC,减少锁粒度
transaction_isolation = READ-COMMITTED
#因为集群会在故障恢复时互相检查binlog的数据,
#所以需要记录下集群内其他服务器发过来已经执行过的binlog,按GTID来区分是否执行过.
log-slave-updates=on
#binlog校验规则,5.6之后的高版本是CRC32,低版本都是NONE,但是MGR要求使用NONE
binlog_checksum=NONE
#基于安全的考虑,MGR集群要求复制模式要改成slave记录记录到表中,不然就报错
master_info_repository=TABLE
#同上配套
relay_log_info_repository=TABLE
#记录事务的算法,官网建议设置该参数使用 XXHASH64 算法
transaction_write_set_extraction = XXHASH64
#相当于此GROUP的名字,是UUID值,不能和集群内其他GTID值的UUID混用,可用uuidgen来生成一个新的,
#主要是用来区分整个内网里边的各个不同的GROUP,而且也是这个group内的GTID值的UUID
loose-group_replication_group_name = 'b5a9bdff-3c79-4cb4-97a1-e38c45fad878'
#是否随服务器启动而自动启动组复制,不建议直接启动,怕故障恢复时有扰乱数据准确性的特殊情况
loose-group_replication_start_on_boot = OFF
#本地MGR的IP地址和端口,host:port,是MGR的端口,不是数据库的端口
loose-group_replication_local_address = '10.0.129.10:33081'
#需要接受本MGR实例控制的服务器IP地址和端口,是MGR的端口,不是数据库的端口
loose-group_replication_group_seeds = '10.0.129.10:33081,10.0.129.14:33081,10.0.129.15:33081'
#开启引导模式,添加组成员,用于第一次搭建MGR或重建MGR的时候使用,只需要在集群内的其中一台开启,
loose-group_replication_bootstrap_group = OFF

第二台节点  10.0.129.14 的my.cnf配置

[mysql]
default-character-set=utf8

[mysqld]
datadir=/data/mysql/data
socket=/data/mysql/mysql.sock
pid-file=/data/mysql/mysql.pid
log-error=/data/mysql/log/mysql-err.log

default_authentication_plugin=mysql_native_password
max_connections=200
character-set-server=utf8
default-storage-engine=INNODB
lower_case_table_names=1
max_allowed_packet=16M


#开启GTID,必须开启
gtid_mode=on
#强制GTID的一致性
enforce-gtid-consistency=on
#binlog格式,MGR要求必须是ROW,不过就算不是MGR,也最好用row
binlog_format=row
#server-id必须是唯一的
server-id = 202
#MGR使用乐观锁,所以官网建议隔离级别是RC,减少锁粒度
transaction_isolation = READ-COMMITTED
#因为集群会在故障恢复时互相检查binlog的数据,
#所以需要记录下集群内其他服务器发过来已经执行过的binlog,按GTID来区分是否执行过.
log-slave-updates=on
#binlog校验规则,5.6之后的高版本是CRC32,低版本都是NONE,但是MGR要求使用NONE
binlog_checksum=NONE
#基于安全的考虑,MGR集群要求复制模式要改成slave记录记录到表中,不然就报错
master_info_repository=TABLE
#同上配套
relay_log_info_repository=TABLE
#记录事务的算法,官网建议设置该参数使用 XXHASH64 算法
transaction_write_set_extraction = XXHASH64
#相当于此GROUP的名字,是UUID值,不能和集群内其他GTID值的UUID混用,可用uuidgen来生成一个新的,
#主要是用来区分整个内网里边的各个不同的GROUP,而且也是这个group内的GTID值的UUID
loose-group_replication_group_name = 'b5a9bdff-3c79-4cb4-97a1-e38c45fad878'
#是否随服务器启动而自动启动组复制,不建议直接启动,怕故障恢复时有扰乱数据准确性的特殊情况
loose-group_replication_start_on_boot = OFF
#本地MGR的IP地址和端口,host:port,是MGR的端口,不是数据库的端口
loose-group_replication_local_address = '10.0.129.14:33081'
#需要接受本MGR实例控制的服务器IP地址和端口,是MGR的端口,不是数据库的端口
loose-group_replication_group_seeds = '10.0.129.10:33081,10.0.129.14:33081,10.0.129.15:33081'
#开启引导模式,添加组成员,用于第一次搭建MGR或重建MGR的时候使用,只需要在集群内的其中一台开启,
loose-group_replication_bootstrap_group = OFF

第三台节点  10.0.129.15 的my.cnf配置

[mysql]
default-character-set=utf8

[mysqld]
datadir=/data/mysql/data
socket=/data/mysql/mysql.sock
pid-file=/data/mysql/mysql.pid
log-error=/data/mysql/log/mysql-err.log

default_authentication_plugin=mysql_native_password
max_connections=200
character-set-server=utf8
default-storage-engine=INNODB
lower_case_table_names=1
max_allowed_packet=16M


#开启GTID,必须开启
gtid_mode=on
#强制GTID的一致性
enforce-gtid-consistency=on
#binlog格式,MGR要求必须是ROW,不过就算不是MGR,也最好用row
binlog_format=row
#server-id必须是唯一的
server-id = 203
#MGR使用乐观锁,所以官网建议隔离级别是RC,减少锁粒度
transaction_isolation = READ-COMMITTED
#因为集群会在故障恢复时互相检查binlog的数据,
#所以需要记录下集群内其他服务器发过来已经执行过的binlog,按GTID来区分是否执行过.
log-slave-updates=on
#binlog校验规则,5.6之后的高版本是CRC32,低版本都是NONE,但是MGR要求使用NONE
binlog_checksum=NONE
#基于安全的考虑,MGR集群要求复制模式要改成slave记录记录到表中,不然就报错
master_info_repository=TABLE
#同上配套
relay_log_info_repository=TABLE
#记录事务的算法,官网建议设置该参数使用 XXHASH64 算法
transaction_write_set_extraction = XXHASH64
#相当于此GROUP的名字,是UUID值,不能和集群内其他GTID值的UUID混用,可用uuidgen来生成一个新的,
#主要是用来区分整个内网里边的各个不同的GROUP,而且也是这个group内的GTID值的UUID
loose-group_replication_group_name = 'b5a9bdff-3c79-4cb4-97a1-e38c45fad878'
#是否随服务器启动而自动启动组复制,不建议直接启动,怕故障恢复时有扰乱数据准确性的特殊情况
loose-group_replication_start_on_boot = OFF
#本地MGR的IP地址和端口,host:port,是MGR的端口,不是数据库的端口
loose-group_replication_local_address = '10.0.129.15:33081'
#需要接受本MGR实例控制的服务器IP地址和端口,是MGR的端口,不是数据库的端口
loose-group_replication_group_seeds = '10.0.129.10:33081,10.0.129.14:33081,10.0.129.15:33081'
#开启引导模式,添加组成员,用于第一次搭建MGR或重建MGR的时候使用,只需要在集群内的其中一台开启,
loose-group_replication_bootstrap_group = OFF


1.3.创建mysql账号,用于启动mysql进程

注意:该操作三台节点都进行操作

【注意细节:需要创建mysql用户后, my.cnf 文件中的目录都必须设置文件都是必须mysql:mysql】

root@centos-01 ~# groupadd mysql && useradd -r -g mysql -s /bin/false mysql
root@centos-01 ~# cat /etc/passwd | grep -iw  "mysql"                  
mysql:x:999:30003::/home/mysql:/bin/false

1.4.解压软件包,

注意:该操作三台节点都进行操作

这里我把压缩包放在了/root/work目录下

##解压文件
[root@tcs-10-0-129-14 ~/work]# tar xf mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz
##创建存放目录
[root@tcs-10-0-129-14 ~/work]# mkdir /usr/local/mysql
##复制文件
[root@tcs-10-0-129-14 ~/work]# cp -Rf ./mysql-8.0.21-linux-glibc2.12-x86_64/* /usr/local/mysql/
##修改权限
[root@tcs-10-0-129-14 /usr/local/mysql]# chown -R mysql:mysql /usr/local/mysql/
[root@tcs-10-0-129-14 /usr/local/mysql]#  chmod -R 755 /usr/local/mysql/
##创建mysql需要的数据目录
[root@tcs-10-0-129-14 /usr/local/mysql]# mkdir -p /data/mysql/{data,binlog,relay,log}
[root@tcs-10-0-129-14 /usr/local/mysql]# chown -R mysql:mysql /data/mysql
[root@tcs-10-0-129-14 /usr/local/mysql]#  chmod -R 750 /data/mysql/

1.5.初始化数据库,注意在修改root密码的时候,加上 SET SQL_LOG_BIN=0; … SET SQL_LOG_BIN=1;本次该节点的操作不记录日志,密码填你实际的密码

注意:该操作三台节点都进行操作

# 初始化数据库
[root@HikvisionOS ~]# /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql/data --user=mysql --initialize-insecure
# 启动数据库
[root@HikvisionOS ~]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf  2>&1 > /dev/null &
# 修改root密码永不过期
[root@HikvisionOS ~]# /usr/local/mysql/bin/mysql -uroot -S /data/mysql/data/mysql.sock -e "SET SQL_LOG_BIN=0;SET global super_read_only=OFF; SET global read_only=OFF; alter user 'root'@'localhost' password expire never; set password for 'root'@'localhost'='123456';flush privileges; SET SQL_LOG_BIN=1;"

注意:如遇初始化报错问题!!!!

####如果初始化出现以下报错 
[root@tcs-10-0-129-14 /usr/local/mysql]# /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql/data --user=mysql --initialize-insecure
/usr/local/mysql/bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory


下载依赖包即可
[root@tcs-10-0-129-14 /data]# yum install -y libaio

1.6. 配置数据库组复制

[root@tcs-10-0-129-14 /data/mysql]# /usr/local/mysql/support-files/mysql.server start

[root@HikvisionOS ~]#  /usr/local/mysql/bin/mysql -uroot -p -S /data/mysql/mysql.sock
-- 组复制
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS  WHERE PLUGIN_NAME LIKE '%group_replication%';

# 10.0.129.10节点执行 
#启动引导,注意,只有这套开启引导,其他两台都请忽略这一步
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
#创建一个用户来做同步的用户,并授权,所有集群内的服务器都需要做
mysql> create user 'repl'@'%' identified by '123456';
mysql> grant REPLICATION SLAVE on *.* to 'repl'@'%' with grant option;
#清空所有旧的GTID信息,避免冲突
mysql> reset master;
#创建同步规则认证信息,就是刚才授权的那个用户,和一般的主从规则写法不太一样
mysql> CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';
#启动MGR
mysql> start group_replication;
#查看是否启动成功,看到online就是成功了
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-----------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST     | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+-------------+----------------+
| group_replication_applier | c4164a8c-2171-11ef-ac87-000af763c4eb | HikvisionOS     |        3306 | ONLINE       | PRIMARY     | 8.0.21         |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+-------------+----------------+
1 row in set (0.02 sec)
#这个时候,就可以先关闭引导了
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;



#其他机器
# 10.0.129.14/15 执行
#创建一个用户来做同步的用户,并授权,所有集群内的服务器都需要做
mysql> create user 'repl'@'%' identified by '123456';
mysql> grant REPLICATION SLAVE on *.* to 'repl'@'%' with grant option;
#清空所有旧的GTID信息,避免冲突
mysql> reset master;
#创建同步规则认证信息,就是刚才授权的那个用户,和一般的主从规则写法不太一样
mysql> CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';
#启动MGR
mysql> START GROUP_REPLICATION USER='repl', PASSWORD='123456';
#查看是否启动成功,看到online就是成功了
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-----------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST     | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+-------------+----------------+
| group_replication_applier | c4164a8c-2171-11ef-ac87-000af763c4eb | HikvisionOS     |        3306 | ONLINE       | PRIMARY     | 8.0.21         |
| group_replication_applier | ec239016-2173-11ef-a1c7-6c92bfbba335 | tcs-10-0-129-15 |        3306 | ONLINE       | SECONDARY   | 8.0.21         |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+-------------+----------------+
2 rows in set (0.00 sec)


#14节点执行后
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-----------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST     | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+-------------+----------------+
| group_replication_applier | ba4ab29e-2178-11ef-9b62-e04f43eb671e | tcs-10-0-129-14 |        3306 | ONLINE       | SECONDARY   | 8.0.21         |
| group_replication_applier | c4164a8c-2171-11ef-ac87-000af763c4eb | HikvisionOS     |        3306 | ONLINE       | PRIMARY     | 8.0.21         |
| group_replication_applier | ec239016-2173-11ef-a1c7-6c92bfbba335 | tcs-10-0-129-15 |        3306 | ONLINE       | SECONDARY   | 8.0.21         |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+-------------+----------------+

1.7. 切换单主/多主模式

在命令行模式下,可以调用 group_replication_switch_to_single_primary_mode() 和 group_replication_switch_to_multi_primary_mode() 来切换单主/多主模式。

##多主切换前
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-----------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST     | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+-------------+----------------+
| group_replication_applier | ba4ab29e-2178-11ef-9b62-e04f43eb671e | tcs-10-0-129-14 |        3306 | ONLINE       | SECONDARY   | 8.0.21         |
| group_replication_applier | c4164a8c-2171-11ef-ac87-000af763c4eb | HikvisionOS     |        3306 | ONLINE       | PRIMARY     | 8.0.21         |
| group_replication_applier | ec239016-2173-11ef-a1c7-6c92bfbba335 | tcs-10-0-129-15 |        3306 | ONLINE       | SECONDARY   | 8.0.21         |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+-------------+----------------+
3 rows in set (0.01 sec)

mysql>  select group_replication_switch_to_multi_primary_mode();
+--------------------------------------------------+
| group_replication_switch_to_multi_primary_mode() |
+--------------------------------------------------+
| Mode switched to multi-primary successfully.     |
+--------------------------------------------------+
1 row in set (1.00 sec)


##切换后
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-----------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST     | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+-------------+----------------+
| group_replication_applier | ba4ab29e-2178-11ef-9b62-e04f43eb671e | tcs-10-0-129-14 |        3306 | ONLINE       | PRIMARY     | 8.0.21         |
| group_replication_applier | c4164a8c-2171-11ef-ac87-000af763c4eb | HikvisionOS     |        3306 | ONLINE       | PRIMARY     | 8.0.21         |
| group_replication_applier | ec239016-2173-11ef-a1c7-6c92bfbba335 | tcs-10-0-129-15 |        3306 | ONLINE       | PRIMARY     | 8.0.21         |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+-------------+----------------+







####注意我们这里部署的多主模式所以不修改单主模式

###切换单主
#切换成单主模式时可以指定某个节点的 server_uuid,如果不指定则会根据规则自动选择一个新的主节点
#在这里,我选择了指定tcs-10-0-129-15节点作为新主
mysql> select group_replication_switch_to_single_primary_mode('ec239016-2173-11ef-a1c7-6c92bfbba335');
+-----------------------------------------------------------------------------------------+
| group_replication_switch_to_single_primary_mode('ec239016-2173-11ef-a1c7-6c92bfbba335') |
+-----------------------------------------------------------------------------------------+
| Mode switched to single-primary successfully.                                           |
+-----------------------------------------------------------------------------------------+

在MySQL Shell中,可以调用 switchToSinglePrimaryMode() 以及 switchToMultiPrimaryMode() 函数进行切换。同样地,函数 switchToSinglePrimaryMode() 里也可以指定某个节点作为新的主节点。

MySQL  10.0.129.10:3306 ssl  JS > var c=dba.getCluster()

#切换到多主模式 
 MySQL  10.0.129.10:3306 ssl  JS > c.switchToMultiPrimaryMode()
 
#切换到单主模式,这里我指定2节点作为新主
 MySQL  10.0.129.10:3306 ssl  JS > c.switchToSinglePrimaryMode("10.0.129.14:3306")

注意,在已经是单主模式时,无论是 group_replication_switch_to_single_primary_mode() 还是 switchToSinglePrimaryMode() 函数中指定另一个节点时是不会发生切换的,但也不会报错,只有提示

至些,MGR三节点组复制安装完毕!

安装MySQL Shell 8.0.21

MySQL Shell是MySQL Server的高级客户端和代码编辑器。除了提供的类似于MySQL的SQL功能外,MySQL Shell还提供JavaScript和Python脚本功能,并包括与MySQL配合使用的API。X DevAPI使您能够使用关系数据和文档数据,AdminAPI使您可以使用InnoDB Cluster。

MySQL Shell提供以下功能。

支持的语言
MySQL Shell处理以JavaScript,Python和SQL编写的代码。根据当前处于活动状态的语言,将任何执行的代码作为这些语言之一进行处理。还有一些特定的MySQL Shell命令(带有前缀)\,使您可以配置MySQL Shell,而与当前选择的语言无关。

交互式代码执行
MySQL Shell提供了一种交互式代码执行模式,您可以在MySQL Shell提示符下键入代码并处理每个输入的语句,并将处理结果打印在屏幕上。如果使用中的终端支持Unicode文本输入。支持彩色端子。

批处理代码执行
除了交互执行代码外,MySQL Shell还可以从不同来源获取代码并进行处理。这种以非交互方式处理代码的方法称为 批处理执行。

支持的API
AdminAPI使您可以管理MySQL实例,使用它们创建InnoDB集群,InnoDB ReplicaSet以及集成MySQL路由器。
当MySQL Shell使用X协议连接到MySQL服务器时,X DevAPI使开发人员可以使用关系数据和文档数据。

X协议支持
MySQL Shell旨在为所有支持X协议的MySQL产品提供集成的命令行客户端。MySQL Shell的开发功能专为使用X协议的会话而设计。MySQL Shell还可以使用经典MySQL协议连接到不支持X协议的MySQL服务器。

2.1.安装配置MySQL Shell

三个节点都配置

#解压
[root@tcs-10-0-129-14 ~/work]# tar xf mysql-shell-8.0.21-linux-glibc2.12-x86-64bit.tar.gz 
[root@tcs-10-0-129-14 ~/work]# mkdir /usr/local/mysqlshell
[root@tcs-10-0-129-14 ~/work]# cp -Rf ./mysql-shell-8.0.21-linux-glibc2.12-x86-64bit/* /usr/local/mysqlshell/
[root@tcs-10-0-129-14 ~/work]# chown -R mysql:mysql /usr/local/mysqlshell
[root@tcs-10-0-129-14 ~/work]# chmod -R 755 /usr/local/mysqlshell
[root@tcs-10-0-129-14 ~/work]# echo "export PATH=\$PATH:/usr/local/mysqlshell/bin" >> /etc/profile
[root@tcs-10-0-129-14 ~/work]# source /etc/profile

2.2.创建 Innodb Cluster 集群

此操作在10.0.129.10配置

[root@HikvisionOS work]# /usr/local/mysqlshell/bin/mysqlsh -h 10.0.129.10 -P 3306 -uroot -p
Please provide the password for 'root@10.0.129.10:3306': ******
MySQL Shell 8.0.21

Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.

Type '\help' or '\?' for help; '\quit' to exit.
Creating a session to 'root@10.0.129.10:3306'
Fetching schema names for autocompletion... Press ^C to stop.
Your MySQL connection id is 82
Server version: 8.0.21 MySQL Community Server - GPL
No default schema selected; type \use <schema> to set one.


####创建集群
MySQL  10.0.129.10:3306 ssl  JS > var cluster = dba.createCluster('testCluster', {adoptFromGR: true});
A new InnoDB cluster will be created based on the existing replication group on instance '10.0.129.10:3306'.

Creating InnoDB cluster 'testCluster' on 'tcs-10-0-129-14:3306'...

Adding Seed Instance...
Adding Instance 'tcs-10-0-129-14:3306'...
Adding Instance 'HikvisionOS:3306'...
Adding Instance 'tcs-10-0-129-15:3306'...
Resetting distributed recovery credentials across the cluster...

###查看集群状态
MySQL  10.0.129.10:3306 ssl  JS > cluster.status()
{
    "clusterName": "testCluster", 
    "defaultReplicaSet": {
        "name": "default", 
        "ssl": "DISABLED", 
        "status": "OK", 
        "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.", 
        "topology": {
            "HikvisionOS:3306": {
                "address": "HikvisionOS:3306", 
                "mode": "R/W", 
                "readReplicas": {}, 
                "replicationLag": null, 
                "role": "HA", 
                "status": "ONLINE", 
                "version": "8.0.21"
            }, 
            "tcs-10-0-129-14:3306": {
                "address": "tcs-10-0-129-14:3306", 
                "mode": "R/W", 
                "readReplicas": {}, 
                "replicationLag": null, 
                "role": "HA", 
                "status": "ONLINE", 
                "version": "8.0.21"
            }, 
            "tcs-10-0-129-15:3306": {
                "address": "tcs-10-0-129-15:3306", 
                "mode": "R/W", 
                "readReplicas": {}, 
                "replicationLag": null, 
                "role": "HA", 
                "status": "ONLINE", 
                "version": "8.0.21"
            }
        }, 
        "topologyMode": "Multi-Primary"
    }, 
    "groupInformationSourceMember": "tcs-10-0-129-14:3306"
}

“status”: “OK” 表示集群状态是正常的
“topologyMode”: “Single-Primary” 表示是单主模式
“mode”: “R/W” 表示可读可写
“mode”: “R/O” 表示只读

这里我们三主模式所以每个节点都是可读可写的

MySQL Router 8.0.21

MySQL Router是InnoDB Cluster的一部分,是轻量级的中间件,可在应用程序与后端MySQL服务器之间提供透明的路由。它可以用于各种用例,例如通过有效地将数据库流量路由到适当的后端MySQL服务器来提供高可用性和可伸缩性。可插拔架构还使开发人员能够针对自定义用例扩展MySQL Router。

强烈建议将MySQL Router 8.0与MySQL Server 8.0和5.7一起使用。

为了获得最佳性能,MySQL路由器通常与使用它的应用程序安装在同一主机上。可能的原因包括:

允许本地UNIX域套接字连接到应用程序,而不是TCP / IP。
减少网络延迟。
为了允许MySQL路由器连接到MySQL而不需要路由器主机的额外帐户,对于专门为应用程序主机创建的MySQL帐户(例如 myapp@198.51.100.45),而不是像myapp @%这样的值 。
通常,应用程序服务器最容易扩展。
您可以在网络上运行多个MySQL Router实例,而无需将MySQL Router隔离到单个计算机上。这是因为MySQL路由器对任何特定的服务器或主机都没有亲和力。

MySQL Router可以使用一个或者多个来做到负载这里就显示创建一个MySQL Router

3.1.解压文件

[root@tcs-10-0-129-14 ~/work]# tar xf mysql-router-8.0.21-linux-glibc2.12-x86_64.tar.xz 
[root@tcs-10-0-129-14 ~/work]# mkdir /usr/local/mysqlrouter
[root@tcs-10-0-129-14 ~/work]# cp -Rf ./mysql-router-8.0.21-linux-glibc2.12-x86_64/* /usr/local/mysqlrouter/
[root@tcs-10-0-129-14 ~/work]# chown -R mysql:mysql /usr/local/mysqlrouter
[root@tcs-10-0-129-14 ~/work]# chmod -R 755 /usr/local/mysqlrouter

3.2.创建MySQL Router 目录

[root@tcs-10-0-129-14 ~/work]# mkdir -p /data/mysqlrouter
[root@tcs-10-0-129-14 ~/work]# chown -R mysql:mysql /data/mysqlrouter
[root@tcs-10-0-129-14 ~/work]# chmod -R 755 /data/mysqlrouter
[root@tcs-10-0-129-14 ~/work]#  echo "export PATH=\$PATH:/usr/local/mysqlrouter/bin" >> /etc/profile
[root@tcs-10-0-129-14 ~/work]# source /etc/profile

3.3.bootstrap引导,创建一个独立的MySQL Router实例 --directory选项指定路由目录,–name指定路由器名称,以下例子是一个名为InnoDB的集群 “testCluster” 已经存在。

[root@tcs-10-0-129-14 ~/work]# /usr/local/mysqlrouter/bin/mysqlrouter --bootstrap root:123456@10.0.129.14 --directory /data/mysqlrouter --conf-use-sockets --user=mysql --name=mysql_router_13306 --conf-bind-address=10.0.129.14 --account-host="10.0.129.%" 
# Bootstrapping MySQL Router instance at '/data/mysqlrouter'...

- Creating account(s) (only those that are needed, if any)
- Verifying account (using it to run SQL queries that would be run by Router)
- Storing account in keyring
- Adjusting permissions of generated files
- Creating configuration /data/mysqlrouter/mysqlrouter.conf

# MySQL Router 'mysql_router_13306' configured for the InnoDB Cluster 'testCluster'

After this MySQL Router has been started with the generated configuration

    $ /usr/local/mysqlrouter/bin/mysqlrouter -c /data/mysqlrouter/mysqlrouter.conf

the cluster 'testCluster' can be reached by connecting to:

## MySQL Classic protocol

- Read/Write Connections: localhost:6446, /data/mysqlrouter/mysql.sock
- Read/Only Connections:  localhost:6447, /data/mysqlrouter/mysqlro.sock

## MySQL X protocol

- Read/Write Connections: localhost:64460, /data/mysqlrouter/mysqlx.sock
- Read/Only Connections:  localhost:64470, /data/mysqlrouter/mysqlxro.sock

引导过程已在mysqlrouter.conf指定的目录中创建了 具有所需文件的文件,结果将向您展示如何启动此MySQL Router实例。生成的MySQL路由器目录类似于:

[root@tcs-10-0-129-14 ~/work]# tree /data/mysqlrouter/
/data/mysqlrouter/
|-- data
|   |-- keyring
|   `-- state.json
|-- log
|   `-- mysqlrouter.log
|-- mysqlro.sock
|-- mysqlrouter.conf
|-- mysqlrouter.key
|-- mysqlrouter.pid
|-- mysql.sock
|-- mysqlxro.sock
|-- mysqlx.sock
|-- run
|-- start.sh
`-- stop.sh

3 directories, 12 files

3.4.生成的MySQL路由器配置文件(mysqlrouter.conf)

[root@tcs-10-0-129-14 /data/mysqlrouter]# cat mysqlrouter.conf 
# File automatically generated during MySQL Router bootstrap
[DEFAULT]
name=mysql_router_13306
user=mysql
logging_folder=/data/mysqlrouter/log
runtime_folder=/data/mysqlrouter/run
data_folder=/data/mysqlrouter/data
keyring_path=/data/mysqlrouter/data/keyring
master_key_path=/data/mysqlrouter/mysqlrouter.key
connect_timeout=15
read_timeout=30
dynamic_state=/data/mysqlrouter/data/state.json

[logger]
level = INFO

[metadata_cache:testCluster]
cluster_type=gr
router_id=4
user=mysql_router4_6o4fk3unqy30
metadata_cluster=testCluster
ttl=0.5
auth_cache_ttl=-1
auth_cache_refresh_interval=2
use_gr_notifications=0

[routing:testCluster_rw]
bind_address=10.0.129.14
bind_port=6446
socket=/data/mysqlrouter/mysql.sock
destinations=metadata-cache://testCluster/?role=PRIMARY
routing_strategy=first-available
protocol=classic

[routing:testCluster_ro]
bind_address=10.0.129.14
bind_port=6447
socket=/data/mysqlrouter/mysqlro.sock
destinations=metadata-cache://testCluster/?role=SECONDARY
routing_strategy=round-robin-with-fallback
protocol=classic

[routing:testCluster_x_rw]
bind_address=10.0.129.14
bind_port=64460
socket=/data/mysqlrouter/mysqlx.sock
destinations=metadata-cache://testCluster/?role=PRIMARY
routing_strategy=first-available
protocol=x

[routing:testCluster_x_ro]
bind_address=10.0.129.14
bind_port=64470
socket=/data/mysqlrouter/mysqlxro.sock
destinations=metadata-cache://testCluster/?role=SECONDARY
routing_strategy=round-robin-with-fallback
protocol=x

3.5.启动MySQL Router 路由器


[root@tcs-10-0-129-14 ~/work]# bash /data/mysqlrouter/start.sh  2>&1 > /dev/null &
[root@tcs-10-0-129-14 ~/work]# ps -ef | grep mysqlrouter
root     24040     1  0 14:59 pts/3    00:00:00 sudo ROUTER_PID=/data/mysqlrouter/mysqlrouter.pid /usr/local/mysqlrouter/bin/mysqlrouter -c /data/mysqlrouter/mysqlrouter.conf --user=mysql
mysql    24074 24040  0 14:59 pts/3    00:00:00 /usr/local/mysqlrouter/bin/mysqlrouter -c /data/mysqlrouter/mysqlrouter.conf --user=mysql
root     29578 24168  0 15:00 pts/3    00:00:00 grep --color=auto mysqlrouter

3.6. 验证

###因为配置了三主模式所以这边也没什么读写区分

[root@tcs-10-0-129-14 ~/work]  /usr/local/mysql/bin/mysql -uroot -p -h 10.0.129.14 -P 6446

mysql> show databases;
+-------------------------------+
| Database                      |
+-------------------------------+
| information_schema            |
| mysql                         |
| mysql_innodb_cluster_metadata |
| performance_schema            |
| sys                           |
| tong                          |
+-------------------------------+
6 rows in set (0.00 sec)

#创建一个测试库查看其他两个节点是否有
mysql> create database test;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+-------------------------------+
| Database                      |
+-------------------------------+
| information_schema            |
| mysql                         |
| mysql_innodb_cluster_metadata |
| performance_schema            |
| sys                           |
| test                          |
| tong                          |
+-------------------------------+
7 rows in set (0.00 sec)



##10节点
[root@HikvisionOS ~]# /data/mysqlrouter]# /usr/local/mysql/bin/mysql -uroot -p -h 10.0.129.10 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 27474
Server version: 8.0.21 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+-------------------------------+
| Database                      |
+-------------------------------+
| information_schema            |
| mysql                         |
| mysql_innodb_cluster_metadata |
| performance_schema            |
| sys                           |
| test                          |
| tong                          |
+-------------------------------+
7 rows in set (0.00 sec)

### 15节点
[root@tcs-10-0-129-15 ~/work]#  /usr/local/mysql/bin/mysql -uroot -p -h 10.0.129.15 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 47
Server version: 8.0.21 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+-------------------------------+
| Database                      |
+-------------------------------+
| information_schema            |
| mysql                         |
| mysql_innodb_cluster_metadata |
| performance_schema            |
| sys                           |
| test                          |
| tong                          |
+-------------------------------+
7 rows in set (0.00 sec)

到此部署完成

小结

数据库的使用命令

## 启动命令:
/usr/local/mysql/support-files/mysql.server start
## 停止命令:
/usr/local/mysql/support-files/mysql.server stop
## 连接客户端命令
/usr/local/mysql/bin/mysql -uroot -p123456 -S /data/mysql/mysql.sock
#201 启动引导
#启动引导,注意,只有这套开启引导,其他两台都请忽略这一步
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
#启动MGR
mysql> start group_replication;
#查看是否启动成功,看到online就是成功了
mysql> SELECT * FROM performance_schema.replication_group_members;
#这个时候,就可以先关闭引导了
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
#14/15机器
#启动MGR
mysql> start group_replication;
#查看是否启动成功,看到online就是成功了
mysql> SELECT * FROM performance_schema.replication_group_members;

## 启动路由命令
/data/mysqlrouter/start.sh  2>&1 > /dev/null &

mysql shell 使用命令

dba.checkInstanceConfiguration("root@tcs-10-0-129-14:3306")     #检查节点配置实例,用于加入cluster之前
dba.rebootClusterFromCompleteOutage('testCluster');        #重启
dba.dropMetadataSchema();                                #删除schema
var cluster = dba.getCluster('myCluster')                #获取当前集群
cluster.checkInstanceState("root@tcs-10-0-129-14:3306")         #检查cluster里节点状态
cluster.rejoinInstance("root@tcs-10-0-129-14:3306")             #重新加入节点,我本地测试的时候发现rejoin一直无效,每次是delete后
addcluster.dissolve({force:true})                       #删除集群
cluster.addInstance("root@tcs-10-0-129-14:3306")                #增加节点
cluster.removeInstance("root@tcs-10-0-129-14:3306")             #删除节点
cluster.removeInstance('root@tcs-10-0-129-14:3306',{force:true})    #强制删除节点
cluster.dissolve({force:true})                           #解散集群
cluster.describe();                                      #集群描述

参考文献:

MySQL8 搭建集群方案文档_mysql8 集群方案-优快云博客

MySQL8.0.21 InnoDB Cluster 从零搭建集群方案详细文档_mysql 8.0.21安装教程 群集安装-优快云博客

要在CentOS 7上部署支持InnoDB clusterMySQL 5.7集群,需要遵循一系列详细的步骤,以确保集群的高可用性和数据一致性。首先,确保系统已安装了必要的依赖和网络配置,以便服务器节点之间可以相互通信。接下来,按照以下步骤进行操作: 参考资源链接:[CentOS 7 安装并配置MySQL 5.7集群教程](https://wenku.csdn.net/doc/504zisuzbt?spm=1055.2569.3001.10343) 1. **初始化集群节点**:在所有预定的服务器上安装MySQL 5.7,并进行基本配置。使用官方提供的MySQL Shell工具来初始化集群数据目录和配置文件。 2. **配置集群参数**:在每个集群节点上,通过修改***f配置文件来设置必要的参数,如server_id、autocrement_increment、group_replication_group_seeds等,为组复制做好准备。 3. **安装并配置InnoDB cluster套件**:使用MySQL Shell安装InnoDB cluster组件,并使用它来添加节点到集群中。这包括选择一个节点作为种子节点(Seed Node),然后通过shell命令将其他节点加入集群。 4. **管理集群权限**:为集群节点设置合适的权限,确保数据同步和故障转移过程中权限能够正确管理。可能需要创建具有特殊权限的用户或角色,以便集群服务可以执行必要的操作。 5. **测试集群部署**:在正式投入使用之前,通过各种故障模拟测试来验证集群的高可用性。测试应包括节点的动故障转移、网络分区以及其他可能的异常情况。 6. **监控和日志管理**:部署集群后,建立有效的监控机制以跟踪集群的健康状况和性能指标。同时,设置日志收集和分析系统,以便在出现问题时能够快速定位和响应。 7. **安全和备份策略**:实施安全措施,包括为集群设置强密码策略、定期更新安全补丁等。同时,定期备份集群数据,以防止数据丢失。 在整个部署过程中,应严格遵守官方文档的指导,并结合实际环境调整配置。如果遇到问题,可以参考《CentOS 7 安装并配置MySQL 5.7集群教程》来获得更具体的帮助。该教程详细描述了安装MySQL、设置远程连接、服务管理以及权限配置等个方面的内容,直接关联到你的当前问题,并提供实用的指导和示例。 部署完成后,为了进一步提升集群的稳定性和性能,建议继续深入学习MySQL集群模式、故障诊断和性能优化等高级话题。 参考资源链接:[CentOS 7 安装并配置MySQL 5.7集群教程](https://wenku.csdn.net/doc/504zisuzbt?spm=1055.2569.3001.10343)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值