docker環(huán)境,搭建mysql mgr單主集群

本文分享如何在docker環(huán)境下,搭建mysql mgr單主集群。

關于bin/ubuntu:16.04鏡像的構建請參考docker基礎環(huán)境搭建

MySQL Group Replication(MGR)是MySQL官方在5.7.17版本引進的一個數(shù)據(jù)庫高可用與高擴展的解決方案(以插件形式提供),通過一致性(Paxos)協(xié)議,實現(xiàn)了分布式下數(shù)據(jù)的最終一致性。有以下特點
高一致性,基于原生復制及paxos協(xié)議的組復制技術,并以插件的方式提供,提供一致數(shù)據(jù)安全保證;
高容錯性,只要不是大多數(shù)節(jié)點壞掉就可以繼續(xù)工作,有自動檢測機制,當不同節(jié)點產(chǎn)生資源爭用沖突時,不會出現(xiàn)錯誤,按照先到者優(yōu)先原則進行處理,并且內(nèi)置了自動化腦裂防護機制;
高擴展性,節(jié)點的新增和移除都是自動的,新節(jié)點加入后,會自動從其他節(jié)點上同步狀態(tài),直到新節(jié)點和其他節(jié)點保持一致,如果某節(jié)點被移除了,其他節(jié)點自動更新組信息,自動維護新的組信息;
高靈活性,有單主模式和多主模式,單主模式下,會自動選主,所有更新操作都在主上進行;多主模式下,所有server都可以同時處理更新操作。
MGR是一種share-nothing復制方案,其中每一個server成員都有完整數(shù)據(jù)副本。

  1. 下載mysql8.0.18安裝文件mysql-server_8.0.18-1ubuntu16.04_amd64.deb-bundle.tar
  2. 構建bin/mysql:8.0.18鏡像,Dockerfile如下
FROM bin/ubuntu:16.04

RUN apt-get update \
&& apt-get install  -yqq libaio1  libnuma1  libmecab2  libsasl2-2    psmisc  psmisc  perl

WORKDIR /var/lib 

COPY mysql-server_8.0.18-1ubuntu16.04_amd64.deb-bundle.tar  .

RUN groupadd -r mysql && useradd -r -g mysql mysql \
&& tar -xvf mysql-server_8.0.18-1ubuntu16.04_amd64.deb-bundle.tar \
&&  { \
        echo mysql-community-server mysql-community-server/root-pass password ''; \
        echo mysql-community-server mysql-community-server/re-root-pass password ''; \
        echo mysql-community-server mysql-server/default-auth-override select '1'; \
} | debconf-set-selections 

RUN dpkg -i mysql-common_8.0.18-1ubuntu16.04_amd64.deb \ 
&& dpkg -i mysql-community-client-core_8.0.18-1ubuntu16.04_amd64.deb \ 
&& dpkg -i mysql-community-client_8.0.18-1ubuntu16.04_amd64.deb \ 
&& dpkg -i mysql-client_8.0.18-1ubuntu16.04_amd64.deb \ 
&& dpkg -i mysql-community-server-core_8.0.18-1ubuntu16.04_amd64.deb \ 
&& dpkg -i mysql-community-server_8.0.18-1ubuntu16.04_amd64.deb \ 
&& dpkg -i mysql-server_8.0.18-1ubuntu16.04_amd64.deb \
&& rm mysql-server_8.0.18-1ubuntu16.04_amd64.deb-bundle.tar \
&& rm *.deb

VOLUME /var/lib/mysql

RUN mkdir -p /var/lib/mysql /var/run/mysqld \
&& chown -R mysql:mysql /var/lib/mysql /var/run/mysqld \
&& chmod 777 /var/run/mysqld

debconf-set-selections可以通過預設配置項實現(xiàn)軟件靜默安裝。
root-pass配置可以從docker hub上官方mysql鏡像的dockerfile文件中找到,這里配置了root的密碼為空(只能通過socket連接)。
default-auth-override配置是先通過dpkg-preconfigure mysql-community-server_8.0.18-1ubuntu16.04_amd64.deb手動設置該配置項,再從/var/cache/debconf/config.dat中獲取到對應的預配置項。

/var/lib/mysql是mysql存放數(shù)據(jù)的目錄,使用VOLUME指令掛載為一個卷。

構建mysql mgr的鏡像bin/mysql-mgr:8.0.18,Dockerfile如下

FROM bin/mysql:8.0.18

COPY docker-entrypoint.sh /usr/local/bin/
COPY mysql-mgr.sh /usr/local/bin/

RUN chmod 777 /usr/local/bin/docker-entrypoint.sh  /usr/local/bin/mysql-mgr.sh
ENTRYPOINT ["docker-entrypoint.sh"]

docker-entrypoint.sh內(nèi)容如下

#!/bin/bash
# 防止集群中mysql server id相同導致錯誤
rm /var/lib/mysql/auto.cnf

if [ "$DEPLOY" = 'mgr' ]; then
cat>>/etc/mysql/mysql.conf.d/mysqld.cnf<<EOF
port=$PORT
server_id=$ID
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE

log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
gtid-mode=ON
plugin_load_add='group_replication.so'
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address= "$IP:$(($PORT+30000))"
group_replication_group_seeds= "$SEED_GROUP"
group_replication_bootstrap_group=off
transaction_write_set_extraction=XXHASH64

report_host=$IP
report_port=$PORT
EOF

exec gosu mysql mysqld
fi

配置含義:
master_info_repository/relay_log_info_repository:將master.info和relay.info保存在TABLE中,默認是FILE
group_replication_group_name:定義組名稱
group_replication_local_address:設置組成員用于與其他成員進行內(nèi)部通信的IP和端口
group_replication_group_seeds:種子成員的IP和端口,新成員加入組時需要與他們通信,請求允許加入組。通常列出組內(nèi)所有成員,也可以選擇部分成員作為種子成員。
group_replication_start_on_boot:配置為off可以讓MGR插件在服務器啟動時不會自動執(zhí)行啟動操作。(我們需要完成準備工作后再啟動MGR插件)
group_replication_bootstrap_group:如果為 ON,則告訴MGR插件,它是組內(nèi)第一個成員,要做初始化,初始化后需改為 OFF。只在 Group Replication 初始化時或整個組崩潰后恢復的情況下使用,當多個 Server 配置此參數(shù),可能人為造成腦裂。
report_host:slave向master注冊時,需要報告自己的IP或hostname。
gtid-mode:開啟GTID(全局事務ID)

mysql-mgr.sh內(nèi)容如下

#!/bin/bash
cat>/mysql-mgr.sql<<EOF
SET SQL_LOG_BIN=0;
CREATE USER 'clusteradmin'@'%' IDENTIFIED WITH sha256_password BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'clusteradmin'@'%' WITH GRANT OPTION ; 

CREATE USER rpl_user@'%' IDENTIFIED WITH sha256_password BY 'password';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
EOF

if [ "$1" = 'master' ] ; then
        echo "SET GLOBAL group_replication_bootstrap_group=ON;" >> /mysql-mgr.sql
        echo "START GROUP_REPLICATION;" >> /mysql-mgr.sql
        echo "SET GLOBAL group_replication_bootstrap_group=OFF;" >> /mysql-mgr.sql
elif [ "$1" = 'slave' ]; then
        echo "START GROUP_REPLICATION;" >> /mysql-mgr.sql
fi

echo 'start mysql process'
mysql < /mysql-mgr.sql 
  1. 創(chuàng)建一個具有REPLICATION SLAVE特權的MySQL用戶rpl_user以用于分布式復制。
    (clusteradmin用于后面教程創(chuàng)建innodb cluster,這里不是必需的)
  2. 如果運行shell時傳入了master參數(shù),
    (1)配置group_replication_bootstrap_group為ON,表示它是組內(nèi)第一個成員,要做 Group Replication 初始化工作。
    (2)START GROUP_REPLICATION 開啟MGR插件
    (3)Group Replication 初始化完成,關閉group_replication_bootstrap_group配置。
    如果運行shell時傳入了savle參數(shù),
    (1)使用START GROUP_REPLICATION 開啟MGR插件,加入已存在的MGR集群。
  3. 使用socket連接mysql,執(zhí)行sql腳步。

編寫docker-bin.sh,負責啟動docker容器

#!/bin/bash

seed_group='';
for i in `seq 1 3`; do
    seed_group="${seed_group}mgr-${i}:33306,"
done
seed_group=${seed_group%?}

sudo docker network create mysql-net
for i in `seq 1 3`; do
    sudo docker run -d --name=mgr-$i \
    --network mysql-net --network-alias mgr-$i \
    -e DEPLOY=mgr  \
    -e PORT=3306 -e ID=$i \
    -e IP=mgr-$i -e SEED_GROUP=$seed_group bin/mysql-mgr:8.0.18
done

啟動容器后,開啟mgr插件

sudo docker exec  mgr-1  /usr/local/bin/mysql-mgr.sh  master
sudo docker exec mgr-2  /usr/local/bin/mysql-mgr.sh  slave
sudo docker exec mgr-3  /usr/local/bin/mysql-mgr.sh  slave

連接到mgr-1,查看集群信息

$ sudo docker exec -it  mgr-1 /bin/bash
root# mysql
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 | 7504ec05-5fb4-11ea-8289-0242ac130003 | mgr-2       |        3306 | ONLINE       | SECONDARY   | 8.0.18         |
| group_replication_applier | 750581f6-5fb4-11ea-a84c-0242ac130002 | mgr-1       |        3306 | ONLINE       | PRIMARY     | 8.0.18         |
| group_replication_applier | 77263269-5fb4-11ea-bcd9-0242ac130004 | mgr-3       |        3306 | ONLINE       | SECONDARY   | 8.0.18         |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
3 rows in set (0.07 sec)
mysql> exit
Bye
root# cat /var/lib/mysql/auto.cnf 
[auto]
server-uuid=750581f6-5fb4-11ea-a84c-0242ac130002

可以看到,當前MGR集群中有3個成員,其中mgr-1作為master,其他成員作為slave。

如果您覺得本文不錯,歡迎關注我的微信公眾號,您的關注是我堅持的動力!


?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容