1.从docker hub下载mysql5.6的镜像

docker pull mysql:5.6

2.使用mysql5.6镜像运行4台mysql服务,用端口号区分

前期准备工作

# 在本机创建四个目录,分别用了存储4台mysql服务的数据,日志以及配置文件

mkdir /data/mysql

cd /data/mysql

mkdir mysql3307 mysql3308 mysql3309 mysql3310

cd mysql3307

mkdir conf logs data

cp -r conf/ data/ logs/ ../mysql3308

cp -r conf/ data/ logs/ ../mysql3309

cp -r conf/ data/ logs/ ../mysql3310

创建并运行4台mysql容器,每台服务器的root密码都是liuhaizhuang

cd /data/mysql/mysql3307

docker run -p 3307:3306 --name mysql3307 \

-v $PWD/conf:/etc/mysql/conf.d \

-v $PWD/logs:/logs \

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

-e MYSQL_ROOT_PASSWORD=liuhaizhuang \

-d mysql:5.6

docker集群部署 jenkins docker集群部署mysql_docker集群部署 jenkins

cd /data/mysql/mysql3308

docker run -p 3308:3306 --name mysql3308 \

-v $PWD/conf:/etc/mysql/conf.d \

-v $PWD/logs:/logs \

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

-e MYSQL_ROOT_PASSWORD=liuhaizhuang \

-d mysql:5.6

docker集群部署 jenkins docker集群部署mysql_docker创建多个mysql集群_02

cd /data/mysql/mysql3309

docker run -p 3309:3306 --name mysql3309 \

-v $PWD/conf:/etc/mysql/conf.d \

-v $PWD/logs:/logs \

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

-e MYSQL_ROOT_PASSWORD=liuhaizhuang \

-d mysql:5.6

docker集群部署 jenkins docker集群部署mysql_docker创建多个mysql集群_03

cd /data/mysql/mysql3310

docker run -p 3310:3306 --name mysql3310 \

-v $PWD/conf:/etc/mysql/conf.d \

-v $PWD/logs:/logs \

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

-e MYSQL_ROOT_PASSWORD=liuhaizhuang \

-d mysql:5.6

docker集群部署 jenkins docker集群部署mysql_mysql_04

到此4台mysql服务器容器已经全部创建且启动!

docker集群部署 jenkins docker集群部署mysql_docker_05

如果想远程链接这4台mysql,需要防火墙开启3307,3308,3309,3310

# 编辑iptables

vim /etc/sysconfig/iptables

# 加上如下4行 退出保存

-A INPUT -p tcp -m state --state NEW -m tcp --dport 3307 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 3308 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 3309 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 3310 -j ACCEPT

重启防火墙,到此远程可以链接上新装的4台mysql了

systemctl restart iptables.service

docker集群部署 jenkins docker集群部署mysql_docker集群部署 jenkins_06

说明已经全部链接上!下一步就可以配置主从复制了

3.配置主从集群

master:端口为3307的mysql

slaves:端口为3308,3309,3310的mysql

配置master

# 切换到mysql3307的配置文件目录

cd /data/mysql/mysql3307/conf

# 新增my.cnf文件且加上如下内容

touch my.cnf

vim my.cnf

docker集群部署 jenkins docker集群部署mysql_docker创建多个mysql集群_07

server-id:同一局域网内要唯一就可以

log-bin:开启二进制日志功能,后面的名称可以随便取

重启mysql3307对应的容器

docker restart mysql3307

在master数据库创建数据同步用户;且授予同步用户 replication slave 和 replication client 权限;用于主从同步数据

mysql> create user 'slave_user'@'%' identified by 'liuhaizhuang';

Query OK, 0 rows affected

mysql> grant replication slave,replication client on *.* to 'slave_user'@'%';

Query OK, 0 rows affected

mysql>

docker集群部署 jenkins docker集群部署mysql_docker_08

配置slave的my.cnf文件

# 切换到mysql3308配置文件目录

cp /data/mysql/mysql3308/conf

touch my.cnf

vim my.cnf

[mysqld]

# 保证局域网内唯一

server-id=2

# 开启二进制,以防作为其他salve的master使用

log-bin=mysql3308-bin

# 配置中继日志

relay_log=mysql3308-relay-bin

# 让slave只读,只参数值限制普通用户,root用户还是可以增删改

read_only=1

重启mysql3308对应的容器

docker restart mysql3308

接下来以此类推配置mysql3309和mysql3310从库

链接master和slave

进入mysql3307命令行,执行show master status;查看File和Position字段的值,后面要使用到

mysql> show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| mysql3307-bin.000001 | 434 | | | |
+----------------------+----------+--------------+------------------+-------------------+
1 row in set
mysql>

进入各个slave命令行,分别执行如下命令:

change master to master_host='172.18.0.5', master_user='slave_user', master_password='liuhaizhuang', master_port=3306, master_log_file='mysql3307-bin.000001', master_log_pos= 434, master_connect_retry=30;

参数说明:

master_host : master的地址,指的是容器的独立ip,可以通过docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称|容器id查询容器的ip

[root@VM_0_10_centos ~]# docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql3307
172.18.0.5
[root@VM_0_10_centos ~]#
master_port:master的端口号,指的是容器的端口号
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 slave 从哪个日志文件开始复制数据,即上文中提到的 file 字段的值
master_log_pos:从哪个 position 开始读,即上文中提到的 position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
mysql> change master to master_host='172.18.0.5', master_user='slave_user', master_password='liuhaizhuang', master_port=3306, master_log_file='mysql3307-bin.000001', master_log_pos= 434, master_connect_retry=30;
Query OK, 0 rows affected
mysql>

进入slave命令使用start slave;开启主从复制过程;查询主从同步状态命令是:show slave status;

docker集群部署 jenkins docker集群部署mysql_docker集群部署 jenkins_09

测试主从复制

在master新见一个数据库,然后观察其他几个从库是否自动同步数据