环境信息
操作系统:WIndows11
mysql版本: mysql8.0
开始搭建
文件目录如下:
C:\mysql-cluster
├── docker-compose.yml
├── master
│ ├── data
│ └── my.cnf
└── slave
├── data
└── my.cnf
主节点
创建数据文件夹
mkdir master/data
创建mysql配置文件
主节点
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=ROW
从节点
创建数据文件夹
mkdir slave/data
创建mysql配置文件
主节点
[mysqld]
server-id=2
read-only=1
docker-compose文件
注意:在windows环境下,需要添加command: bash -c "chmod 644 /etc/mysql/conf.d/my.cnf && docker-entrypoint.sh mysqld"
,避免出现权限问题,导致mysql不识别配置文件
version: '3.8'
services:
mysql-master:
image: mysql:8.0
container_name: mysql-master
ports:
- '4306:3306'
environment:
- MYSQL_ROOT_PASSWORD=123456
volumes:
- ./master/data:/var/lib/mysql
- ./master/my.cnf:/etc/mysql/my.cnf
command: bash -c "chmod 644 /etc/mysql/conf.d/my.cnf && docker-entrypoint.sh mysqld"
networks:
- mysql-network
healthcheck:
test: ['CMD', 'mysqladmin', 'ping', '-h', 'localhost']
interval: 10s
retries: 5
mysql-slave:
image: mysql:8.0
container_name: mysql-slave
ports:
- '4307:3306'
environment:
- MYSQL_ROOT_PASSWORD=123456
volumes:
- ./slave/data:/var/lib/mysql
- ./slave/my.cnf:/etc/mysql/my.cnf
command: bash -c "chmod 644 /etc/mysql/conf.d/my.cnf && docker-entrypoint.sh mysqld"
networks:
- mysql-network
depends_on:
- mysql-master
healthcheck:
test: ['CMD', 'mysqladmin', 'ping', '-h', 'localhost']
interval: 10s
retries: 5
networks:
mysql-network:
driver: bridge
启动数据库
在当前目录下执行命令:
docker-compose up -d
如需关闭执行命令: docker-compose down
连接数据库
为了避免冲突,对端口做了改动
主库:127.0.0.1:4306 root/123456
从库: 127.0.0.1:4307 root/123456
开启数据库主从复制
开始前请确保数据库启动正常,查看docker容器状态是否running
主库
登录数据库
mysql -uroot -p123456
创建复制用户
用户名:repl
密码:repl123
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'repl123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
查看主库binlog位置,以下两个参数从库会用到
File: mysql-bin.000001
Position: 156
SHOW MASTER STATUS;
从库
进入容器后,登录数据库
mysql -uroot -p123456
创建主库连接,这里用到了前面查看主库binlog的两个参数,请根据实际进行修改
CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='repl',
MASTER_PASSWORD='repl123',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=156;
启动主从复制
START SLAVE;
查看主从复制状态
SHOW SLAVE STATUS\G;
确认以下两项为 Yes:
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
如果有错误,检查 Last_Error 字段,可能需要调整配置。
至此,mysql主从配置完成,进行测试
测试
在主节点创建数据库,表并插入数据
CREATE DATABASE test_db;
USE test_db;
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50));
INSERT INTO users (name) VALUES ('Alice'), ('Bob');
登录从库检查是否进行数据复制
USE test_db;
SELECT * FROM users;
如果主从复制正常,从节点应该显示 Alice 和 Bob
生产环境建议
- 使用更复杂的密码。
- 配置防火墙,限制端口访问。
- 启用 SSL 加密主从通信。