最近想試試用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後續要用到。另外兩個節點也請配置,後續不再說明。
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組複制 3、配置第二個mysql-mgr-node2節點
mysql配置檔案my.cnf直接複制mysql-mgr-node1節點即可!隻需要修改兩處地方。
server_id = 2
loose-group_replication_local_address= "172.17.0.8:33061"
hosts檔案記得加入映射 systemctl restart mysqld
進入mysql修改密碼及mgr配置 這裡說幾個注意的地方:
上面我說了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檔案記得加入映射 systemctl restart mysqld
進入mysql修改密碼及mgr配置,指令和mysql-mgr-node2節點一模一樣 至此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)如果加入組複制的節點狀态一直是RECOVERING
stop group_replication;
set global group_replication_recovery_get_public_key=ON;
start group_replication;