Bootstrap

docker 搭建 mysql 主从

Docker 搭建MySQL 主从

# 拉取mysql 镜像
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/mysql:8.0.29
docker tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/mysql:8.0.29  docker.io/library/mysql:8.0.29
docker rmi -f swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/mysql:8.0.29

# 创建对应目录
mkdir -p /data/mysql/master/{conf,data}
mkdir -p /data/mysql/slave1/{conf,data}
mkdir -p /data/mysql/slave2/{conf,data}

#  启动 mysql 主服务器 端口 3306
docker run -d \
-p 3306:3306 \
-v /data/mysql/master/conf:/etc/mysql/conf.d \
-v /data/mysql/master/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
--name test-mysql-master \
mysql:8.0.29


#  启动 mysql 从1服务器 端口 3307
docker run -d \
-p 3307:3306 \
-v /data/mysql/slave1/conf:/etc/mysql/conf.d \
-v /data/mysql/slave1/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
--name test-mysql-slave1 \
mysql:8.0.29


#  启动 mysql 从1服务器 端口 3308
docker run -d \
-p 3308:3306 \
-v /data/mysql/slave2/conf:/etc/mysql/conf.d \
-v /data/mysql/slave2/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
--name test-mysql-slave2 \
mysql:8.0.29

创建配置文件

# my.cnf(或my.ini)
# test-mysql-master 容器
vi /data/mysql/master/conf/my.cnf

[mysqld]
# 服务器唯一id,默认值为1
server-id=1
# 设置日志格式,默认值ROW
binlog_format=STATEMENT
# 二进制日志名,默认binlog
log-bin=binlog
# 设置需要复制的数据库,默认复制全部数据库
#binlog-do-db=mytestdb
# 设置不需要复制的数据库
#binlog-ignore-db=mysql
#binlog-ignore-db=infomation_schema

# 重启容器
docker restart test-mysql-master


# test-mysql-slave1 容器
vi /data/mysql/slave1/conf/my.cnf
[mysqld]
# 服务器唯一id,默认值为1
server-id=2

# 重启容器
docker restart test-mysql-slave1



# test-mysql-slave2 容器
vi /data/mysql/slave2/conf/my.cnf
[mysqld]
# 服务器唯一id,默认值为1
server-id=3

# 重启容器
docker restart test-mysql-slave2

进入容器

# test-mysql-master 容器
# 设置字符集
docker exec -it test-mysql-master env LANG=C.UTF-8 /bin/bash

# 进入容器内的mysql命令行
mysql -uroot -proot

# 修改默认密码校验方式
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';


# test-mysql-slave1 容器
docker exec -it test-mysql-slave1 env LANG=C.UTF-8 /bin/bash

# 进入容器内的mysql命令行
mysql -uroot -proot

# 修改默认密码校验方式
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';


# test-mysql-slave2 容器
docker exec -it test-mysql-slave2 env LANG=C.UTF-8 /bin/bash

# 进入容器内的mysql命令行
mysql -uroot -proot

# 修改默认密码校验方式
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';

创建用户

# test-mysql-master 容器 操作即可
docker exec -it test-mysql-master env LANG=C.UTF-8 /bin/bash
mysql -uroot -proot
# 创建 slave 用户
CREATE USER 'dongdong'@'%';

# 设置密码
ALTER USER 'dongdong'@'%' IDENTIFIED WITH mysql_native_password BY 'root';

# 赋予权限
GRANT REPLICATION SLAVE ON *.* TO 'dongdong'@'%';

# 刷新权限
FLUSH PRIVILEGES;

配置主从关系并启动

# 查看主服务器 二进制文件和偏移量
docker exec -it test-mysql-master env LANG=C.UTF-8 /bin/bash
mysql -uroot -proot
SHOW MASTER STATUS\G;

mysql> SHOW MASTER STATUS\G;
*************************** 1. row ***************************
             File: binlog.000004
         Position: 157
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

ERROR: 
No query specified

mysql> 


# 配置主从
# test-mysql-slave1 容器 操作
docker exec -it test-mysql-slave1 env LANG=C.UTF-8 /bin/bash
mysql -uroot -proot

CHANGE MASTER TO MASTER_HOST='192.168.224.128',
MASTER_USER='dongdong',MASTER_PASSWORD='root',MASTER_PORT=3306,
MASTER_LOG_FILE='binlog.000004',MASTER_LOG_POS=157;

# 启动
START SLAVE;
# 查看状态
SHOW SLAVE STATUS\G;

# test-mysql-slave2 容器 操作
docker exec -it test-mysql-slave2 env LANG=C.UTF-8 /bin/bash
mysql -uroot -proot

CHANGE MASTER TO MASTER_HOST='192.168.224.128',
MASTER_USER='dongdong',MASTER_PASSWORD='root',MASTER_PORT=3306,
MASTER_LOG_FILE='binlog.000004',MASTER_LOG_POS=157;

# 启动
START SLAVE;
# 查看状态
SHOW SLAVE STATUS\G;
;