天天看點

Docker部署MySQL8 MGR

最近想試試用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服務自動啟動了,這點讓我确實有點好奇~~~有知道的朋友歡迎留言。
Docker部署MySQL8 MGR

2、配置第一個mysql-mgr-node1節點

檢視mysql-mgr-node2和mysql-mgr-node3節點的hostname,做好IP和主機名映射關系,因為mgr後續要用到。另外兩個節點也請配置,後續不再說明。

Docker部署MySQL8 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組複制
Docker部署MySQL8 MGR
Docker部署MySQL8 MGR
檢視第一個以引導身份加入的mysql節點,ONLINE表示正常。角色是主。
Docker部署MySQL8 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配置
Docker部署MySQL8 MGR
檢視加入組複制的第二個mysql節點,ONLINE表示正常。角色是主。
Docker部署MySQL8 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節點一模一樣
Docker部署MySQL8 MGR
檢視加入組複制的第三個mysql節點,ONLINE表示正常。角色是主。
Docker部署MySQL8 MGR

至此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;