基于Docker Compose搭建mysql主从复制(1主2从)
系统环境 * 3
ubuntu 16.04
mysql 8.0.12
docker 18.06.1-ce
docker-compose 1.23.0-rc3
*3 ==> ps ###我用的是虚拟机, 所以起了3个虚拟机,分配 ip如下###
主ip :192.168.100.100
从ip :192.168.100.101、192.168.100.102
#开始
##安装docker、docker-compose环境
参考这篇博文 https://blog.csdn.net/diligent_lee/article/details/79098302
#操作注意事项:
1、如果你是windows上面用虚拟机去模拟的话,通过操作编写文件的时候,要保存为liunx格式的文本。
2、一些目录可能需要执行的权限,建议chmod +x 你的目录及其文件。我操作的时候,3个虚拟机上面的文件目录都是一样的,为了方便。
操作的目录文件结构如下
----------------------------------------------------------------
(1)conf里面放mysql的配置文件
----------------------------------------------------------------
(2)data用于挂载mysql的数据目录
----------------------------------------------------------------
(3)docker里面我要接下来要创建的dockerfile文件
##制作dockerfile文件
主从的配置文件一样
from mysql
maintainer <caicai xx@qq.com>
expose 3306
cmd ["mysqld"]
保存文件名为dockerfile。接着在同级目录下执行脚本如下:
docker build -t test/mysql:1.0 .
注意后面有个空格和.符号。
test/mysql:1.0 表示保存为的docker镜像名称
执行完之后,查看本地的镜像文件。
##编写mysql的配置文件my.cnf
主 192.168.100.100 配置文件如下
[mysqld]
# by default we only accept connections from localhost
bind-address="192.168.100.100"
report_host="192.168.100.100"
#mysql服务的唯一编号 每个mysql服务id需唯一
server-id=1
#数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用4个字节)
character-set-server = utf8mb4
#数据库字符集对应一些排序等规则,注意要和character-set-server对应
collation-server = utf8mb4_general_ci
#设置client连接mysql时的字符集,防止乱码
init_connect=‘set names utf8mb4‘
#是否对sql语句大小写敏感,1表示不敏感
lower_case_table_names = 1
##################主从复制设置##################
gtid_mode=on
enforce_gtid_consistency=on
master_info_repository=table
relay_log_info_repository=table
binlog_checksum=none
log_slave_updates=on
binlog_format=row
log-bin=mysql-bin
log-bin-index=mysql-bin.index
#设置加密方式
default_authentication_plugin=mysql_native_password
#group replication
transaction_write_set_extraction=xxhash64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address ="192.168.100.100:33061"
loose-group_replication_group_seeds= "192.168.100.100:33061,192.168.100.101:33061,192.168.100.102:33061"
loose-group_replication_bootstrap_group= off
loose-group_replication_single_primary_mode=false
loose-group_replication_enforce_update_everywhere_checks= true
因为我们等下做的是1主3从,所以这里还从的2个配置文件,共3个。不同的地方就是红色的地方。
192.168.100.100为2个从的ip,替换下,还有就是
主的server-id=1,从的设置为2、3就好了。
##编写docker-compose文件
version: '2'
services:
mysql:
container_name: mysql
network_mode: "host"
environment:
mysql_root_password: "123456"
image: test/mysql:1.0
restart: unless-stopped
volumes:
- "/usr/test/mysql/data:/var/lib/mysql"
- "/usr/test/mysql/conf:/etc/mysql/conf.d"
上面脚本其实很简单,就是设置mysql密码为123456,然后挂载了2个目录,data是mysql的数据文件目录,conf是mysql的配置文件目录,为了mysql启动的时候加载my.cnf
3台主机,依次启动容器
进入我的/usr/test/mysql根目录,执行docker-compose up -d
可以看到我们的mysql容器已经起来了。然后看下刚才挂载的data目录,是不是有东西。
不放心,再检查下容器服务
说明,mysql服务已经起来了。ps:这里我就不查看日志什么的,即便出错了。篇幅有限。偷懒:)
说了一大堆,下面才是重点 [由于我本地验证成功过了,所以下面就没有截图了,直接贴脚本]
1、设置mysql主从复制
(1) 配置master
进入msater的mysql容器,输入命令
docker exec -it mysql /bin/bash #mysql表示我刚才docker-compose里面设置的容器名称
登录mysql 控制台,帐号root 密码123456
mysql -uroot -p123456
创建用于主从复制的用户,并授权所有。(网上教程说,只需要同步的权限就可以,但是我操作的时候会发现一大堆同步日志错误,各种没权限等,有没有大侠指明原因出在哪里)
set sql_log_bin =0;
create user 'rpl_user'@'%' identified by '123456';
grant all privileges on *.* to 'rpl_user'@'%';
#grant replication slave on *.* to 'rpl_user'@'%' ;
set sql_log_bin =1;
change master to master_user ='rpl_user', master_password ='123456' for channel 'group_replication_recovery';
flush privileges;
install plugin group_replication soname 'group_replication.so'; #安装group replication plugin
show plugins;
set global group_replication_bootstrap_group=on;
start group_replication;
set global group_replication_bootstrap_group=off;
锁库,不让数据再进行写入动作,这个命令在结束终端会话的时候会自动解锁
flush tables with read lock;
重置下master状态,这点有争议,其他教程是先查询master状态,show master status; 然后在通过制定日志位置去同步。
reset master;
(2)配置slave
同样进入mysql控制台,然后
#从节点
reset master;
set sql_log_bin =0;
create user 'rpl_user'@'%' identified by '123456';
grant all privileges on *.* to 'rpl_user'@'%';
#grant replication slave on *.* to 'rpl_user'@'%' ;
set sql_log_bin =1;
change master to master_user ='rpl_user', master_password ='123456' for channel 'group_replication_recovery';
flush privileges;
install plugin group_replication soname 'group_replication.so'; #安装group replication plugin
#show plugins;
change master to
master_host='192.168.100.100',
master_user='rpl_user',
master_password='123456',
master_log_file='mysql-bin.000001',
master_log_pos=0;
start group_replication;
start slave;
于是乎,差不多整个过程就是这样了。可能会遇到一些异常,只能一个一个踩坑解决了,主要是开头注意事项的那些吧。比如server_id一样、同步用户的权限不足、slave上同步的日志异常。
参考文章:https://blog.csdn.net/wang_jingj/article/details/53931237
http://www.cnblogs.com/xinysu/p/6674832.html
https://www.jianshu.com/p/fed36ba15b01
https://blog.csdn.net/boling_cavalry/article/details/79747488
https://blog.csdn.net/wang_jingj/article/details/53931237