创建目录
#主节点目录
mkdir -p /home/data/master/mysql/
#从节点目录
mkdir -p /home/data/slave/mysql/
创建配置文件
# 主节点配置
touch /home/data/master/mysql/my.cnf
# 从节点配置
touch /home/data/slave/mysql/my.cnf
编辑配置文件
主节点配置文件
vim /home/data/master/mysql/my.cnf
[mysqld]
# 开启 binlog
log-bin=mysql-bin
binlog_format=row
#server_id不要重复
server-id=1
从节点配置文件
vim /home/data/slave/mysql/my.cnf
[mysqld]
# 开启 binlog
log-bin=mysql-bin
binlog_format=row
#server_id不要重复
server-id=2
部署节点
部署主节点
docker run \
-p 3307:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /home/data/master/mysql/conf:/etc/mysql/conf.d \
-v /home/data/master/mysql/data:/var/lib/mysql:rw \
-v /home/data/master/mysql/my.cnf:/etc/mysql/my.cnf \
--name mysql_master \
--restart=always \
-d mysql:8.0
部署从节点
docker run \
-p 3308:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /home/data/slave/mysql/conf:/etc/mysql/conf.d \
-v /home/data/slave/mysql/data:/var/lib/mysql:rw \
-v /home/data/slave/mysql/my.cnf:/etc/mysql/my.cnf \
--name mysql_slave \
--restart=always \
-d mysql:8.0
配置权限
主节点执行
-- 创建slave用户
CREATE USER 'demo_slave'@'%';
-- 设置密码
ALTER USER 'demo_slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456789';
-- 授予复制权限
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'demo_slave'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
主节点执行命令
SHOW MASTER STATUS;
该命令会返回以下信息:
名称 | 说明 |
---|---|
File | 当前正在写入的二进制日志文件名 |
Position | 当前正在写入的二进制日志文件的位置 |
Binlog_Do_DB | 指定需要写入二进制日志的数据库名 |
Binlog_Ignore_DB | 指定不需要写入二进制日志的数据库名 |
配置从库读取主节点配置
change master to master_host='主节点ip', master_user='demo_slave', master_password='123456789', master_port=3307, master_log_file='mysql-bin.000003', master_log_pos=2023, master_connect_retry=30;
参数说明
参数 | 说明 |
---|---|
master_port | Master的端口号,指的是容器的端口号 |
master_user | 用于数据同步的用户 |
master_password | 用于同步的用户的密码 |
master_log_file | 指定Slave从哪个日志文件开始复制数据,即上文中提到的File字段的值 |
master_log_pos | 从哪个Position开始读,即上文中提到的Position字段的值 |
master_connect_retry | 如果连接失败,重试的时间间隔,单位是秒,默认是60秒 |
设置从数据库开启主从服务
start slave;
查询下当前从服务器的状态
show slave status;
Slave_IO_Running
和Slave_SQL_Running
都是Yes
就成功了,可以进行测试一下