最近在看Mysql 的书籍所以刚好有时间就弄一下,Mysql 主从复制的部分,搭建起来有点麻烦,所以刚刚用了Docker 来做,这样就只需要开多个Mysql 容器就好了,不需要弄多台服务器了。这里已 Mysql 5.6的版本来做
Docker 下载 Mysql:5.6镜像:
docker pull mysql:5.6
查看镜像:
docker images
systemctl status firewalld #检查防火墙状态
systemctl stop firewalld *# 关闭防火墙
启动主容器,当前Mysql 容器用来做主数据库服务器
docker run -d --name master -p 3307:3306 -eMYSQL_ROOT_PASSWORD=root mysql:5.6
主数据库服务器 端口使用 3307 避免与3306冲突,用户名密码都是 root
查看容器是否启动成功:
docker ps -a
进入Mysql 容器中:
docker exec -it master /bin/bash
进入Mysql 里面创建复制的账户:
mysql -uroot -p
输入密码 root
创建用于复制的账户:
grant replication slave on . to ‘wanger’@’%’ identified by ‘wanger’;
flush privileges;
这里要注意的一个点就是,因为我们当前版本是5.6所以创建账户和授权是可以一起这么写的,如果是8.0就不能这么去写,就的分开去写。
修改Mysql 配置文件,配置主服务器的servier id,这里由于是docker 容器里面,不能使用 vim 或者vi编辑,我们必须把配置文件拷贝到宿主机中修改,修改成功后,在拷贝进docker 容器里面:
docker cp master:/etc/mysql/mysql.conf.d/mysqld.cnf /usr/local/mysql/master/my.cnf
这里要注意一定要在容器外面拷贝,也就是宿主机中,然后拷贝的目录一定要先自己创建好 mysql/master 这个目录,不然无法拷贝成功
修改my.cnf 文件
vi mysql.cnf
添加:
log-bin=mysql-bin
server-id=1
编辑成功后,在拷贝进容器中
docker cp /usr/local/mysql/master/my.cnf master:/etc/mysql/mysql.conf.d/mysqld.cnf
重启容器:
docker restart master
配置完成后,进入到 mysql 容器中执行命令查看是否生效
Show master status;
主服务器到这里就配置成功了,接下来就配置从服务器,从服务器和上面的大致是一样的套路
启动 slave 容器:
docker run -d --name slave -p 3308:3306 -eMYSQL_ROOT_PASSWORD=root mysql:5.6
同样的配置,需要修改mysql文件,这里还是用拷贝的方式去做
docker cp slave:/etc/mysql/mysql.conf.d/mysqld.cnf /usr/local/mysql/master/my.cnf
修改配置文件:
log-bin=mysql-bin
server-id=2
在拷贝进容器中:
docker cp /usr/local/mysql/master/my.cnf slave:/etc/mysql/mysql.conf.d/mysqld.cnf
重启容器和上面的命令一样的
进入从服务器容器中:
docker exec -it slave /bin/bash
mysql -uroot -p
进入之后,设置 从服务器去哪里关联 主服务器 做到 主从数据之间的关联也就是数据复制:
CHANGE MASTER TO
MASTER_HOST=ip,
MASTER_PORT=3307,
MASTER_USER=‘wanger’,
MASTER_PASSWORD=‘wanger’,
MASTER_LOG_FILE=‘mysql-bin.000001’,
MASTER_LOG_POS=0;
START SLAVE;
上面可以解释下 MASTER_HOST 是主服务器的ip地址 MASTER_PORT 主服务器的端口 MASTER_USER 主服务器创建的用户名 MASTER_PASSWORD 密码
MASTER_LOG_FILE 在主服务器看到 值 MASTER_LOG_POS 从0条开始拷贝
START SLAVE 开启复制
查看从服务器的状态:
show slave status
如果都是yes说明就对了,这里不对的原因有几点就是 防火墙要提前关闭
或者大家可以查看 docker 日志去排除问题:
docker logs slave -f
如果都是yes的话,那么在主服务器上面创建数据库,在从服务器刷新就能看到当前数据库了。