基于docker 搭建mysql8.0 主从复制

435 阅读2分钟

创建mysql持久化目录

mkdir -p /data/mysql-slave-node1/data
mkdir -p /data/mysql-slave-node2/data
mkdir -p /data/mysql-master-node/data

创建配置文件

my.cnf 更多配置可参考dev.mysql.com/doc/refman/…

[mysqld]
# 禁用主机名缓存
skip-host-cache
# 禁用DNS主机名查找
skip-name-resolve
# 持久化目录
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
# serverID 每个mysql节点唯一,注意修改
server-id=1

从服务的配置增加如下配置

# 切记从服务配置
read_only = 1 
relay_log_purge = 0

搭建mysql主节点

mysql镜像版本可以选择 5.65.78.0, or latest

docker run --name=mysql-master-node \
-p 33061:3306 \
-v /etc/localtime:/etc/localtime:ro \
-v /data/mysql-master-node/my.cnf:/etc/my.cnf \
--mount type=bind,src=/data/mysql-master-node/data,dst=/var/lib/mysql \
-d mysql/mysql-server:8.0 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci

搭建mysql从节点1

docker run --name=mysql-slave-node1 \
-p 33062:3306 \
-v /etc/localtime:/etc/localtime:ro \
-v /data/mysql-slave-node1/my.cnf:/etc/my.cnf \
--mount type=bind,src=/data/mysql-slave-node1/data,dst=/var/lib/mysql \
-d mysql/mysql-server:8.0 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci

搭建mysql从节点2

docker run --name=mysql-slave-node2 \
-p 33063:3306 \
-v /etc/localtime:/etc/localtime:ro \
-v /data/mysql-slave-node2/my.cnf:/etc/my.cnf \
--mount type=bind,src=/data/mysql-slave-node2/data,dst=/var/lib/mysql \
-d mysql/mysql-server:8.0 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci

每个节点执行以下命令 修改默认密码

获取初始密码

# 从日志中获取 初始密码
# 查看日志中password的字段
docker logs mysql-master-node 
# 或者
docker logs mysql-master-node 2>&1 | grep GENERATED
  • 如下:
2022-02-02T14:05:36.319858Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: /var/run/mysqld/mysqlx.sock
Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
[Entrypoint] GENERATED ROOT PASSWORD: 70%6E^j2,x%.yoti_HehG;2p*65bAzz5


#进入容器
 docker exec -it mysql-master-node mysql -uroot -p'密码'
 
#修改密码 
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';

#创建用户
CREATE USER 'master_user'@'%' IDENTIFIED BY 'password';

#授权远程访问
grant all on *.* to 'master_user'@'%';

开放端口:

firewall-cmd  --zone=public --add-port=33061/tcp -permanent 
firewall-cmd  --reload 

查看主库状态

SHOW MASTER STATUS;

image.png

配置从库

在从库执行如下sql

CHANGE MASTER TO
MASTER_HOST='xx.xx.xx.xx',
MASTER_PORT=33061,
MASTER_USER='master_user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='binlog.000002',
MASTER_LOG_POS=1757;


从库开启同步服务、查看状态

-- 开启从服务
start slave;
--查看从服务状态
show slave status;

image.png

参考文献

  1. dev.mysql.com/doc/refman/…