mysql 8.0 安装手册和Mysql Group Replication(MGR) 组复制的安装

转载自博客:

 第一步要先安装mysql ,可以参考文档

先设置主机hosts

三台服务器设置hosts

特别要注意一个关键点: 必须保证各个mysql节点的主机名不一致,并且能通过主机名找到各成员!

则必须要在每个节点的/etc/hosts里面做主机名绑定,否则后续将节点加入group组会失败!报错RECOVERING!

vim /etc/hosts

192.168.175.155 mgr1

192.168.175.156 mgr2

192.168.175.157 mgr3

 

4、关闭selinux

临时关闭:输入命令setenforce 0,重启系统后还会开启。

永久关闭:输入命令vi /etc/selinux/config,将SELINUX=enforcing改为SELINUX=disabled

#放⾏端⼝,3306MySQL默认端⼝,24901MGR通信端⼝

firewall-cmd  --zone=public --add-port=3306/tcp --permanent
firewall-cmd  --zone=public --add-port=24901/tcp --permanent
firewall-cmd --reload

5、安装MYsql 8.0 采用rpm的形式安装

https://blog.csdn.net/qq_41307110/article/details/124407290

进入官网https://downloads.mysql.com/archives/community/

 

下载 centos8 的

mysql-8.0.28-1.el8.x86_64.rpm-bundle.tar

https://blog.csdn.net/lqzixi/article/details/123260293

https://blog.csdn.net/lqzixi/article/details/123260293

 

tar -xf mysql-8.0.28-1.el7.x86_64.rpm-bundle.tar

 

在安装之前要先检查是否按照错误或者存在版本问题

检测是否安装MySQL和 mariadb

 rpm -qa|grep mysql
rpm -qa|grep mariadb
mariadb-libs-5.5.68-1.el7.x86_64
[root@localhost opt]#

5,删除 mariadb-libs-5.5.68-1.el7.x86_64

[root@localhost opt]# rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64
[root@localhost opt]# rpm -qa|grep mariadb
[root@localhost opt]#

 

 卸载mysql需要下面的操作

 

[root@mgr1 mysql]# rpm -qa | grep -i mysql
perl-DBD-MySQL-4.023-6.el7.x86_64
mysql-community-client-8.0.28-1.el7.x86_64
mysql-community-libs-8.0.28-1.el7.x86_64
mysql-community-libs-compat-8.0.28-1.el7.x86_64
mysql-community-common-8.0.28-1.el7.x86_64
mysql-community-devel-8.0.28-1.el7.x86_64
mysql-community-client-plugins-8.0.28-1.el7.x86_64
mysql-community-icu-data-files-8.0.28-1.el7.x86_64
mysql-community-server-8.0.28-1.el7.x86_64

 

 

同事要删除默认生产的文件

删除 Mysql 的数据存放目录

[root@mgr1 mysql]# rm -rf /var/lib/mysql/
[root@mgr1 mysql]# rm -rf /var/run/mysqld
[root@mgr1 mysql]# rm -rf /var/log/mysqld.log
[root@mgr1 mysql]# rm -rf /etc/my.cnf
[root@mgr1 mysql]# rm -rf /etc/my.cnf.d

其中

安装了 mysql-community-server 组件,会:
a). 在 /etc/下生成 my.cnf 文件 和 my.cnf.d 文件夹

b). 在/var/lib/下生产以下三个文件夹

c). 在/var/log/ 下生成 mysqld.log 文件

d). 在/var/run/ 下生成 mysqld 目录
————————————————

上面这些目录都要删除

 

 

 6,安装MySQL,注意依赖包

整体安装步骤代码

[root@localhost opt]# cd mysql
[root@localhost mysql]# ls
mysql-community-client-8.0.28-1.el7.x86_64.rpm
mysql-community-client-plugins-8.0.28-1.el7.x86_64.rpm
mysql-community-common-8.0.28-1.el7.x86_64.rpm
mysql-community-devel-8.0.28-1.el7.x86_64.rpm
mysql-community-embedded-compat-8.0.28-1.el7.x86_64.rpm
mysql-community-icu-data-files-8.0.28-1.el7.x86_64.rpm
mysql-community-libs-8.0.28-1.el7.x86_64.rpm
mysql-community-libs-compat-8.0.28-1.el7.x86_64.rpm
mysql-community-server-8.0.28-1.el7.x86_64.rpm
mysql-community-test-8.0.28-1.el7.x86_64.rpm
[root@localhost mysql]# rpm -ivh mysql-community-common-8.0.28-1.el7.x86_64.rpm
[root@localhost mysql]# rpm -ivh mysql-community-client-plugins-8.0.28-1.el7.x86_64.rpm
[root@localhost mysql]# rpm -ivh mysql-community-libs-8.0.28-1.el7.x86_64.rpm
[root@localhost mysql]# rpm -ivh mysql-community-libs-compat-8.0.28-1.el7.x86_64.rpm
[root@localhost mysql]# yum install openssl-devel
[root@localhost mysql]# rpm -ivh mysql-community-devel-8.0.28-1.el7.x86_64.rpm
[root@localhost mysql]# yum -y install perl
[root@localhost mysql]# yum -y install net-tools

