MySQL8 搭建集群方案文档

news2024/11/29 3:01:15

MySQL8.0.21 InnoDB Cluster 从零搭建集群方案详细文档

InnoDB集群
本文档分享新版本MySQL 8.0.21 Innodb Cluster集群搭建过程 ~

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

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

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

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

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

图21.1 InnoDB Cluster概述

在这里插入图片描述

环境信息

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

栏目服务器一服务器二服务器三端口
操作系统CentOS Linux release 7.9.2009CentOS Linux release 7.9.2009CentOS Linux release 7.9.2009/
IP地址192.168.1.201192.168.1.202192.168.1.203/
主机名centos-01centos-01centos-01/
MySQL Server 8.0.21MGR节点一MGR 节点二MGR 节点三3306
MySQL Shell 8.0.21MySQL Shell 节点一MySQL Shell 节点二MySQL Shell 节点三/
MySQL Router 8.0.21MySQL Router 节点一MySQL Router 节点二MySQL Router 节点三6446(写)6447(读)
安装说明

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

即先有组复制的存在,然后使用它来创建集群。 后续我们在创建集群的时候,需要将 {adoptFromGR: true} 选项传递 给该 dba.createCluster()功能。创建的InnoDB群集匹配复制组是以单主数据库还是多主数据库运行。

