最近想试试用docker部署一套MySQL8的MGR多主,按照官方文档搞了好几天不成功,网上大部分是基于5.7安装的,没有参考意义价值。虽然有一些是基于8版本的但是配置文件都不对,这里就不喷了。所以这篇文章是自己的一个经验总结,也希望能帮助在MySQL8.0.3版本以上(为什么说8.0.3,后面会提到,嘿嘿)部署MGR的朋友(无论单主还是多主模式)。虽然我以前成功配置过MySQL5.7的单主和多主,但是和8还是有一定区别的。本文宿主机系统版本是CentOS7.3,MySQL最新稳定版8.0.12为主。
前期准备工作:
运行一个test名称的容器docker run -d -it --name test centos
进入容器安装MySQL docker exec -it test bash
执行如下安装命令yum install yum-utils wget -y
wget https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
rpm -ivh mysql80-community-release-el7-1.noarch.rpm
yum install mysql-server –y
安装完成后直接退出容器,不需要启动。然后运行如下命令生成镜像docker commit 容器ID mysql8.0.12
使用docker images可以进行查看
1、启动三个容器用于多主MGR配置,至于为什么加provileged和/usr/sbin/init,是因为MySQL服务启动会报Failed to get D-Bus connection: Operation not permitted,曾经以为docker后续会解决这个问题,但是一直没有。docker run -d -it --privileged --name=mysql-mgr-node1 mysql8.0.12 /usr/sbin/init
docker run -d -it --privileged --name=mysql-mgr-node2 mysql8.0.12 /usr/sbin/init
docker run -d -it --privileged --name=mysql-mgr-node3 mysql8.0.12 /usr/sbin/init
执行成功后可以进去容器查看MySQL服务自动启动了,这点让我确实有点好奇~~~有知道的朋友欢迎留言。
2、配置第一个mysql-mgr-node1节点
查看mysql-mgr-node2和mysql-mgr-node3节点的hostname,做好IP和主机名映射关系,因为mgr后续要用到。另外两个节点也请配置,后续不再说明。
修改mysql的配置文件cat /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
server_id = 1
gtid_mode = ON
enforce_gtid_consistency = ON
binlog_checksum = NONE
transaction_write_set_extraction = XXHASH64
loose-group_replication_group_name = 'ce9be252-2b71-11e6-b8f4-00212844f856'
loose-group_replication_start_on_boot = off
loose-group_replication_local_address= "172.17.0.7:33061"
loose-group_replication_group_seeds= "172.17.0.7:33061,172.17.0.8:33061,172.17.0.9:33061"
loose-group_replication_bootstrap_group = off
重启mysql服务systemctl restart mysqld
查看/var/log/mysqld.log里面会有一个临时的密码用于登录mysql服务器mysql -u root -p"qpzsd24a5l;E"
mysql第一次必须修改密码alter user 'root'@'localhost' identified by 'Bdqn@123';
开始配置mgr组复制
查看第一个以引导身份加入的mysql节点,ONLINE表示正常。角色是主。
3、配置第二个mysql-mgr-node2节点
mysql配置文件my.cnf直接复制mysql-mgr-node1节点即可!只需要修改两处地方。server_id = 2
loose-group_replication_local_address= "172.17.0.8:33061"
hosts文件记得加入映射
重启mysql服务systemctl restart mysqld
进入mysql修改密码及mgr配置
查看加入组复制的第二个mysql节点,ONLINE表示正常。角色是主。
这里说几个注意的地方:
上面我说了8.0.4,因为mysql为了考虑mgr组复制的安全性,在8.0.4版本之后(包括8.0.4)将group_replication_allow_local_disjoint_gtids_join移除了,也就是说上面需要打开global group_replication_recovery_get_public_key是我经过多次尝试发现的。
另外一个是两个节点都在一开始执行reset master操作,我不确定是什么原因导致的,因为不执行的话第二个、第三个及后续节点加入组复制都会报错。所以我在一开始的时候就做了这个操作。
4、配置第三个mysql-mgr-node3节点
mysql配置文件my.cnf还是直接复制mysql-mgr-node1节点即可!只需要修改两处地方。server_id = 3
loose-group_replication_local_address= "172.17.0.9:33061"
同样hosts文件记得加入映射
重启mysql服务systemctl restart mysqld
进入mysql修改密码及mgr配置,命令和mysql-mgr-node2节点一模一样
查看加入组复制的第三个mysql节点,ONLINE表示正常。角色是主。
至此MySQL8.0.12版本的MGR部署完成。
如果是单主模式每个mysql节点上不需要执行如下两条命令即可!set global group_replication_single_primary_mode=FALSE;
set global group_replication_enforce_update_everywhere_checks=TRUE;
常见报错:
1)2018-09-14T06:18:04.866248Z 0 [ERROR] [MY-011526] [Repl] Plugin group_replication reported: 'This member has more executed transactions than those present in the group. Local transactions: fc283fd2-b7e0-11e8-bde9-0242ac110009:1 > Group transactions: ce9be252-2b71-11e6-b8f4-00212844f856:1-2'
2018-09-14T06:18:04.866384Z 0 [ERROR] [MY-011522] [Repl] Plugin group_replication reported: 'The member contains transactions not present in the group. The member will now exit the group.'
所有节点重启MySQL服务,然后执行reset master;
配置第一个引导组的MySQL节点后,再加入第二个MySQL节点到组复制。
2)如果加入组复制的节点状态一直是RECOVERINGstop group_replication;
set global group_replication_recovery_get_public_key=ON;
start group_replication;