一、MySQL主从复制的原理
所以,可以认为复制大致有三个步骤:
- 数据修改写入master数据库的binlog中。
- slave的IO线程复制这些变动的binlog到自己的relay log中。
- slave的SQL线程读取并重新应用relay log到自己的数据库上,让其和master数据库保持一致。
二、实现简单的一主一丛
1.首先拉取docker镜像,我们这里使用latest版本的mysql:
docker pull mysql:latest
2.然后使用此镜像启动容器,这里需要分别启动主从两个容器
#启动主库
docker run -p 3339:3306 --name mysql_master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
#启动从库
docker run -p 3340:3306 --name mysql_slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
Master对外映射的端口是3339,Slave对外映射的端口是3340。因为docker容器是相互独立的,每个容器有其独立的ip,所以不同容器使用相同的端口并不会冲突。这里我们应该尽量使用mysql默认的3306端口,否则可能会出现无法通过ip连接docker容器内mysql的问题。
3.配置Master(主) 开启bin-log和创建从库链接账号和权限
3.1复制mysql主服务器的配置文件到宿主机
docker cp mysql_master:/etc/my.cnf /tmp/
3.2修改配置文件内容,开启bin-log日志
[mysqld]
## 同一局域网内注意要唯一
server-id=100
## 开启二进制日志功能(关键)
log-bin=mysql-bin
3.3复制刚才宿主机的配置文件信息覆盖docker容器配置文件信息
docker cp /tmp/my.cnf mysql_master:/etc/my.cnf
3.4重启mysql-master容器
docker restart mysql_master
3.5进入到容器内部,给从数据库创建链接的账号密码
通过docker exec -it mysql_master /bin/bash
命令进入到Master容器内部,也可以通过docker exec -it mysql_masterr /bin/bash
命令进入。33a98dea92e5
是容器的id,而mysql_master
是容器的名称。
下一步在Master数据库创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
4.配置Slave(从) 链接主库
4.1和配置Master(主)一样,在Slave配置文件my.cnf中添加如下配置:
docker cp mysql_slave:/etc/my.cnf /tmp/
4.2修改配置文件内容
[mysqld]
server-id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
4.3复制刚才宿主机的配置文件信息覆盖docker容器配置文件信息
docker cp /tmp/my.cnf mysql_slave:/etc/my.cnf
4.4重启mysql-slave容器
docker restart mysql_slave
5.链接Master(主)和Slave(从)
5.1在Master进入mysql,执行show master status
;
File和Position字段的值后面将会用到,在后面的操作完成之前,需要保证Master库不能做任何操作,否则将会引起状态变化,File和Position字段的值变化。
5.2 查看Master的容器ip
docker inspect mysql_master
5.3在Slave 中进入 mysql,链接Master
change master to master_host='172.17.0.12', master_user='slave', master_password='123456', master_port=3339, master_log_file='mysql-bin.000001', master_log_pos=880, master_connect_retry=30;
5.4查看主从配置状态
在Slave 中的mysql终端执行show slave status \G;用于查看主从同步状态。
5.5启动主从复制
正常情况下,SlaveIORunning 和 SlaveSQLRunning 都是No,因为我们还没有开启主从复制过程。使用
start slave
开启主从复制过程,然后再次查询主从同步状态show slave status \G;。
SlaveIORunning 和 SlaveSQLRunning 都是Yes,说明主从复制已经开启。此时可以测试数据同步是否成功。
6.遇到问题排错分析
使用start slave开启主从复制过程后,如果SlaveIORunning一直是Connecting,则说明主从复制一直处于连接状态,这种情况一般是下面几种原因造成的,我们可以根据 Last_IO_Error提示予以排除。
6.1网络不通
检查ip,端口
6.2密码不对
检查是否创建用于同步的用户和用户密码是否正确
6.3pos不对
检查Master的 Position
6.4如果容器ip访问不到可以尝试使用公网ip
如果是linux服务器需要开放对应的端口号