文章目录
1. 配置文件准备
文件整体框架如下
1.1 主机(master)配置文件
vim master/conf/my.cnf
[mysqld]
## 同一局域网内注意要唯一
server-id=100
## 开启二进制日志功能,可以随便取(关键)
log-bin=master-bin
binlog-format=ROW // 二级制日志格式,有三种 row,statement,mixed
## binlog-do-db=数据库名 //同步的数据库名称,如果不配置,表示同步所有的库
1.2 从机(slave)配置文件
vim slave/conf/my.cnf
[mysqld]
## 设置server_id,注意要唯一
server-id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
1.3 docker-compose.yml文件
ps : docker需要下载mysql:8.0.25的镜像文件
# yaml 配置
version: "3.7"
services:
mysql-master:
image: "mysql:8.0.25"
ports:
- "33000:3306"
command: "--default-authentication-plugin=mysql_native_password "
container_name: mysql-master
environment:
MYSQL_ROOT_PASSWORD: "1314"
volumes:
- ./master/mysql_data:/var/lib/mysql
- ./master/conf:/etc/mysql/conf.d
mysql-slaver:
image: "mysql:8.0.25"
ports:
- "33001:3306"
command: "--default-authentication-plugin=mysql_native_password "
container_name: mysql-slaver
environment:
MYSQL_ROOT_PASSWORD: "1314"
volumes:
- ./slave/mysql_data:/var/lib/mysql
- ./slave/conf:/etc/mysql/conf.d
注释版本
# yaml 配置
version: "3.7"
services:
mysql-master: //主机
image: "mysql:8.0.25"
ports:
- "33000:3306" //外端口为33000
command: "--default-authentication-plugin=mysql_native_password "
container_name: mysql-master //容器名字
environment:
MYSQL_ROOT_PASSWORD: "1314"
volumes: //数据卷本地持久化
- ./master/mysql_data:/var/lib/mysql
//容器内数据库数据存储路径为master/mysql_data,如果不存在会自动创建
- ./master/conf:/etc/mysql/conf.d
//容器内配置文件路径为master/conf下的my.cnf
mysql-slaver: //从机设置,同上
image: "mysql:8.0.25"
ports:
- "33001:3306"
command: "--default-authentication-plugin=mysql_native_password "
container_name: mysql-slaver
environment:
MYSQL_ROOT_PASSWORD: "1314"
volumes:
- ./slave/mysql_data:/var/lib/mysql
- ./slave/conf:/etc/mysql/conf.d
1.4 启动mysql
docker-compose up -d
2. 主机操作
2.1 进入容器
//进去容器终端
docker exec -it mysql-master /bin/bash
//登陆数据库
mysql -uroot -p1314
2.2 创建slave用户
mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
Query OK, 0 rows affected (0.00 sec)
在Master数据库创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。
2.3 获取master status
show master status
这里的file和position值会在从机中用到。
如果下面从机连接有问题,可以输入下面指令刷新日志,获取新状态
flush logs;
2.4 获取主机ip
docker inspect mysql-master |grep IPAddress
ip地址同样也是从机需要的
3. 从机操作
3.1 进入容器
//进去容器终端
docker exec -it mysql-slaver /bin/bash
//登陆数据库
mysql -uroot -p1314
3.2 设置连接主机参数
change master to master_host='172.23.0.2',
master_user='slave',
master_password='123456',
master_port=3306,
master_log_file='master-bin.000001',
master_log_pos= 156,
master_connect_retretry=30;
命令参数说明:
master_host :Master的地址,指的是容器的独立ip.
master_port:Master的端口号,指的是容器的端口号
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
3.3 开启主从复制
//开启主从模式
start slave;
//查看从机连接状态
show slave status \G;
连接成功如图所示:
如果Slave_IO_Running显示no或者connecting,检查:
1.file文件和position位置是否准确写入,可以尝试刷新日志操作
2.主机网络ip地址和端口是否正确
3.检查主机设置的slaver密码是否正确
4.检查Last_IO_Error_Timestamp字段报错信息
4. 测试主从复制
主机新建数据库
新建表并插入数据
mysql> create database test;
Query OK, 1 row affected (0.02 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.03 sec)
新建表并插入数据
mysql> use test;
Database changed
mysql> create table mytbl(
-> id varchar(16),
-> name varchar(32));
Query OK, 0 rows affected (0.08 sec)
mysql> insert into mytbl value(1,"jack");
Query OK, 1 row affected (0.02 sec)
mysql> select* from mytbl;
+------+------+
| id | name |
+------+------+
| 1 | jack |
+------+------+
1 row in set (0.00 sec)
mysql>
检查从机
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.00 sec)
mysql> use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| mytbl |
+----------------+
1 row in set (0.00 sec)
mysql> select* from mytbl;
+------+------+
| id | name |
+------+------+
| 1 | jack |
+------+------+
1 row in set (0.00 sec)
mysql>
如图所示结果,主从复制设置成功!