拉取mysql镜像
docker pull mysql:5.7
master
- 3306端口前面的端口是容器映射到宿主机的端口,外部访问端口
- 映射端口时注意端口不要冲突
docker run -p 3339:3306 --name main_mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
slave
docker run -p 3340:3306 --name slave_mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
- 查询启动两个mysql容器
- 可以通过本地的navicat等可视化工具测试连接数据库,检测容器是否启动成功,我这里用的pycharm的连接mysql数据库插件连接的
- Host 服务器公网IP
- 账号 root
- 密码是创建容器时的密码
- 端口是容器映射的端口
docker ps
配置Master(主)
- 通过
docker exec -it eada490abf5f /bin/bash
命令进入到Master容器内部,也可以通过docker exec -it main_mysql /bin/bash
命令进入。eada490abf5f是容器的id,而main_master是容器的名称。 cd /etc/mysql
切换到/etc/mysql目录下,然后vim my.cnf
对my.cnf进行编辑。此时会报出bash: vi: command not found,需要我们在docker容器内部自行安装vim。使用apt-get install vim命令安装vim
- 刚刚进入的容器没有vim编辑器,这时可能又会报错
- 需要更新一下软件包
apt-get update
- 更新完毕之后,再次安装vim编辑器
apt-get install vim
[mysqld]
## 同一局域网内注意要唯一
server-id=100
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
- 配置完成之后,需要重启mysql服务使配置生效。在当前容器中,使用
service mysql restart
完成重启。重启mysql服务时会使得docker容器停止,我们还需要docker start main_mysql
启动容器。 - 下一步在Master数据库创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。
docker exec -it main_mysql
进入容器- 连接数据库
mysql -u root -p 123456
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
配置从数据库slaveMySQL - 基本操作和主数据库一样
- 修改从数据库的my.cnf配置文件
[mysqld]
## 设置server_id,注意要唯一
server-id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
-
配置完成后也需要重启mysql服务和docker容器,操作和配置Master(主)一致。
连接Master(主)和Slave(从) -
在Master进入mysql,执行
show master status;
-
File和Position字段的值后面将会用到,在后面的操作完成之前,需要保证Master库不能做任何操作,否则将会引起状态变化,File和Position字段的值变化。
-
master_host查询 后面跟容器名字或者容器ID
docker inspect --format='{{.NetworkSettings.IPAddress}} main_mysql
-
在Slave 中进入 mysql,执行
change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 617, master_connect_retry=30;
-
master_port:Master的端口号,指的是容器的端口号
-
master_user:用于数据同步的用户
-
master_password:用于同步的用户的密码
-
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
-
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
-
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
-
在从数据库查询从数据库状态
show slave status \G;
- 此时这两状态都是NO
- Slave_IO_Running: No
- Slave_SQL_Running:No
-
因为此时从数据库还未开启主从服务
start slave;
开启数据库主从服务
show slave status \G;
不出意外主从配置成功
-
测试主从
-
连接主数据库,创建数据库
-
连接从数据库查询
没问题,docker中mysql主从配置成功!
可能在最后一步会报错!我在这个错误上被折磨了一个多小时!!!
- 报错问题
- 出现报错,先在从数据库停掉数据库主从服务
stop slave;
- 网络错误(这个几乎可以排除,可能性比较低,解决办法ping 一下看是不是网络错误)
- pos值错误(重新查询一些master信息
show master status
) - 密码错误(检查在使用grant命令时是不是密码串中多了空格,这个可能性也比较大)
- 没有查询master_host的IP
master_host的ip不是服务器ip,是主数据库的docker容器的ip,通过上面说过的 docker inspect命令查询,我就忘记了查询,直接写出服务器的ip,导致主从配置一直无法成功!
- 解决之后,在充从数据库重启数据库主从服务
start salve
- 之后查询状态