主要基于mysql的二进制文件来进行主从复制
服务器准备(一台服务器,自己电脑也行,我用的阿里云服务器,ip地址我就用127.0.0.1代替了)
主服务器master:127.0.0.1
从服务器slave:127.0.0.1
1.下载docker 并安装docker-compose
2.新建文件夹如下
说明:
master相关文件夹(这几个是容器挂载的):
conf-master (mysql配置文件) data-master(mysql数据卷) logs-master(mysql日志文件)
slave相关文件夹(这几个是容器挂载的):
conf-slave (mysql配置文件) data-slave(mysql数据卷) logs-slave(mysql日志文件)
docker-compose.yml 配置文件
3.docker-compose.yml配置如下(这里是用了mysql5.7的数据库)
version: "2"
services:
mysql-master:
image: mysql:5.7
ports:
- 8406:3306
volumes:
- ./conf-master:/etc/mysql/conf.d
- ./data-master:/var/lib/mysql
- ./conf-master:/etc/mysql/mysql.conf.d
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: db
MYSQL_USER: user
MYSQL_PASSWORD: user123
restart: always
container_name: mysql-master
mysql-slave:
image: mysql:5.7
ports:
- 8407:3306
volumes:
- ./conf-slave:/etc/mysql/conf.d
- ./data-slave:/var/lib/mysql
- ./conf-slave:/etc/mysql/mysql.conf.d
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: db
MYSQL_USER: user
MYSQL_PASSWORD: user123
restart: always
container_name: mysql-slave
4.启动docker-compose
docker-compose up -d
5.查看容器启动情况
如果没有启动成功 docker-logs 容器id 进行定位
客户端登陆是否正常
6.配置主从
配置主从服务器
分别在conf-master 和conf-slave下建立my.cnf
配置分别如下:
[mysqld]
server-id=1
log-bin=mysql-bin
binlog_format=MIXED
max_binlog_size = 124M
expire_logs_days = 3
binlog_ignore_db = mysql,performance_schema,information_schema,sys
[mysqld]
server_id = 2
log_bin = mysql-bin
binlog_format=MIXED
max_binlog_size = 124M
expire_logs_days = 3
replicate-ignore-db=mysql,performance_schema,information_schema,sy
relay_log_recovery = 1
log_slave_updates = 1
编辑好后分别重启对应容器
在客户端查看master的主从状态
查看主库的状态:show master status;
然后在Master数据库创建数据同步用户 (创建好后我用root用户也可以同步成功)
mysql->grant replication slave on *.* to 'slave'@'%' identified by '123456';
7.从服务器执行如下sql,连接master,其实是在读master的文件日志来同步数据
change master to
master_host='127.0.0.1',
master_user='slave',
master_password='123456',
master_port=8406,
master_log_file='mysql-bin.000001',
master_log_pos= 0,
master_connect_retry=30;
命令说明:
master_host :Master的地址,指的是容器的独立ip,可以通过docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称|容器id查询容器的ip
master_port:Master的端口号,指的是容器的端口号
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
8.在Slave 中的mysql终端执行
show slave status;
用于查看主从同步状态。
从库使用sql,开启主从复制过程,然后再次查询主从同步状态:
start slave;
查看从状态
show slave status;
SlaveIORunning 和 SlaveSQLRunning 都是Yes,说明主从复制已经开启。此时可以测试数据同步是否成功。