docker环境,搭建mysql mgr单主集群

本文分享如何在docker环境下,搭建mysql mgr单主集群。

关于bin/ubuntu:16.04镜像的构建请参考docker基础环境搭建

MySQL Group Replication(MGR)是MySQL官方在5.7.17版本引进的一个数据库高可用与高扩展的解决方案(以插件形式提供),通过一致性(Paxos)协议,实现了分布式下数据的最终一致性。有以下特点
高一致性,基于原生复制及paxos协议的组复制技术,并以插件的方式提供,提供一致数据安全保证;
高容错性,只要不是大多数节点坏掉就可以继续工作,有自动检测机制,当不同节点产生资源争用冲突时,不会出现错误,按照先到者优先原则进行处理,并且内置了自动化脑裂防护机制;
高扩展性,节点的新增和移除都是自动的,新节点加入后,会自动从其他节点上同步状态,直到新节点和其他节点保持一致,如果某节点被移除了,其他节点自动更新组信息,自动维护新的组信息;
高灵活性,有单主模式和多主模式,单主模式下,会自动选主,所有更新操作都在主上进行;多主模式下,所有server都可以同时处理更新操作。
MGR是一种share-nothing复制方案,其中每一个server成员都有完整数据副本。

  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可以通过预设配置项实现软件静默安装。
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存放数据的目录,使用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内容如下

#!/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:设置组成员用于与其他成员进行内部通信的IP和端口
group_replication_group_seeds:种子成员的IP和端口,新成员加入组时需要与他们通信,请求允许加入组。通常列出组内所有成员,也可以选择部分成员作为种子成员。
group_replication_start_on_boot:配置为off可以让MGR插件在服务器启动时不会自动执行启动操作。(我们需要完成准备工作后再启动MGR插件)
group_replication_bootstrap_group:如果为 ON,则告诉MGR插件,它是组内第一个成员,要做初始化,初始化后需改为 OFF。只在 Group Replication 初始化时或整个组崩溃后恢复的情况下使用,当多个 Server 配置此参数,可能人为造成脑裂。
report_host:slave向master注册时,需要报告自己的IP或hostname。
gtid-mode:开启GTID(全局事务ID)

mysql-mgr.sh内容如下

#!/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. 创建一个具有REPLICATION SLAVE特权的MySQL用户rpl_user以用于分布式复制。
    (clusteradmin用于后面教程创建innodb cluster,这里不是必需的)
  2. 如果运行shell时传入了master参数,
    (1)配置group_replication_bootstrap_group为ON,表示它是组内第一个成员,要做 Group Replication 初始化工作。
    (2)START GROUP_REPLICATION 开启MGR插件
    (3)Group Replication 初始化完成,关闭group_replication_bootstrap_group配置。
    如果运行shell时传入了savle参数,
    (1)使用START GROUP_REPLICATION 开启MGR插件,加入已存在的MGR集群。
  3. 使用socket连接mysql,执行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。

如果您觉得本文不错,欢迎关注我的微信公众号,您的关注是我坚持的动力!


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容