1. 整体思路
- 主从库全局使用GTID的方式进行同步, 方便后续的主从切换
- 主从库全局使用mysql-bin日志
- 从库严格只读, root用户也不能写入
提示:
- 文中使用的IP, 端口, 密码等, 需要根据自己的环境配置等去替换,如10.1.12.12是我本地的内网ip, 需要替换成你实际使用的服务器ip
2. 部署主库
2.1 docker-compose配置
docker-compose.yml
version: '3'
services:
mysql:
image: "mysql:8"
container_name: mysql8-0
restart: always
environment:
MYSQL_ROOT_PASSWORD: "123456"
TZ: "Asia/Shanghai"
volumes:
- "./data:/var/lib/mysql"
- "./conf/conf.d:/etc/mysql/conf.d"
ports:
- "13500:3306"
2.2 主库初始配置
my.cnf
[mysqld]
server-id=1
log-bin=mysql-bin
# GTID配置
gtid-mode=on
enforce-gtid-consistency=on
log-slave-updates=on
# docker容器使用的物理机IP,端口, 用于集群互通
report_host=10.1.12.12
report_host=13500
# 默认字符集
character-set-server=utf8mb4
# 默认存储引擎
default-storage-engine=INNODB
# 设置加密方式
default_authentication_plugin=mysql_native_password
# sql_mode
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
3. 部署两个从库
参考以下配置, 修改部分配置启动两个初始从库实例
2.1 docker-compose配置
docker-compose.yml
version: '3'
services:
mysql:
image: "mysql:8"
## 从库容器名,两个从库应不同
container_name: mysql8-1
restart: always
environment:
MYSQL_ROOT_PASSWORD: "123456"
TZ: "Asia/Shanghai"
volumes:
- "./data:/var/lib/mysql"
- "./conf/conf.d:/etc/mysql/conf.d"
ports:
## 从库端口
- "13501:3306"
2.2 从库初始化配置
my.cnf
[mysqld]
# 集群任意主从库的id不能一致
server-id=2
log-bin=mysql-bin
#GTID
gtid-mode=on
enforce-gtid-consistency=on
log-slave-updates=on
# 从库设为只读
read_only=on
#super_read_only=on
# 从库实际使用的ip,端口, 用于集群内通信
report_host=10.1.12.12
report_port=13501
# 默认字符集
character-set-server=utf8mb4
# 默认存储引擎
default-storage-engine=INNODB
# 设置加密方式
default_authentication_plugin=mysql_native_password
# sql_mode
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
2.3 配置从库注意事项:
- 从库首次使用
docker-comose up -d初始化时, 需要注释掉super_read_only=on, 让初始化正常运行 - 从库启动成功之后, 应打开注释
super_read_only=on, 使用docker-compose restart重新启动, 禁止root用户写入
3. 配置主从同步
由于使用了GTID, 配置主从同步变得非常方便
3.1 主库创建slave账户
创建用于从库同步的账户, 从库无需创建, 开启主从后会把该账户自动同步过去, 这样后面主从切换会十分方便
在主库执行以下语句:
create user 'slave'@'%' identified by '123456';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
flush privileges;
3.2 从库开启同步
两个从库分别执行一下语句:
CHANGE MASTER TO
MASTER_HOST = '10.1.12.12',
MASTER_PORT=13500,
MASTER_USER = 'slave',
MASTER_PASSWORD = '123456',
MASTER_AUTO_POSITION = 1;
start slave;
3.3 测试同步
主库可以使用show slave hosts;语句查询从库是否连接正常, 并且通过创建库,表等测试从库是否复制成功
下一篇将介绍使用orchestrator进行主从切换等操作