docker-compose搭建mysql8.0 集群
1. 规划目录环境
整体规划如下,1个docker-compose文件,1主1从数据库数据映射卷
创建数据映射卷文件夹
mkdir -p data/master && mkdir -p data/slave
docker-compose.yaml文件内容如下:
version: "3.7"
services:
db_master:
image: mysql:8.0.32
container_name: db_master
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: test
MYSQL_USER: developer
MYSQL_PASSWORD: 123456
TZ: Asia/Shanghai
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
--default-authentication-plugin=mysql_native_password
--server-id=1
--log-bin=mysql-bin
--binlog-do-db=test
volumes:
- ./data/master:/var/lib/mysql
ports:
- "3306:3306"
networks:
- db_network
db_slave:
image: mysql:8.0.32
container_name: db_slave
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: test
MYSQL_USER: developer
MYSQL_PASSWORD: 123456
TZ: Asia/Shanghai
MYSQL_MASTER_HOST: db_master
MYSQL_MASTER_PORT: 3306
MYSQL_MASTER_USER: developer
MYSQL_MASTER_PASSWORD: 123456
MYSQL_REPLICA_USER: developer
MYSQL_REPLICA_PASSWORD: 123456
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
--default-authentication-plugin=mysql_native_password
--server-id=2
--relay-log=mysql-relay-bin
--log-slave-updates
--read-only=1
--replicate-do-db=test
volumes:
- ./data/slave:/var/lib/mysql
ports:
- "3307:3306"
networks:
- db_network
networks:
db_network:
driver: bridge
2. 启动容器实例
docker-compose up -d
3. 详细配置
3.1. 主库配置
进入主库执行以下命令,为developer(根据实际情况)用户授予 REPLICATION 权限
GRANT REPLICATION SLAVE ON *.* TO 'developer'@'%';
SHOW MASTER STATUS; #binlog.000002 1454
输出信息做好记录,后续会用到
3.2. 从库配置
进入从库配置
STOP SLAVE;
#需要根据实际情况进行调整
change master to master_host='db_master',master_port=3306,master_user='developer',master_password='123456',master_log_file='binlog.000002',master_log_pos=1454,master_connect_retry=30;
START SLAVE USER='developer' PASSWORD='123456';
SHOW SLAVE STATUS;
4 额外需求
在工作中遇到一个需求,其它团队需要写入数据到主库中,但要同步到从库。我们的方案是在主库中建一个data_pusher用户,只赋予写入和查询aaa表权限,具体脚本如下:
- 主库root帐号创建新表aaa;
- 主库root帐号新建 data_pusher用户,并赋予读写查权限;
CREATE USER 'data_pusher'@'%' IDENTIFIED BY '654321'; GRANT INSERT, SELECT, UPDATE ON test.aaa TO 'data_pusher'@'%'; FLUSH PRIVILEGES;
经过测试,使用data_pusher用户连接主库,并在test.aaa表中插入数据,主库root帐号和从库root帐号都可以看到新加入的数据。