[root@localhost mysql]# rpm -ivh mysql-community-client-8.0.28-1.el7.x86_64.rpm

[root@localhost mysql]#rpm -ivh mysql-community-icu-data-files-8.0.28-1.el7.x86_64.rpm
 
[root@localhost mysql]# rpm -ivh mysql-community-icu-data-files-8.0.28-1.el7.x86_64.rpm
[root@localhost mysql]# rpm -ivh mysql-community-server-8.0.28-1.el7.x86_64.rpm 
[root@localhost mysql]#

在安装的过程中报错

 

 

[root@mgr3 mysql]# rpm -ivh mysql-community-server-8.0.28-1.el7.x86_64.rpm --force --nodeps

接下来就是启动mysql,

首先要看mysql是否安装完整

[root@localhost mysql]# rpm -qa | grep mysql

 

 

转载自博客https://blog.csdn.net/lqzixi/article/details/123260293

安装完成
安装完成后,会自动生成 /etc/my.cnf 配置文件

安装了 mysql-community-server 组件,会:
a). 在 /etc/下生成 my.cnf 文件 和 my.cnf.d 文件夹

b). 在/var/lib/下生产以下三个文件夹,里面存储文件:/var/lib/mysql/

c). 在/var/log/ 下生成 mysqld.log 文件

d). 在/var/run/ 下生成 mysqld 目录

Mysql启动命令如下所示:

1.5 服务相关命令

重启 MySQL 服务

systemctl start mysqld.service

检查 MySQL 服务运行状态

systemctl status mysqld.service

停止 MySQL 服务

systemctl stop mysqld.service

重启 MySQL 服务

systemctl restart mysqld.service

出现下面的这样就是安装成功了

 

修改密码

  • 查看密码

2.1 获取初始密码

grep 'temporary password' /var/log/mysqld.log

2.2 登录 MySQL

# -h 指定 IP 地址

mysql -u root -p

输入上述命令获取的密码。

 

默认生产的密码是:9#Yi5j=szJ4/

 

2.3 修改密码

ALTER USER 'root'@'localhost' IDENTIFIED BY 'PASSWD';

 

2.4 其他:添加新用户

CREATE USER 'username'@'host' IDENTIFIED BY 'password';

 

然后执行下面的命令:

mysql> flush privileges;

立即上上面的修改生效。

https://blog.csdn.net/m0_60111819/article/details/129790568

10,登入MySQL

[root@localhost mysql]# mysql -uroot -p
Enter password:

 

11,修改登入密码(若改成简单的密码,需修改默认规则)‘’

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Mysql@1234';

 

12,查看当前默认规则‘’

mysql> show variables like 'validate_password%';

 

 13,修改规则

mysql> set global validate_password.policy=LOW;
mysql> set global validate_password.length=4;

 

 14,立即生效

mysql> flush privileges;

 

15,修改简单的密码

mysql> alter user 'root'@'localhost' identified by '1234';

 

16,创建用户可以远程访问
mysql> create user 'root'@'%' IDENTIFIED WITH mysql_native_password BY '1234';

 ‘’

17,给用户分配权限,并立即生效

mysql> grant all on *.* to 'root'@'%';
mysql> flush privileges;

 

8,退出
mysql> exit;

 

19,关闭防火墙
[root@localhost mysql]# systemctl stop firewalld

 

 

20,远程连接

 

 这样3个mysql实例就安装成功了,接下来就要按照mysql的mgr集群了

 

 参考博客:https://blog.csdn.net/weixin_46594796/article/details/139321738

主节点mgr1执行:直接CV就行,不要墨迹!

 
# 修改 MySQL 配置
sudo cat >> /etc/my.cnf <<-'EOF'

# 使用mysql_native_password密码策略,防止navicat连不上mysql8
default_authentication_plugin=mysql_native_password
# 设置MySQL插件目录:MGR基于插件,必须设置插件路径
plugin_dir=/usr/lib64/mysql/plugin
# 服务器编号,Master=1
server_id=1
# 开启binlog的GTID模式(MGR强制要求)
gtid_mode=ON
# 开启后MySQL只允许能够保障事务安全,并且能够被日志记录的SQL语句被执行
enforce_gtid_consistency=ON
# 关闭binlog校验(MGR强制要求二进制日志不支持Binlog Event Checksum )
binlog_checksum=NONE

# 定义用于事务期间哈希写入提取的算法,组复制模式下必须设置为 XXHASH64。
transaction_write_set_extraction=XXHASH64
# 确定组复制恢复时是否应该应用 SSL,通常设置为“开”,但默认设置为“关”。
loose-group_replication_recovery_use_ssl=ON
# 服务器实例所在复制组名称,必须是有效的 UUID,所有节点必须相同。
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
# 确定服务器是否应该在服务器启动期间启动组复制。
loose-group_replication_start_on_boot=OFF

