Docker搭建Mysql Group Replication环境

linux版本:oracle linux 7.6 x86_64

 

目标:在该linux服务器上,安装docker,并用docker创建三个容器实现三节点的mysql mgr复制环境.

 

 

一.概念简述:

 

docker是什么:

 

docker包括一个命令行程序,一个后台守护进程以及一组远程服务。

 

它解决了常见的软件问题,并简化了安装,运行,发布和删除软件,这一切能够实现是通过使用了一项Unix技术,称为容器。容器是docker的重要概念。

 

mysql mgr是什么:

 

MGR是一个实现了mysql多节点读写的集群方案,

 

它基于原生复制及Paxos协议的组复制技术,并以插件的方式提供,实现了数据的强一致性,节点切换也变得简单自动,扩展性也很方便。

 

 

 

二.安装docker:

 

[root@mysqlpri]#yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

 

[root@mysqlpri]#yum makecache fast

 

[root@mysqlpri]#yum list docker-ce --showduplicates | sort -r

 

[root@mysqlpri]#yum install -y docker-ce-19.03.8

 

这个时候会报如下错误:

 

Error: Package: 3:docker-ce-19.03.8-3.el7.x86_64 (docker-ce-stable)

 

Requires: container-selinux >= 2:2.74

 

解决办法:

 

单独安装container-selinux包,

 

yum install http://mirror.centos.org/centos/7/extras/x86_64/Packages/container-selinux-2.107-1.el7_6.noarch.rpm

 

继续安装docker即可顺利完成安装:

 

[root@mysqlpri yum.repos.d]# yum install -y docker-ce-19.03.6

 

这里ce表示的community edition,社区版。

 

配置开机自启动:

 

[root@mysqlpri ~]# systemctl start docker

[root@mysqlpri ~]# systemctl status docker

[root@mysqlpri ~]# systemctl enable docker

 

docker其他常用命令:

docker version 查看版本

docker ps 查看当前正在运行的容器

docker ps  -a查看所有容器

docker rm container_id/container_name 删除某个容器

docker inspect container_id/container_name查看某个容器的元信息

docker images 查看本地镜像

更多的docker命令在后面用到再提

 

 

三.docker搭建MGR环境

 

创建目录:

[root@mysqlpri ~]# mkdir /docker

[root@mysqlpri ~]# cd /docker/

[root@mysqlpri docker]# pwd

/docker

[root@mysqlpri docker]#

 

创建一个新的docker网络环境,可以看到下面创建了group1的网络,这个网络的属性为Subnet: 172.18.0.0/16,Gateway: 172.18.0.1等等。

 

[root@mysqlpri docker]# docker network ls

NETWORK ID          NAME                DRIVER              SCOPE

55202ff3cec7        bridge              bridge              local

0399c5ca21d4        host                host                local

ee8794f8062d        none                null                local

[root@mysqlpri docker]# docker network create group1

15c6de2e831ae956c3d24cfb937ff8b63be5dd9cca71bdb0ccb9bee69441e043

[root@mysqlpri docker]# docker network ls

NETWORK ID          NAME                DRIVER              SCOPE

55202ff3cec7        bridge              bridge              local

15c6de2e831a        group1              bridge              local

0399c5ca21d4        host                host                local

ee8794f8062d        none                null                local

[root@mysqlpri docker]# docker inspect group1

[

{

"Name": "group1",

"Id": "15c6de2e831ae956c3d24cfb937ff8b63be5dd9cca71bdb0ccb9bee69441e043",

"Created": "2020-05-12T09:44:38.324204388+08:00",

"Scope": "local",

"Driver": "bridge",

"EnableIPv6": false,

"IPAM": {

"Driver": "default",

"Options": {},

"Config": [

{

"Subnet": "172.18.0.0/16",

"Gateway": "172.18.0.1"

}

]

},

"Internal": false,

"Attachable": false,

"Ingress": false,

"ConfigFrom": {

"Network": ""

},

"ConfigOnly": false,

"Containers": {},

"Options": {},

"Labels": {}

}

]

 

  

创建一个用于mysql的模板配置文件,可以看到这个文件包含了基本的mysql服务器配置,额外的还包含了GR的一些配置选项。

vi my-template.cnf

 

[mysqld]

 

user=mysql

 

server_id=_SERVER_ID_

 

gtid_mode=ON

 

enforce_gtid_consistency=ON

 

master_info_repository=TABLE

 

relay_log_info_repository=TABLE

 

binlog_checksum=NONE

 

log_slave_updates=ON

 

log_bin=mysql-bin

 

relay-log=relay

 

binlog_format=ROW

 

log-error=mysqld.err

 

sync-binlog=1

 

transaction_write_set_extraction=XXHASH64

 

loose-group_replication_group_name="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"

 

loose-group_replication_start_on_boot=off

 

loose-group_replication_local_address= "172.18.0._IP_END_:6606"

 

loose-group_replication_group_seeds= "172.18.0.2:6606,172.18.0.3:6606,172.18.0.4:6606"

 

loose-group_replication_ip_whitelist="172.18.0.2,172.18.0.3,172.18.0.4,127.0.0.1"

 

loose-group_replication_bootstrap_group= off

 

 

继续操作,

vi create_container.sh

#!/bin/bash

for node in 1 2 3

do

export SERVERID=$node

export IPEND=$(($SERVERID+1))