安装顺序: (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

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

软件包名MD5值下载链接
mysql-8.0.21-linux-glibc2.12-x86_64.tar.xzd39efe001766edfa956e673c1a60a26ahttps://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz
mysql-shell-8.0.21-linux-glibc2.12-x86-64bit.tar.gzaee9bbef97f3fc545f1239203c878100https://downloads.mysql.com/archives/get/p/43/file/mysql-shell-8.0.21-linux-glibc2.12-x86-64bit.tar.gz
mysql-router-8.0.21-linux-glibc2.12-x86_64.tar.xz92015c580ad7abec125522b164203a85https://downloads.mysql.com/archives/get/p/41/file/mysql-router-8.0.21-linux-glibc2.12-x86_64.tar.xz

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

三台机器my.cnf 区别:

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

centos-01 机器 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 = '192.168.1.201:33081'
#需要接受本MGR实例控制的服务器IP地址和端口,是MGR的端口,不是数据库的端口
loose-group_replication_group_seeds = '192.168.1.201:33081,192.168.1.202:33081,192.168.1.203:33081'
#开启引导模式,添加组成员,用于第一次搭建MGR或重建MGR的时候使用,只需要在集群内的其中一台开启,
loose-group_replication_bootstrap_group = OFF

centos-02 机器 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 = '192.168.1.202:33081'
#需要接受本MGR实例控制的服务器IP地址和端口,是MGR的端口,不是数据库的端口
loose-group_replication_group_seeds = '192.168.1.201:33081,192.168.1.202:33081,192.168.1.203:33081'
#开启引导模式,添加组成员,用于第一次搭建MGR或重建MGR的时候使用,只需要在集群内的其中一台开启,
loose-group_replication_bootstrap_group = OFF

centos-03 机器 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 = '192.168.1.203:33081'
#需要接受本MGR实例控制的服务器IP地址和端口,是MGR的端口,不是数据库的端口
loose-group_replication_group_seeds = '192.168.1.201:33081,192.168.1.202:33081,192.168.1.203:33081'
#开启引导模式,添加组成员,用于第一次搭建MGR或重建MGR的时候使用,只需要在集群内的其中一台开启,
loose-group_replication_bootstrap_group = OFF

【注意细节:需要创建mysql用户后, my.cnf 文件中的目录都必须设置文件都是必须mysql:mysql】
创建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

解压软件包,先把软件包上传到 /opt 目录

root@centos-01 ~# cd /opt
root@centos-01 /opt# tar -xvf mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz
root@centos-01 /opt# cp -Rf ./mysql-8.0.21-linux-glibc2.12-x86_64/* /usr/local/mysql/
root@centos-01 /opt# chown -R mysql:mysql /usr/local/mysql/
root@centos-01 /opt# chmod -R 755 /usr/local/mysql/

创建mysql需要的数据目录

root@centos-01 ~# mkdir -p /data/mysql/{data,binlog,relay}
root@centos-01 ~# chown -R mysql:mysql /data/mysql/{data,binlog,relay}
root@centos-01 ~# chmod -R 750 /data/mysql/

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

root@centos-01 ~# /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql/data --user=mysql --initialize-insecure
root@centos-01 ~# /usr/local/mysql/support-files/mysql.server start
root@centos-01 ~# /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@centos-01 ~# /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%';

# 192.168.1.201/centos-01 
#启动引导,注意,只有这套开启引导,其他两台都请忽略这一步
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 | 0f661cfd-76a7-11ec-b9b4-000c2915d830 | 0f661cfd-76a7-11ec-b9b4-000c2915d830      |        3306 | ONLINE       | PRIMARY     | 8.0.21         |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
1 row in set (0.02 sec)
#这个时候,就可以先关闭引导了
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;

#其他机器
# 192.168.1.202/centos-02
#创建一个用户来做同步的用户,并授权,所有集群内的服务器都需要做
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 | 2d2baacd-76b4-11ec-b54a-0050562903f0 | centos-02      |        3306 | ONLINE       | SECONDARY     | 8.0.21         |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
1 row in set (0.02 sec)

# 192.168.1.202/centos-03 配置类似192.168.1.202/centos-02
#查看是否启动成功,看到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 | 7809356e-76b4-11ec-9963-0050563675af | centos-03      |        3306 | ONLINE       | SECONDARY     | 8.0.21         |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
1 row in set (0.02 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 | 0f661cfd-76a7-11ec-b9b4-000c2915d830 | centos-01   |        3306 | ONLINE       | PRIMARY     | 8.0.21         |
| group_replication_applier | 2d2baacd-76b4-11ec-b54a-0050562903f0 | centos-02   |        3306 | RECOVERING   | PRIMARY     | 8.0.21         |
| group_replication_applier | 7809356e-76b4-11ec-9963-0050563675af | centos-03   |        3306 | RECOVERING   | PRIMARY     | 8.0.21         |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
3 rows in set (0.00 sec)


# 授权远程用户
CREATE USER 'root'@'%' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

#为了能够管理群集,必须确保您拥有一个具有所需特权的合适用户。推荐的方法是创建一个管理用户。如果在配置实例时未创建管理用户,请使用以下SQL语句来操作。例如,要创建一个名为的用户icadmin,该用户可以管理分配给变量的InnoDB集群 cluster,参与如下操作:这个步骤可选的,如果你后续想直接通过root账号来创建集群也可以的。
mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER IF NOT EXISTS `icadmin`@`192.168.1.%` IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
mysql> GRANT SELECT, RELOAD, SHUTDOWN, PROCESS, FILE, SUPER, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE USER ON *.* TO `icadmin`@`192.168.1.%` WITH GRANT OPTION;
mysql> GRANT BACKUP_ADMIN,CLONE_ADMIN,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,SYSTEM_VARIABLES_ADMIN ON *.* TO `icadmin`@`192.168.1.%` WITH GRANT OPTION;                                                                                             mysql> GRANT INSERT, UPDATE, DELETE ON `mysql`.* TO `icadmin`@`192.168.1.%` WITH GRANT OPTION;                                           
mysql> GRANT INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `mysql_innodb_cluster_metadata`.* TO `icadmin`@`192.168.1.%` WITH GRANT OPTION;
mysql> GRANT INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `mysql_innodb_cluster_metadata_bkp`.* TO `icadmin`@`192.168.1.%` WITH GRANT OPTION;      
mysql> GRANT INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `mysql_innodb_cluster_metadata_previous`.* TO `icadmin`@`192.168.1.%` WITH GRANT OPTION; 
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;

至些,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服务器。

还有其它功能,请参阅官方文档…

安装MySQL Shell非常简单,先把软件包上传到/opt目录, 直接解压就行:

root@centos-01 ~# cd /opt/soft
root@centos-01 /opt/soft# tar -zxvf mysql-shell-8.0.21-linux-glibc2.12-x86-64bit.tar.gz 
root@centos-01 /opt/soft# cp -Rf ./mysql-shell-8.0.21-linux-glibc2.12-x86-64bit/* /usr/local/mysqlshell/
root@centos-01 /opt/soft# chown -R mysql:mysql /usr/local/mysqlshell
root@centos-01 /opt/soft# chmod -R 755 /usr/local/mysqlshell
# 设置环境变量
root@centos-01 /opt/soft# echo "export PATH=\$PATH:/usr/local/mysqlshell/bin" >> /etc/profile
root@centos-01 /opt/soft# source /etc/profile 

三个节点部署操作一样,按上面操作即可!

创建 Innodb Cluster 集群

如果您已经有组复制的现有部署,并且想要使用它来创建群集,请将adoptFromGR选项传递 给该 dba.createCluster()功能。创建的InnoDB群集匹配复制组是以单主数据库还是多主数据库运行。

要采用现有的组复制组,请使用MySQL Shell连接到组成员。执行以下SQL:

mysql-js> var cluster = dba.createCluster('testCluster', {adoptFromGR: true});
A new InnoDB cluster will be created based on the existing replication group on instance '192.168.1.201:3306'.

Creating InnoDB cluster 'testCluster' on '192.168.1.201:3306'...

Adding Seed Instance...
Adding Instance '192.168.1.201:3306'...
Adding Instance '192.168.1.202:3306'...
Adding Instance '192.168.1.203:3306'...
Resetting distributed recovery credentials across the cluster...
Cluster successfully created based on existing replication group.

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

/usr/local/mysqlshell/bin/mysqlsh -h centos-01 -P 3306 -uroot -p
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.
WARNING: Using a password on the command line interface can be insecure.
Creating a session to 'root@centos-01:3306'
Fetching schema names for autocompletion... Press ^C to stop.
Your MySQL connection id is 54
Server version: 8.0.21 MySQL Community Server - GPL
No default schema selected; type \use <schema> to set one.
 MySQL  centos-01:3306 ssl  JS >dba.getCluster().status();
{
    "clusterName": "testCluster", 
    "defaultReplicaSet": {
        "name": "default", 
        "primary": "centos-01:3306", 
        "ssl": "DISABLED", 
        "status": "OK", 
        "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.", 
        "topology": {
            "centos-01:3306": {
                "address": "centos-01:3306", 
                "mode": "R/W", 
                "readReplicas": {}, 
                "replicationLag": null, 
                "role": "HA", 
                "status": "ONLINE", 
                "version": "8.0.21"
            }, 
            "centos-02:3306": {
                "address": "centos-02:3306", 
                "mode": "R/O", 
                "readReplicas": {}, 
                "replicationLag": null, 
                "role": "HA", 
                "status": "ONLINE", 
                "version": "8.0.21"
            }, 
            "centos-03:3306": {
                "address": "centos-03:3306", 
                "mode": "R/O", 
                "readReplicas": {}, 
                "replicationLag": null, 
                "role": "HA", 
                "status": "ONLINE", 
                "version": "8.0.21"
            }
        }, 
        "topologyMode": "Single-Primary"
    }, 
    "groupInformationSourceMember": "centos-01:3306"
}

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路由器对任何特定的服务器或主机都没有亲和力。

图3.1示例MySQL路由器部署

在这里插入图片描述

这里我们通过 Bootstrapping MySQL Router 的方式来安装部署 MySQL Router 8.0.21:

解压软件包:

root@centos-01 ~# cd /opt
root@centos-01 /opt/soft# tar -xvf mysql-router-8.0.21-linux-glibc2.12-x86_64.tar.xz
root@centos-01 /opt/soft# cp -Rf ./mysql-router-8.0.21-linux-glibc2.12-x86_64/* /usr/local/mysqlrouter/
root@centos-01 /opt/soft# chown -R mysql:mysql /usr/local/mysqlrouter
root@centos-01 /opt/soft# chmod -R 755 /usr/local/mysqlrouter

创建MySQL Router 目录

root@centos-01 ~# mkdir -p /data/mysqlrouter
root@centos-01 /opt/soft# chown -R mysql:mysql /data/mysqlrouter
root@centos-01 /opt/soft# chmod -R 755 /data/mysqlrouter

# 设置环境变量
root@centos-01 /opt/soft# echo "export PATH=\$PATH:/usr/local/mysqlrouter/bin" >> /etc/profile
root@centos-01 /opt/soft# source /etc/profile 

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

[root@centos-01 mysqlrouter]# /usr/local/mysqlrouter/bin/mysqlrouter --bootstrap root:123456@192.168.1.201 --directory /data/mysqlrouter --conf-use-sockets --user=mysql --name=mysql_router_13306 --conf-bind-address=192.168.1.201 --account-host="192.168.1.%" 
# 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@centos-01 mysqlrouter]# tree /data/mysqlrouter/
/data/mysqlrouter/
├── data
│   ├── keyring
│   └── state.json
├── log
│   └── mysqlrouter.log
├── mysqlrouter.conf
├── mysqlrouter.key
├── run
├── start.sh
└── stop.sh

生成的MySQL路由器配置文件(mysqlrouter.conf)类似于:

[root@centos-01 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=3
user=mysql_router3_acli0n74p8oy
metadata_cluster=testCluster
ttl=0.5
auth_cache_ttl=-1
auth_cache_refresh_interval=2
use_gr_notifications=0

[routing:testCluster_rw]
bind_address=192.168.1.201
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=192.168.1.201
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=192.168.1.201
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=192.168.1.201
bind_port=64470
socket=/data/mysqlrouter/mysqlxro.sock
destinations=metadata-cache://testCluster/?role=SECONDARY
routing_strategy=round-robin-with-fallback
protocol=x

启动MySQL Router 路由器:

[root@centos-01 mysqlrouter]# bash /data/mysqlrouter/start.sh  2>&1 > /dev/null &
[root@centos-01 mysqlrouter]# ps -ef|grep mysql
root       6574      1  0 20:42 pts/0    00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql/data --pid-file=/data/mysql/mysql.pid
mysql      6967   6574  1 20:42 pts/0    00:01:55 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql/log/mysql-err.log --pid-file=/data/mysql/mysql.pid --socket=/data/mysql/mysql.sock
root       7166   1910  0 20:45 pts/0    00:00:00 /usr/local/mysql/bin/mysql -uroot -px xxxx -S /data/mysql/mysql.sock
root      11451   7937  0 22:10 pts/1    00:00:00 /usr/local/mysqlshell/bin/mysqlsh -h centos-01 -P 3306 -uroot -p******
root      12637      1  0 22:35 pts/2    00:00:00 sudo ROUTER_PID=/data/mysqlrouter/mysqlrouter.pid /usr/local/mysqlrouter/bin/mysqlrouter -c /data/mysqlrouter/mysqlrouter.conf --user=mysql
mysql     12638  12637 14 22:35 pts/2    00:00:02 /usr/local/mysqlrouter/bin/mysqlrouter -c /data/mysqlrouter/mysqlrouter.conf --user=mysql
root      12659  10011  0 22:35 pts/2    00:00:00 grep --color=auto mysql

Mysql启动命令

## 启动命令:
/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;
#202/203机器
#启动MGR
mysql> start group_replication;
#查看是否启动成功,看到online就是成功了
mysql> SELECT * FROM performance_schema.replication_group_members;

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

mysqlsh常用命令 (mysqlsh的JS语法)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1560180.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数字IC/FPGA】手撕代码:模3检测器(判断输入序列能否被3整除)

今天我们来手撕一个常见的笔试题&#xff0c;使用的方法是三段式Moore状态机。 题目描述&#xff1a; 输入端口是串行的1bit数据&#xff0c;每个时钟周期进来一位新数据后&#xff0c;实时检查当前序列是否能整除3&#xff0c;若能则输出1&#xff0c;否则输出0。 例如&#…

BIT-4-自定义类型:结构体,枚举,联合(C语言进阶)

本章重点 结构体 结构体类型的声明结构的自引用结构体变量的定义和初始化结构体内存对齐结构体传参结构体实现位段&#xff08;位段的填充&可移植性&#xff09;枚举 枚举类型的定义枚举的优点枚举的使用联合 联合类型的定义联合的特点联合大小的计算 结构体 1.结构体的声…

unity学习(74)——服务器Dispose异常

1.返回的1 2 11是怪物初始化&#xff0c;源代码中也没有 2. 3.客户端中的网络连接初始化如下&#xff1a; 4.不是因为超时&#xff0c;设置10s为超时期限后&#xff0c;客户端和服务器有时依然会报错&#xff01; 5.我感觉就是update中发包给弄坏的&#xff01; 6.不在“帧”…

【面试专题】Mybatis高频面试题

一、介绍下MyBatis中的工作原理 1。介绍MyBatis的基本情况&#xff1a;ORM 2。原理&#xff1a; MyBatis框架的初始化操作处理SQL请求的流程 1.系统启动的时候会加载解析全局配置文件和对应映射文件。加载解析的相关信息存储在 Configuration 对象 Testpublic void test1(…

Android ImageView以及实现截图

实现效果 截图前 截图后 代码 package cn.jj.huaweiad;import android.annotation.SuppressLint; import android.graphics.Bitmap; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.View; import android.view.ViewGro…

【运维】Elsatic Search学习笔记

基本使用 Elasticsearch(简称ES): 是一个开源的高扩展的分布式全文搜索引擎 Docker安装Elasticsearch1 version: "3.1" services:elasticsearch:image: elasticsearch:7.13.3container_name: elasticsearchprivileged: trueenvironment:- "cluster.nameelast…

HTTP 常见面试题(计算机网络)

HTTP 基本概念 一、HTTP 是什么&#xff1f; HTTP(HyperText Transfer Protocol) &#xff1a;超文本传输协议。 HTTP 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」。 「HTTP 是用于从互联网服务器传输超文本到本…

【4】单链表(有虚拟头节点)

【4】单链表&#xff08;有虚拟头节点&#xff09; 1、虚拟头节点2、构造方法3、node(int index) 返回索引位置的节点4、添加5、删除6、ArrayList 复杂度分析(1) 复杂度分析(2) 数组的随机访问(3) 动态数组 add(E element) 复杂度分析(4) 动态数组的缩容(5) 复杂度震荡 7、单链…

uniapp 小程序发布体验版 http://198.18.0.1:7001 不在以下 request 合法域名列表中(踩坑记录二)

问题一&#xff1a; 小程序发布体验版时出现报错信息&#xff1a; http://198.18.0.1:7001 不在以下 request 合法域名列表中无法连接uniCloud本地调试服务&#xff0c;请检查当前客户端是否与主机在同一局域网下 解决方案&#xff1a; 请务必在HBuilderX内使用【发行】菜单打…

Vastbase编程利器:PL/pgSQL原理简介

PL/pgSQL是Vastbase提供的一种过程语言&#xff0c;在普通SQL语句的使用上增加了编程语言的特点&#xff0c;可以用于创建函数、存储过程、触发器过程以及创建匿名块等。 本文介绍Vastbase中PL/pgSQL的执行流程&#xff0c;包括PL/pgSQL的编译与运行。 1、编译 PL/pgSQL的编译…

什么是HTTP? HTTP 和 HTTPS 的区别?

文章目录 一、HTTP二、HTTPS三、区别参考文献 一、HTTP HTTP (HyperText Transfer Protocol)&#xff0c;即超文本运输协议&#xff0c;是实现网络通信的一种规范 在计算机和网络世界有&#xff0c;存在不同的协议&#xff0c;如广播协议、寻址协议、路由协议等等… 而HTTP是…

CleanMyMac X2024专业的Mac清理工,具一次激活,永久使用

CleanMyMac&#xff0c;作为一款专为Mac系统设计的垃圾清理工具&#xff0c;以其强大的清理能力、简便的操作方式以及卓越的系统兼容性&#xff0c;受到了众多Mac用户的青睐。以下是对这款软件功能的详细介绍&#xff1a; CleanMyMac X2024全新版下载如下: https://wm.makedin…

机器人---人形机器人之技术方向

1 背景介绍 在前面的文章《行业杂谈---人形机器人的未来》中&#xff0c;笔者初步介绍了人形机器人的未来发展趋势。同智能汽车一样&#xff0c;它也会是未来机器人领域的一个重要分支。目前地球上最高智慧的结晶体就是人类&#xff0c;那么人形机器人的未来会有非常大的发展空…

Qt笔记-解决Qt程序连不上数据库MySQL数据库(重编libqsqlmysql.so)

使用QSqlDatabase连接MySQL数据库时。在自己程序配置没有错误的情况下报这类错误&#xff1a; QSqlDatabase: QMYSQL driver not loaded QSqlDatabase::exec: database not open 造成这样的问题大多数是libqsqlmysql.so有问题。 Qt的QSqlDatabase使用的是libqsqlmysql.so&a…

【GitLab】开启GitLab 的邮箱通知服务

为了GitLab使用更方便&#xff0c;让用户及时收到推送代码、修改密码等相关的通知&#xff0c;可以开启邮箱推送&#xff0c;下面是两种邮箱的配置方法。 使用系统Postfix 邮箱 如果要使用 Postfix 来发送电子邮件通知&#xff0c;执行以下安装命令。 sudo apt-get install …

图的存储及基本操作试题

01&#xff0e;下列关于图的存储结构的说法中&#xff0c;错误的是&#xff08;). A.使用邻接矩阵存储一个图时&#xff0c;在不考虑压缩存储的情况下&#xff0c;所占用的存储空间大小 只与图中的顶点数有关&#xff0c;与边数无关 B&#xff0e;邻接表只用于有向图的存储&…

打造高效安全的电池管理 | 基于ACM32 MCU的两轮车充电桩方案

前 言 随着城市化进程的加快、人们生活水平的提高和节能环保理念的普及&#xff0c;越来越多的人选择了电动车作为代步工具&#xff0c;而两轮电动车的出行半径较短&#xff0c;需要频繁充电&#xff0c;因此在城市中设置两轮车充电桩就非常有必要了。城市中的充电桩不仅能解决…

学习transformer模型-Dropout的简明介绍

Dropout的定义和目的&#xff1a; Dropout 是一种神经网络正则化技术&#xff0c;它在训练时以指定的概率丢弃一个单元&#xff08;以及连接&#xff09;p。 这个想法是为了防止神经网络变得过于依赖特定连接的共同适应&#xff0c;因为这可能是过度拟合的症状。直观上&#…

AcWing-乌龟棋

312. 乌龟棋 - AcWing题库 所需知识&#xff1a;动态规划 闫氏dp分析法&#xff1a; 整体思路&#xff1a;由于走的方式有四种&#xff0c;所以dp[i][j][m][n]的来源有四种&#xff0c;状态转移方程式要求不重不漏&#xff0c;所以我们可以以使用的最后一个卡片上的数值来进行…

三台电机的顺启逆停

1&#xff0c;开启按钮输入信号是 电机一开始启动&#xff0c;5秒回电机2启动 &#xff0c;在5秒电机三启动 关闭按钮输入时电机3关闭 &#xff0c;5秒后电机2关闭 最后电机一关闭 2&#xff0c;思路开启按钮按下接通电机1 并且接通定时器T0 定时器T0 到时候接通电机2 并且开…