# 为复制组中其他的成员提供的网络地址,指定为“主机:端口”的格式化字符串。
# 很多人想当然认为端口应该是3306,起始不然,MGR需要开启新端口24901同步交换
# 所以这里不要写错,同时,前面我们配置了hosts文件做了主机名与IP的映射,这里直接写主机名即可
loose-group_replication_local_address="mgr1:24901"

# 用于建立新成员到组的连接组成员列表。
# 这个列表指定为由分隔号间隔的组成员网络地址列表,类似 host1:port1、host2:port2 的格式。
# 同样采用n0~n2的主机名替代
loose-group_replication_group_seeds="mgr1:24901,mgr2:24901,mgr3:24901"

# 配置此服务器为引导组,这个选项必须仅在一台服务器上设置,
# 并且仅当第一次启动组或者重新启动整个组时。成功引导组启动后,将此选项设置为关闭。
loose-group_replication_bootstrap_group=OFF
EOF

主节点没有配置mgr,默认生产的配置文件如下所示

 主节点mgr1配置了mgr之后配置的节点如下所示

 完整的配置如下

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pidi

#mgr配置如下所示
# 使用mysql_native_password密码策略,防止navicat连不上mysql8
default_authentication_plugin=mysql_native_password
# 设置MySQL插件目录:MGR基于插件,必须设置插件路径
plugin_dir=/usr/lib64/mysql/plugin
# 服务器编号,Master=1
server_id=1
# 开启binlog的GTID模式(MGR强制要求)
gtid_mode=ON
# 开启后MySQL只允许能够保障事务安全,并且能够被日志记录的SQL语句被执行
enforce_gtid_consistency=ON
# 关闭binlog校验(MGR强制要求二进制日志不支持Binlog Event Checksum )
binlog_checksum=NONE

# 定义用于事务期间哈希写入提取的算法,组复制模式下必须设置为 XXHASH64。
transaction_write_set_extraction=XXHASH64
# 确定组复制恢复时是否应该应用 SSL,通常设置为“开”,但默认设置为“关”。
loose-group_replication_recovery_use_ssl=ON
# 服务器实例所在复制组名称,必须是有效的 UUID,所有节点必须相同。
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
# 确定服务器是否应该在服务器启动期间启动组复制。
loose-group_replication_start_on_boot=OFF

# 为复制组中其他的成员提供的网络地址,指定为“主机:端口”的格式化字符串。
# 很多人想当然认为端口应该是3306,起始不然,MGR需要开启新端口24901同步交换
# 所以这里不要写错,同时,前面我们配置了hosts文件做了主机名与IP的映射,这里直接写主机名即可
loose-group_replication_local_address="mgr1:24901"

# 用于建立新成员到组的连接组成员列表。
# 这个列表指定为由分隔号间隔的组成员网络地址列表,类似 host1:port1、host2:port2 的格式。
# 同样采用n0~n2的主机名替代
loose-group_replication_group_seeds="mgr1:24901,mgr2:24901,mgr3:24901"

# 配置此服务器为引导组,这个选项必须仅在一台服务器上设置,
# 并且仅当第一次启动组或者重新启动整个组时。成功引导组启动后,将此选项设置为关闭。
loose-group_replication_bootstrap_group=OFF

接下来mg2从节点配置

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid


default_authentication_plugin=mysql_native_password
plugin_dir=/usr/lib64/mysql/plugin

# 设置唯一的服务器编号
server_id=2
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE

# 这个参数决定primary节点到secondary节点的请求是否为基于 RSA 密钥对的密码交换所需的公钥
loose-group_replication_recovery_get_public_key=ON
loose-group_replication_recovery_use_ssl=ON
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF

# 设置本机地址n1:24901
loose-group_replication_local_address="mgr2:24901"
loose-group_replication_group_seeds="mgr1:24901,mgr2:24901,mgr3:24901"
loose-group_replication_bootstrap_group=OFF

接下来设置mgr3

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

default_authentication_plugin=mysql_native_password
plugin_dir=/usr/lib64/mysql/plugin

#设置唯一的服务器编号
server_id=3
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE

#这个参数决定primary节点到secondary节点的请求是否为基于 RSA 密钥对的密码交换所需的公钥
loose-group_replication_recovery_get_public_key=ON
loose-group_replication_recovery_use_ssl=ON
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF

#设置本机地址n2:24901
loose-group_replication_local_address="mgr3:24901"
loose-group_replication_group_seeds="mgr1:24901,mgr2:24901,mgr3:24901"
loose-group_replication_bootstrap_group=OFF

三台服务器,依次启动 MySQL

三台服务器,依次启动 MySQL

# 3台服务器都执行
systemctl start mysqld

2.2.4、修改密码、设置主从同步

三台服务器,依次通过该命令,获取数据库连接密码:

# 获取数据库密码
grep 'temporary password' /var/log/mysqld.log

三台服务器,连接到数据库控制台中:

# 连接数据库
mysql -uroot -p'密码'

三台数据库控制台中,都执行下述命令(3台服务器都执行):

核心就是要在主节点上面要创建主从负责的账号和密码,用于三台机器的主从复制,

 在主节点和备用节点上上面执行下面的命令 在mgr1机器上面。这样因为主节点挂了之后,要选择备用节点作为主节点,所以在备用节点上面也要创建复制的账号,所以要在三台机器上面都执行下面的命令
CREATE USER rpl_user@'%' IDENTIFIED BY 'asAS123456!';
# 赋予主从同步权限
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';

# 创建一个远程连接用户,这个用户用在Navcate、JDBC登录的时候,直接用root登录不好
create user 'remote'@'%' identified with mysql_native_password by 'asAS123456!';
# 为remote用户赋予所有数据库资源的访问权限,熟悉grant的小伙伴可以自己调整
grant all privileges on *.* to remote@'%';

# 让刚才的修改生效
FLUSH PRIVILEGES;

# 删除已产生的Binlog
# 一定要RESET MASTER,它会删除刚才已产生的Binlog
# 因为刚才Binglog包含创建用户这种高权限操作,用于主从同步的rpl_user账户是没有权限执行的
# 这就会导致RelayLog重放无法正确执行,导致从属服务器卡死在"RECEVERING"状态
# 利用RESET MASTER删除这些无法执行的binlog,就没问题了,下面的这个命令一定要执行
RESET MASTER;

 


在主节点机器上面创建创建rpl_user账户,此账户用于实现主从数据同步

CREATE USER rpl_user@'%' IDENTIFIED BY 'asAS123456!';
# 赋予主从同步权限
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';

# 创建一个远程连接用户,这个用户用在Navcate、JDBC登录的时候,直接用root登录不好
create user 'remote'@'%' identified with mysql_native_password by 'asAS123456!';
# 为remote用户赋予所有数据库资源的访问权限,熟悉grant的小伙伴可以自己调整
grant all privileges on *.* to remote@'%';

# 让刚才的修改生效
FLUSH PRIVILEGES;

# 删除已产生的Binlog
# 一定要RESET MASTER,它会删除刚才已产生的Binlog
# 因为刚才Binglog包含创建用户这种高权限操作,用于主从同步的rpl_user账户是没有权限执行的
# 这就会导致RelayLog重放无法正确执行,导致从属服务器卡死在"RECEVERING"状态
# 利用RESET MASTER删除这些无法执行的binlog,就没问题了,下面的这个命令一定要执行
RESET MASTER;

CREATE USER rpl_user@'%' IDENTIFIED BY 'asAS123456!';
# 赋予主从同步权限
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';

# 创建一个远程连接用户,这个用户用在Navcate、JDBC登录的时候,直接用root登录不好
create user 'remote'@'%' identified with mysql_native_password by 'asAS123456!';
# 为remote用户赋予所有数据库资源的访问权限,熟悉grant的小伙伴可以自己调整
grant all privileges on *.* to remote@'%';

# 让刚才的修改生效
FLUSH PRIVILEGES;

# 删除已产生的Binlog
# 一定要RESET MASTER,它会删除刚才已产生的Binlog
# 因为刚才Binglog包含创建用户这种高权限操作,用于主从同步的rpl_user账户是没有权限执行的
# 这就会导致RelayLog重放无法正确执行,导致从属服务器卡死在"RECEVERING"状态
# 利用RESET MASTER删除这些无法执行的binlog,就没问题了,下面的这个命令一定要执行
RESET MASTER;

 上面特别关键的时这个命令RESET MASTER;

功能说明:删除所有的binglog日志文件,并将日志索引文件清空,重新开始所有新的日志文件。用于第一次进行搭建主从库时,进行主库binlog初始化工作;

# 删除已产生的Binlog
# 一定要RESET MASTER,它会删除刚才已产生的Binlog
# 因为刚才Binglog包含创建用户这种高权限操作,用于主从同步的rpl_user账户是没有权限执行的
# 这就会导致RelayLog重放无法正确执行,导致从属服务器卡死在"RECEVERING"状态
# 利用RESET MASTER删除这些无法执行的binlog,就没问题了,下面的这个命令一定要执行

2.2.5、安装 MGR 插件

在三台服务器的MySQL控制台中,安装MGR插件,执行命令:

# 3台服务器都执行
INSTALL PLUGIN group_replication SONAME 'group_replication.so';

 

在主服务器mgr1的MySQL控制台上,执行下述命令:

# 注意:只在主服务器上运行
# 我们在 primary.cnf 配置文件中把 group_replication_bootstrap_group 参数设置成 OFF
# 在 primary 服务器启动时并不会直接启动复制组,通过下面的命令动态的开启复制组是我们的集群更安全
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;

在两个从服务器mgr2和mgr3上面MySQL控制台上,执行下述命令:

# 指定主从账户与指定通信频道
CHANGE MASTER TO MASTER_USER="rpl_user", MASTER_PASSWORD="asAS123456!" FOR CHANNEL 'group_replication_recovery';

# 开启组网数据同步
START GROUP_REPLICATION;

 

当两个从节点都运行完毕后,运行下面SQL结果进行验证:
SELECT * FROM performance_schema.replication_group_members;

在启动的时候如何报下面的错误

 https://blog.csdn.net/oradbm/article/details/134712762

问题9 报错  [ERROR] Plugin group_replication reported: '[GCS] The member was unable to join the group. Local port: 33081'


其他节点启动MGR时,执行命令start group_replication;
报错  [ERROR] Plugin group_replication reported: '[GCS] The member was unable to join the group. Local port: 33081'
解决办法:配置白名单
loose-group_replication_ip_whitelist="10.xx.0.0/16,127.0.0.1/8"

2022-09-01T08::31.088437Z  [Warning] Plugin group_replication reported: '[GCS] Connection attempt from IP address 192.168.9.208 refused. Address is not in the IP whitelist.'
解决方法:配置group_replication_ip_whitelist

接下来白名单的设置如下,要在三个节点上面都进行这样的设置

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pidi

#mgr配置如下所示
# 使用mysql_native_password密码策略,防止navicat连不上mysql8
default_authentication_plugin=mysql_native_password
# 设置MySQL插件目录:MGR基于插件,必须设置插件路径
plugin_dir=/usr/lib64/mysql/plugin
# 服务器编号,Master=1
server_id=1
# 开启binlog的GTID模式(MGR强制要求)
gtid_mode=ON
# 开启后MySQL只允许能够保障事务安全,并且能够被日志记录的SQL语句被执行
enforce_gtid_consistency=ON
# 关闭binlog校验(MGR强制要求二进制日志不支持Binlog Event Checksum )
binlog_checksum=NONE

# 定义用于事务期间哈希写入提取的算法,组复制模式下必须设置为 XXHASH64。
transaction_write_set_extraction=XXHASH64
# 确定组复制恢复时是否应该应用 SSL,通常设置为“开”,但默认设置为“关”。
loose-group_replication_recovery_use_ssl=ON
# 服务器实例所在复制组名称,必须是有效的 UUID,所有节点必须相同。
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
# 确定服务器是否应该在服务器启动期间启动组复制。
loose-group_replication_start_on_boot=OFF

# 为复制组中其他的成员提供的网络地址,指定为“主机:端口”的格式化字符串。
# 很多人想当然认为端口应该是3306,起始不然,MGR需要开启新端口24901同步交换
# 所以这里不要写错,同时,前面我们配置了hosts文件做了主机名与IP的映射,这里直接写主机名即可
loose-group_replication_local_address="192.168.175.155:24901"

# 用于建立新成员到组的连接组成员列表。
# 这个列表指定为由分隔号间隔的组成员网络地址列表,类似 host1:port1、host2:port2 的格式。
# 同样采用n0~n2的主机名替代
loose-group_replication_group_seeds="192.168.175.155:24901,192.168.175.156:24901,192.168.175.157:24901"
group_replication_ip_whitelist = '192.168.175.155,192.168.175.156,192.168.175.157'
# 配置此服务器为引导组,这个选项必须仅在一台服务器上设置,
# 并且仅当第一次启动组或者重新启动整个组时。成功引导组启动后,将此选项设置为关闭。
loose-group_replication_bootstrap_group=OFF

在mgr2个mg3上面也是同样的设置

但是设置之后,还是启动不起来,还是一样的错误,在官网上面给出了详细的解释

https://www.cnblogs.com/naocanzhishen/p/13540861.html

参考https://www.cnblogs.com/Canyon/p/12030781.html这篇文章开始配置时

启动总是报错:

1
2
3
4
5
6
7
8
9
2020-08-21T04:52:36.332502Z 10 [System] [MY-010597] [Repl] 'CHANGE MASTER TO FOR CHANNEL 'group_replication_applier' executed'. Previous state master_host='', master_port= 3306, master_log_file='', master_log_pos= 4, master_bind=''. New state master_host='<NULL>', master_port= 0, master_log_file='', master_log_pos= 4, master_bind=''.
2020-08-21T04:52:36.425811Z 0 [ERROR] [MY-011735] [Repl] Plugin group_replication reported: '[GCS] Error connecting to the local group communication engine instance.'
2020-08-21T04:52:37.468858Z 0 [ERROR] [MY-011735] [Repl] Plugin group_replication reported: '[GCS] The member was unable to join the group. Local port: 33081'
2020-08-21T04:52:42.549863Z 0 [ERROR] [MY-011735] [Repl] Plugin group_replication reported: '[GCS] Error connecting to the local group communication engine instance.'
2020-08-21T04:52:43.593257Z 0 [ERROR] [MY-011735] [Repl] Plugin group_replication reported: '[GCS] The member was unable to join the group. Local port: 33081'
2020-08-21T04:52:48.679199Z 0 [ERROR] [MY-011735] [Repl] Plugin group_replication reported: '[GCS] Error connecting to the local group communication engine instance.'
2020-08-21T04:52:49.720298Z 0 [ERROR] [MY-011735] [Repl] Plugin group_replication reported: '[GCS] The member was unable to join the group. Local port: 33081'
2020-08-21T04:52:54.798558Z 0 [ERROR] [MY-011735] [Repl] Plugin group_replication reported: '[GCS] Error connecting to the local group communication engine instance.'
2020-08-21T04:52:55.838872Z 0 [ERROR] [MY-011735] [Repl] Plugin group_replication reported: '[GCS] The member was unable to join the group. Local port: 33081'
  

白名单也设置了,防火墙端口也打开了,依旧不行。各种尝试后发现原来是SELinux搞的鬼

解决方法如下:

1.关闭SELinux,但是这样会不太安全,不是很推荐

1
setenforce 0
  

2.开放通讯端口(推荐)

1
2
3
yum install -y policycoreutils-python
 
semanage port -a -t mysqld_port_t -p tcp 33081

终于启动起来了。

在MGR集群搭建中还有一些高阶的配置可以参考下下面的设置:

【MySQL高可用集群】MySQL的MGR搭建

https://blog.csdn.net/a1010256340/article/details/136219622

包括binlog和relaylog的设置等

[mysqld]
#禁止 MGR 不支持的引擎
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
server_id=20
report_host = 10.53.207.20
#GTID
gtid_mode=ON
enforce_gtid_consistency=ON
#binlog
#log_bin=binlog
binlog_format=ROW
expire_logs_days=10
binlog_ignore_db = mysql
binlog_ignore_db = information_schema
binlog_ignore_db = performance_schema
binlog_ignore_db = sys
#relaylog
relay_log_info_repository=TABLE
relay_log_recovery = 1
log_slave_updates=ON
master_info_repository=TABLE
#指示Server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
transaction_write_set_extraction=XXHASH64
#MGR
#服务启动加载安装复制组插件
plugin_load_add='group_replication.so'
#复制组名称确保每个机器都一样,可以用“select uuid()”生成
group_replication_group_name="35693218-3d99-11ee-a7ba-489ebd770e95"
#MySQL启动时是否自动启动组复制
group_replication_start_on_boot=OFF
#当前主机的主机名和复制组端口
group_replication_local_address= "192.168.175.155:24901"
#复制组的成员信息

loose-group_replication_group_seeds="192.168.175.155:24901,192.168.175.156:24901,192.168.175.157:24901"
group_replication_ip_whitelist = '192.168.175.155,192.168.175.156,192.168.175.157'

#复制组白名单
#是否引导组服务,如果开启每次重启都会创建新的复制组,所以配置文件中一定要关闭
group_replication_bootstrap_group=OFF
#是否单主模式,默认是
#group_replication_single_primary_mode=ON
#多主模式下,强制检查每一个实例是否允许写操作,默认关闭
#group_replication_enforce_update_everywhere_checks=OFF

接下线我们来看整个三个节点的详细配置

  MySQL官方在 5.7.17版本正式推出组复制(MySQL Group Replication,简称MGR),使用类似 zookeeper 的多于一半原则。在一个集群由 2N+1 个节点共同组成一个复制组,一个事务的提交,必须经过 N+1 (也就是集群节点数 / 2+ 1)个节点决议并通过后才可以提交。这是目前 MySQL 数据库高可用与高扩展的最优解决方案。MGR有以下几个限制条件:

1、存储引擎必须为Innodb,即仅支持InnoDB表

2、每张表必须有主键,用于做write set的冲突检测

3、不支持外键于save point特性,无法做全局间的约束检测与部分部分回滚

4、必须开启GTID特性,二进制日志格式必须设置为ROW,用于选主与write set

5、二进制日志binlog不支持Replication event checksums

6、多主模式(也就是多写模式) 下:不支持SERIALIZABLE事务隔离级别,不完全支持级联外键约束,不支持在不同节点上对同一个数据库对象并发执行DDL

8、只支持ipv4网络,最多支持9个节点
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/a1010256340/article/details/136219622

mgr1主节点的配置

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove the leading "# " to disable binary logging
# Binary logging captures changes between backups and is enabled by
# default. It's default setting is log_bin=binlog
# disable_log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
#
# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pidi
#binlog和relaylog的设置
#禁止 MGR 不支持的引擎
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
#binlog
#log_bin=binlog
binlog_format=ROW
expire_logs_days=10
binlog_ignore_db = mysql
binlog_ignore_db = information_schema
binlog_ignore_db = performance_schema
binlog_ignore_db = sys
#relaylog
relay_log_info_repository=TABLE
relay_log_recovery = 1
log_slave_updates=ON
master_info_repository=TABLE