perl -pe 's/_SERVER_ID_/$ENV{SERVERID}/;s/_IP_END_/$ENV{IPEND}/' my-template.cnf > my${node}.cnf

datadir=ddnode${node}

if [ ! -d $datadir ]

then

mkdir $datadir

fi

unset SERVERID

docker run -d --name=node$node --net=group1 --hostname=node$node \

-v $PWD/my${node}.cnf:/etc/my.cnf \

-v $PWD/data:/data \

-v $PWD/$datadir:/var/lib/mysql \

-e MYSQL_ROOT_PASSWORD=root \

mysql/mysql-server:latest

 

ip=$(docker inspect --format '{{ .NetworkSettings.Networks.group1.IPAddress}}' node${node})

echo "${node} $ip"

done

 

跑完脚本后可以docker ps可以看到三个up的容器,并可以看到当前目录/docker下也创建了如下的文件。

[root@mysqlpri docker]# chmod 755 create_container.sh

[root@mysqlpri docker]# ./create_container.sh

[root@mysqlpri docker]# ls -lrt

total 32

-rw-r--r-- 1 root root  730 May 12 09:58 my-template.cnf

drwxr-xr-x 2 root root   32 May 12 10:03 data

-rwxr-xr-x 1 root root  678 May 12 10:09 create_container.sh

-rw-r--r-- 1 root root  713 May 12 10:11 my1.cnf

-rw-r--r-- 1 root root  713 May 12 10:11 my2.cnf

-rw-r--r-- 1 root root  713 May 12 10:11 my3.cnf

drwxr-xr-x 6   27   27 4096 May 12 10:11 ddnode2

drwxr-xr-x 6   27   27 4096 May 12 10:11 ddnode3

drwxr-xr-x 6   27   27 4096 May 12 10:11 ddnode1

[root@mysqlpri docker]# docker ps

CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                             PORTS                 NAMES

7c552e505d4e        mysql/mysql-server:latest   "/entrypoint.sh mysq…"   32 minutes ago      Up 7 minutes (healthy)   3306/tcp, 33060/tcp   node3

b865e78b4164        mysql/mysql-server:latest   "/entrypoint.sh mysq…"   32 minutes ago      Up 8 minutes (healthy)   3306/tcp, 33060/tcp   node2

2d8e17431315        mysql/mysql-server:latest   "/entrypoint.sh mysq…"   32 minutes ago      Up 8 minutes (healthy)   3306/tcp, 33060/tcp   node1

  

安装GR插件:

[root@mysqlpri docker]# for N in 1 2 3; do docker exec -ti node$N  mysql -u root -proot -e "INSTALL PLUGIN group_replication SONAME 'group_replication.so' "; done

mysql: [Warning] Using a password on the command line interface can be insecure.

mysql: [Warning] Using a password on the command line interface can be insecure.

mysql: [Warning] Using a password on the command line interface can be insecure.

[root@mysqlpri docker]#

 

配置GR并启动GR复制:

node1上操作:

docker exec -it node1 mysql -uroot -proot \

-e "SET @@GLOBAL.group_replication_bootstrap_group=1;" \

-e "SET SQL_LOG_BIN=0;" \

-e "create user 'repl'@'%' identified by 'repl';" \

-e "GRANT REPLICATION SLAVE ON *.* TO repl@'%';" \

-e "ALTER USER 'repl'@'%' IDENTIFIED WITH mysql_native_password; " \

-e "alter user 'repl'@'%' identified by 'repl';" \

-e "flush privileges;" \

-e "SET SQL_LOG_BIN=1;" \

-e "change master to master_user='repl' for channel 'group_replication_recovery';" \

-e "START GROUP_REPLICATION;" \

-e "SET @@GLOBAL.group_replication_bootstrap_group=0;" \

-e "SELECT * FROM performance_schema.replication_group_members;"

 

node2,3上操作:

for N in 2 3

do docker exec -it node$N mysql -uroot -proot \

-e "SET SQL_LOG_BIN=0;" \

-e "create user 'repl'@'%' identified by 'repl';" \

-e "GRANT REPLICATION SLAVE ON *.* TO repl@'%';" \

-e "ALTER USER 'repl'@'%' IDENTIFIED WITH mysql_native_password; " \

-e "alter user 'repl'@'%' identified by 'repl';" \

-e "flush privileges;" \

-e "SET SQL_LOG_BIN=1;" \

-e "change master to master_user='repl',  master_password='repl' for channel 'group_replication_recovery';" \

-e "START GROUP_REPLICATION;"

done

 

 

 

最后在三个节点上查看performance_schema视图都可以看到一致的结果:

[root@mysqlpri ddnode2]# docker exec -it node1 mysql -uroot -proot -e "SELECT * FROM performance_schema.replication_group_members;"

+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+

| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |

+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+

| group_replication_applier | 78777ba3-93fb-11ea-a5ff-0242ac120002 | node1       |        3306 | ONLINE       | PRIMARY     | 8.0.20         |

| group_replication_applier | 78a5571f-93fb-11ea-8512-0242ac120003 | node2       |        3306 | ONLINE       | SECONDARY   | 8.0.20         |

| group_replication_applier | 791b8839-93fb-11ea-84f3-0242ac120004 | node3       |        3306 | ONLINE       | SECONDARY   | 8.0.20         |

+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+

 

安装完毕。

posted @ 2020-05-12 13:05  ALL_ABOUT_DATABASES  阅读(383)  评论(0编辑  收藏  举报