原理
Mysql主从复制的实现原理图大致如下(来源网络):
主要步骤:
1.master将所有改变记录到二进制日志(binary log)中
2.slave通过一个工作线程-I/O线程读取master的二进制日志数据并写入到slave本地的中继日志中
3.sql线程读取中继日志,重放其中的时间并且更新slave的数据
基于Docker的Mysql主从复制
主服务器:192.168.126.101 从服务器:192.168.126.102
1、环境准备
拉取mysql镜像
docker pull mysql:5.7.23
mysql配置文件放入/data/docker/mysql/conf下
# 主库配置文件my.cnf
[mysqld]
log-bin = mysql-bin
server-id = 1
# 从库配置文件my.cnf
[mysqld]
log-bin = mysql-bin
server-id = 2
用的是docker-compose.yml,都映射3306端口
version: '3'
services:
mysql:
image: mysql:5.7.23
container_name: "mysql"
ports:
- "3306:3306"
volumes:
- "/data/docker/mysql/data/:/var/lib/mysql/"
- "/data/docker/mysql/conf/my.cnf:/etc/my.cnf"
environment:
- MYSQL_ROOT_PASSWORD=root
分别启动两个服务器mysql
docker-compose up -d
2、主库配置
master新建一个用户专门用于给slave同步二进制日志
CREATE USER 'slave_a' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* to 'slave_a' identified by '123456';
flush privileges;
查看主库状态,记住file和position
show master status;
3、从库配置
从库通过IO线程连接master,master_log_file就是主库状态的file,master_log_pos就是position
change master to master_host='192.168.126.101',
master_port=3306,
master_user='slave_a',
master_password='123456',
master_log_file='mysql-bin.XXXXXX',
master_log_pos= XXX;
start slave;
查看从库状态
show slave status
如果这两个值为Yes表示连接成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes