实验设备:
两台ECS服务器
系统:centos8-stream
主节点直接在一台服务器运行,mysql版本8.0.26
备节点一台服务器中使用docker运行,mysql镜像版本mysql:8.0-oracle

在主节点修改/etc/my.cnf配置文件

[mysqld]

# 服务器绑定ip,可以省略
# bind-address = 172.16.0.100


# 节点id,是唯一的,不能重复
server-id = 1


# 日志
log_bin = /var/log/mysql/mysql-bin.log

expire_logs_days = 10

max_binlog_size = 100M


# 要同步的数据库,可以写多行,同步多个数据库
binlog_do_db = DB_NAME


# 不同步的数据库
# binlog_ignore_db = DB_NAME


# binlog的格式,row具有statement和mixed不具备的优势
binlog_format = row

sync_binlog = 1


# 和sync_binlog 组成双1配置保证数据的完整性
innodb_flush_log_at_trx_commit = 1

重启主节点mysql服务器

systemctl restart mysqld

登入主节点mysql服务器创建同步用的账户和查询二进制日志和偏移量值

# 登录mysql服务器
mysql -uroot -p

# 创建账号,这里的ip是备节点的ip
CREATE USER 'slave1'@'172.16.0.100' IDENTIFIED BY '123456';

# 添加授权
grant replication slave on *.* to 'slave1'@'172.16.0.100';

# 查询主节点的日志和偏移量值
show master status;

# 关闭自动提交事务
set autocommit=0;

登录备节点的docker容器,修改/etc/my.cnf

创建mysql-server容器
docker run --name 容器名称 -e MYSQL_ROOT_PASSWORD=数据库root密码 -p 3306:3306 mysql:8-oracle

# 登入docker服务
docker exec -it 容器ID /bin/bash

# 修改my.cnf文件,备节点只需添加server-id即可,由于容器内没有编辑器,使用sed命令修改,主节点是1,备节点用2
sed -i '5a server-id=2' /etc/my.cnf

[mysqld]
# 节点id,是唯一的,不能重复
server-id = 2

重启备节点的mysql服务器

# 由于是在容器内,只能通过重启容器的方式来重启mysql服务器,使用exit退出容器
docker restart 容器id

登入容器的mysql-server

# 配置备节点的信息,在mysql-cli执行以下语句

CHANGE MASTER TO
MASTER_HOST='主节点ip',
MASTER_USER='slave1',
MASTER_PASSWORD='123456',
# 主节点查询到的file的值
MASTER_LOG_FILE='mysql-bin.000003',
# 在主节点查询到position 值
MASTER_LOG_POS=154;

启动slave线程

# 启动slave线程
start slave;

# 如果要更该配置节点信息,需要先停止slave线程
stop slave;

检查主节点状态

# 在mysql-cli执行以下语句,command的值为Binlog Dump即为正常
show processlist;

检查备节点状态,Slave_IO_Running 和 Slave_SQL_Running 两个值为YES即为正常

# 在mysql-cli执行以下语句
show slave status;