1.容器配置

master容器
docker run -it -d -p 8888:3306 —name master —net zeng_net -e MYSQL_ROOT_PASSWORD=root zengtest
IP:222.20.0.2

slave容器
docker run -it -d -p 9999:3306 —name slave —net zeng_net -e MYSQL_ROOT_PASSWORD=root1234 zengtest
IP:222.20.0.3**

2.主机配置

1.修改配置文件
vi /etc/mysql/my.cnf
log-bin = mysql-bin #开启二进制日志
server-id =1
innodb-file-per-table =ON
skip_name_resolve=ON

修改完后重启容器

2.查看binlog状态
show global variables like “%log%”;
image.png
3.查看主机binlog
show master logs;
image.png
log_name和file_size的值是主备连接的锚点,后续配置会用到。

4.在主机创建用户
use mysql;
创建用户:
create user ‘repluser’@’222.20.0.3’ IDENTIFIED BY ‘replpass’;
授权:
grant all on . to ‘repluser’@’222.20.0.3’;
实际上只授权REPLIACTION SLAVE ,REOPLIATION CLIENT就可以,但是我执行一直报错,就用ALL了

grant replication slave, replication client on . to scalemon@’%’;
刷新:
flush privileges;

3.从机配置

1.修改配置文件
vi /etc/mysql/my.cnf
relay-log=relay-log
relay-log-index=relay-log.index
server-id=2
innodb_file_per_table=ON
skip_name_resolve=ON

2.查看中继日志状态
show global variables like “%log%”;
image.png
3.建立链接
CHANGE MASTER TO MASTER_HOST=’**222.20.0.2‘,MASTER_USER=’repluser‘,MASTER_PASSWORD=’replpass‘, MASTER_LOG_FILE=’mysql-bin.000003‘,MASTER_LOG_POS=2859**;
**
4.启动
start slave;
5.状态
show slave status\G;
image.png image.png

复制过程:

主节点必须启用二进制日志,记录任何修改了数据库数据的事件。
从节点开启一个线程(I/O Thread)把自己扮演成 mysql 的客户端,通过 mysql 协议,请求主节点的二进制日志文件中的事件
主节点启动一个线程(dump Thread),检查自己二进制日志中的事件,跟对方请求的位置对比,如果不带请求位置参数,则主节点就会从第一个日志文件中的第一个事件一个一个发送给从节点。
从节点接收到主节点发送过来的数据把它放置到中继日志(Relay log)文件中。并记录该次请求到主节点的具体哪一个二进制日志文件内部的哪一个位置(主节点中的二进制文件会有多个,在后面详细讲解)。
从节点启动另外一个线程(sql Thread ),把 Relay log 中的事件读取出来,并在本地再执行一次。

坑:

1.master主机的binlog状态一定要最新的,否则需要重新设置连接然后重启slave
2.密码状态为aching_sha2_password时连接也不成立
ALTER USER ‘用户名’@’slave机器地址’ IDENTIFIED WITH mysql_native_password BY ‘与连接中的密码一致’;