#mgr配置如下所示
# 使用mysql_native_password密码策略,防止navicat连不上mysql8
default_authentication_plugin=mysql_native_password
# 设置MySQL插件目录:MGR基于插件,必须设置插件路径
plugin_dir=/usr/lib64/mysql/plugin
# 服务器编号,Master=1
server_id=1
# 开启binlog的GTID模式(MGR强制要求)
gtid_mode=ON
# 开启后MySQL只允许能够保障事务安全,并且能够被日志记录的SQL语句被执行
enforce_gtid_consistency=ON
# 关闭binlog校验(MGR强制要求二进制日志不支持Binlog Event Checksum )
binlog_checksum=NONE

# 定义用于事务期间哈希写入提取的算法,组复制模式下必须设置为 XXHASH64。
transaction_write_set_extraction=XXHASH64
# 确定组复制恢复时是否应该应用 SSL,通常设置为“开”,但默认设置为“关”。
loose-group_replication_recovery_use_ssl=ON
# 服务器实例所在复制组名称,必须是有效的 UUID,所有节点必须相同。
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
# 确定服务器是否应该在服务器启动期间启动组复制。
loose-group_replication_start_on_boot=OFF

# 为复制组中其他的成员提供的网络地址,指定为“主机:端口”的格式化字符串。
# 很多人想当然认为端口应该是3306,起始不然,MGR需要开启新端口24901同步交换
# 所以这里不要写错,同时,前面我们配置了hosts文件做了主机名与IP的映射,这里直接写主机名即可
loose-group_replication_local_address="192.168.175.155:24901"

# 用于建立新成员到组的连接组成员列表。
# 这个列表指定为由分隔号间隔的组成员网络地址列表,类似 host1:port1、host2:port2 的格式。
# 同样采用n0~n2的主机名替代
loose-group_replication_group_seeds="192.168.175.155:24901,192.168.175.156:24901,192.168.175.157:24901"
group_replication_ip_whitelist = '192.168.175.155,192.168.175.156,192.168.175.157'
# 配置此服务器为引导组,这个选项必须仅在一台服务器上设置,
# 并且仅当第一次启动组或者重新启动整个组时。成功引导组启动后,将此选项设置为关闭。
loose-group_replication_bootstrap_group=OFF

两个从节点的配置如下

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove the leading "# " to disable binary logging
# Binary logging captures changes between backups and is enabled by
# default. It's default setting is log_bin=binlog
# disable_log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
#
# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
#mgr的配置如下所示
default_authentication_plugin=mysql_native_password
plugin_dir=/usr/lib64/mysql/plugin

#禁止 MGR 不支持的引擎
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
#binlog
#log_bin=binlog
binlog_format=ROW
expire_logs_days=10
binlog_ignore_db = mysql
binlog_ignore_db = information_schema
binlog_ignore_db = performance_schema
binlog_ignore_db = sys
#relaylog
relay_log_info_repository=TABLE
relay_log_recovery = 1
log_slave_updates=ON
master_info_repository=TABLE
#设置唯一的服务器编号
server_id=30
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE

#这个参数决定primary节点到secondary节点的请求是否为基于 RSA 密钥对的密码交换所需的公钥
loose-group_replication_recovery_get_public_key=ON
loose-group_replication_recovery_use_ssl=ON
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF

#设置本机地址n2:24901
# 所以这里不要写错,同时,前面我们配置了hosts文件做了主机名与IP的映射,这里直接写主机名即可
loose-group_replication_local_address="192.168.175.157:24901"

# 用于建立新成员到组的连接组成员列表。
# 这个列表指定为由分隔号间隔的组成员网络地址列表,类似 host1:port1、host2:port2 的格式。
# 同样采用n0~n2的主机名替代
loose-group_replication_group_seeds="192.168.175.155:24901,192.168.175.156:24901,192.168.175.157:24901"
group_replication_ip_whitelist = '192.168.175.155,192.168.175.156,192.168.175.157'
loose-group_replication_bootstrap_group=OFF
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove the leading "# " to disable binary logging
# Binary logging captures changes between backups and is enabled by
# default. It's default setting is log_bin=binlog
# disable_log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
#
# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid


default_authentication_plugin=mysql_native_password
plugin_dir=/usr/lib64/mysql/plugin
#禁止 MGR 不支持的引擎
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
#binlog
#log_bin=binlog
binlog_format=ROW
expire_logs_days=10
binlog_ignore_db = mysql
binlog_ignore_db = information_schema
binlog_ignore_db = performance_schema
binlog_ignore_db = sys
#relaylog
relay_log_info_repository=TABLE
relay_log_recovery = 1
log_slave_updates=ON
master_info_repository=TABLE

# 设置唯一的服务器编号
server_id=20
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE

# 这个参数决定primary节点到secondary节点的请求是否为基于 RSA 密钥对的密码交换所需的公钥
loose-group_replication_recovery_get_public_key=ON
loose-group_replication_recovery_use_ssl=ON
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF

# 设置本机地址n1:24901
# 所以这里不要写错,同时,前面我们配置了hosts文件做了主机名与IP的映射,这里直接写主机名即可
loose-group_replication_local_address="192.168.175.156:24901"

# 用于建立新成员到组的连接组成员列表。
# 这个列表指定为由分隔号间隔的组成员网络地址列表,类似 host1:port1、host2:port2 的格式。
# 同样采用n0~n2的主机名替代
loose-group_replication_group_seeds="192.168.175.155:24901,192.168.175.156:24901,192.168.175.157:24901"
group_replication_ip_whitelist = '192.168.175.155,192.168.175.156,192.168.175.157'
loose-group_replication_bootstrap_group=OFF

在主服务器的MySQL控制台上,执行下述命令:

接下来就是启动集群的复制操作

在主节点上启动

# 注意:只在主服务器上运行
# 我们在 primary.cnf 配置文件中把 group_replication_bootstrap_group 参数设置成 OFF
# 在 primary 服务器启动时并不会直接启动复制组,通过下面的命令动态的开启复制组是我们的集群更安全
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;

在两个从服务器MySQL控制台上,执行下述命令:

# 指定主从账户与指定通信频道
CHANGE MASTER TO MASTER_USER="rpl_user", MASTER_PASSWORD="asAS123456!" FOR CHANNEL 'group_replication_recovery';

# 开启组网数据同步
START GROUP_REPLICATION;

当两个从节点都运行完毕后,运行下面SQL结果进行验证:

SELECT * FROM performance_schema.replication_group_members;

出现以下情况,每个节点都是ONLINE状态,说明集群搭建成功:

 

3、MySQL MGR 故障转移

上面已经将MySQL MGR集群搭建完毕,并且节点都是ONLINE状态。

3.1、主节点mgr1下线,重新选举

首先,在主服务器mgr1上执行停止mysql命令,如下:

systemctl stop mysqld;

此时,在从节点mgr2查看集群状态发现,mgr2被选举为主节点:

 

 

这是由于MGR集群选举策略为:

  • 优先低版本节点
  • 版本一样,优先权重大的节点
  • 版本与权重一样,按照 server uuid 的字母顺序选主

 

3.3、恢复 MGR 集群

恢复流程很简单,先将三台服务器的MySQL各自重启:

# 3台服务器都执行
systemctl restart mysqld;
  • 1
  • 2

然后重复执行 2.2.4 ~ 2.2.5 章节流程即可恢复 MGR 集群。

 

 

4、单主模式和多主模式

4.1、模式介绍

4.1.1、单主模式

在单主模式下, 组复制具有自动选主功能,每次只有一个 server成员可以作为主节点。

单主模式 group 内只有一台节点可写可读,其他节点只可以读。对于group的部署,需要先跑起primary主节点,然后再跑起其他的节点,并把这些节点加进group。其他的节点就会自动同步primary节点上面的变化,然后将自己设置为只读模式。

当primary主节点意外宕机或者下线,在满足大多数节点存活的情况下,group内部发起选举,选出下一个可用的读节点,提升为primary节点。

 

 

4.1.2、多主模式

在多主模式下,所有的 MySQL 节点都可以同时接受读写操作。group内的所有节点都是primary主节点,同时可以进行读写操作,并且数据是最终一致的。

 

4.2.1、单主 ——> 多主

从 mgr1 ~ mgr3 停止组复制,开启多主模式(3个节点都执行):

# 停止组复制
stop group_replication;

# 是否启用单主模式,默认ON,OFF代表多主
set global group_replication_single_primary_mode=OFF;

# 是否开启条件检查,因为多主的约束更为严格,不符合要求的直接拒绝
# 不支持外键的级联操作
# 不支持“串行化Serializable”
set global group_replication_enforce_update_everywhere_checks=ON;

在 mgr1主节点启用组复制:

# 只在 n0 上执行
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;

在 ngr2,mgr3 节点上启用组复制:

# 只在 n1, n2 上执行
START GROUP_REPLICATION;

此时,可以看到三台MySQL都是主节点:

SELECT * FROM performance_schema.replication_group_members;

 

4.2.2、多主 ——> 单主

从 n0 ~ n2 停止组复制,开启多主模式(3个节点都执行):

# 停止组复制
stop group_replication;

# 是否开启条件检查,因为多主的约束更为严格,不符合要求的直接拒绝
# 不支持外键的级联操作
# 不支持“串行化Serializable”
set global group_replication_enforce_update_everywhere_checks=OFF;

# 是否启用单主模式,默认ON,OFF代表多主
set global group_replication_single_primary_mode=ON;

在 mgr1主节点启用组复制:

# 只在 n0 上执行
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;

在 mgr1,mgr2 节点上启用组复制:

# 只在 n1, n2 上执行
START GROUP_REPLICATION;

此时,可以看到三台MySQL变成了主从模式:

posted on 2024-07-28 18:00  luzhouxiaoshuai  阅读(21)  评论(0编辑  收藏  举报

导航