为什么基于Docker搭建?

  • 资源有限
  • 虚拟机搭建对机器配置有要求,并且安装mysql步骤繁琐
  • 一台机器上可以运行多个Docker容器
  • Docker容器之间相互独立,有独立ip,互不冲突
  • Docker使用步骤简便,启动容器在秒级别

利用Docker搭建主从服务器(一主一从)

1、拉取镜像,以mysql 5.7版本为例

docker pull mysql:5.7

2、创建主机

docker run -p 3307:3306 --name mysql-master \
-v /usr/local/docker_data/mysql-master/log:/var/log/mysql \
-v /usr/local/docker_data/mysql-master/data:/var/lib/mysql \
-v /usr/local/docker_data/mysql-master/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
--privileged=true \
-d mysql:5.7

3、创建从机

docker run -p 3308:3306 --name mysql-slave \
-v /usr/local/docker_data/mysql-slave/log:/var/log/mysql \
-v /usr/local/docker_data/mysql-slave/data:/var/lib/mysql \
-v /usr/local/docker_data/mysql-slave/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
--privileged=true \
-d mysql:5.7

4、查看是否启动成功

image.png


5、修改配置文件

由于docker创建的myql下没有my.cnf文件,所以需要先创建my.cnf文件

/usr/local/docker_data/mysql-master/conf
touch my.cnf
vim my.cnf

对主机的my.cnf进行修改

[mysqld]
## 同一局域网内注意要唯一
server-id=100  
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
#不同步的二进制数据库,如果不设置可以将其注释掉
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=personalsite
binlog-ignore-db=test

同样需要对从机的my.cnf配置文件进行修改

/usr/local/docker_data/mysql-slave/conf
touch my.cnf
vim my.cnf

从机的my.cnf,【必须】从服务器唯一ID

[mysqld]
## 设置server_id,注意要唯一
server-id=101  
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin   
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
#不同步的二进制数据库,如果不设置可以将其注释掉
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=personalsite
binlog-ignore-db=test  

6、重启主机和从机

docker restart mysql-master
docker restart mysql-slave

并docker ps检查容器是否启动,如果没有启动,绝大多数原因是配置文件中存在错误。

此时可以使用Navicat等工具测试连接mysql,方便后续操作的执行


7、链接Master(主)和Slave(从)

(1)链接主机mysql

(2)创建slave用户

创建用户名为slave,密码为123456的用户。并授予用户REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

(3)刷新权限

flush privileges;

(4)全局锁库锁表,防止master状态有变更

FLUSH TABLES WITH READ LOCK;

(5)查看master状态

show master status;

image.png
记录下 File 和 Position 的值

(6)查看主机mysql容器的ip地址

docker inspect mysql-master

image.png

(6)链接从机mysql

(7)设置从机链接主机

注意:这里是直接连接docker里面的ip,所以端口应该是3306 ,如果是连接外面的代理端口 则应该是 宿主机ip:3307

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=1385;

master_log_filemaster_log_pos 的值取上面 show master status; 的查询结果

master_log_pos 表示从某个点开始同步,如果需要同步之前的历史数据,需要找到对应的历史节点值

(8)从机开启复制功能

start slave;

(9)查询结果

show slave status;

主要看这两个值,如果 SlaveIORunning 和 SlaveSQLRunning 都是Yes 则表示连接成功,否则为失败
image.png
如果失败了可以看下面的日志提示
image.png

(10)重新配置主从连接

如果连接失败需要重新配置第(8)步,需要先停止复制功能
停止复制功能

stop slave

重置master

reset master

重新配置

change master to master_host='172.16.0.16', master_user='slave', master_password='123456', master_port=3307, master_log_file='mysql-bin.000001', master_log_pos=761;

启动复制功能

start slave

(11)如果连接成功,记得对主库进行解锁

UNLOCK TABLES;

解锁之后可以测试主从复制功能,在主机数据库创建表,插入数据,从机会自动同步
。。。。。。

(12)关闭主从复制功能

在从机mysql输入

stop slave;

参考博客:https://www.jianshu.com/p/4bd355925e06