mysql 主从复制
本章是在Linux
系统上,通过docker-compose
进行mysql
的部署,实现主从复制。
一. 文件目录
.
├── docker-compose.yml
├── mysql-master.cnf
└── mysql-slave.cnf
二. docker-compose.yml 文件
version: '3.8'
services:
mysql-master:
image: mysql:8.0
container_name: mysql-master
environment:
- MYSQL_ROOT_PASSWORD=root_password
- MYSQL_DATABASE=mydatabase
- MYSQL_USER=myuser
- MYSQL_PASSWORD=mypassword
ports:
- "3306:3306"
volumes:
- ./mysql-master.cnf:/etc/mysql/conf.d/mysql-master.cnf
- mysql-master-data:/var/lib/mysql
networks:
- mysql-net
mysql-slave:
image: mysql:8.0
container_name: mysql-slave
environment:
- MYSQL_ROOT_PASSWORD=root_password
- MYSQL_DATABASE=mydatabase
- MYSQL_USER=myuser
- MYSQL_PASSWORD=mypassword
ports:
- "3307:3306"
volumes:
- ./mysql-slave.cnf:/etc/mysql/conf.d/mysql-slave.cnf
- mysql-slave-data:/var/lib/mysql
networks:
- mysql-net
volumes:
mysql-master-data:
mysql-slave-data:
networks:
mysql-net:
driver: bridge
三. 配置文件
1. 主库 mysql-master.cnf
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=mydatabase
2. 从库 mysql-slave.cnf
[mysqld]
server-id=2
log-bin=mysql-bin
replicate-do-db=mydatabase
四. 启动 Docker-Compose
在包含docker-compose.yml文件的目录中运行以下命令来启动MySQL主从
docker-compose up -d
五. 配置主从复制
启动容器后,需要手动配置主从复制。首先,进入MySQL主节点容器:
docker exec -it mysql-master mysql -uroot -proot_password
在MySQL主节点中创建一个用于复制的用户:
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
然后,查看主节点的二进制日志文件和位置:
SHOW MASTER STATUS;
记下File
和Position
的值,稍后在从节点中使用。
接下来,进入MySQL从节点容器:
docker exec -it mysql-slave mysql -uroot -proot_password
在从节点中配置主节点信息:
CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='repl',
MASTER_PASSWORD='repl_password',
MASTER_LOG_FILE='mysql-bin.000001', -- 替换为实际的File值
MASTER_LOG_POS=156; -- 替换为实际的Position值
START SLAVE;
最后,检查从节点的状态:
SHOW SLAVE STATUS\G
六. 验证主从复制
在主节点中创建一个表并插入一些数据:
USE mydatabase;
CREATE TABLE test (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255));
INSERT INTO test (name) VALUES ('Master Data');
然后在从节点中查询该表,确认数据已经复制:
如果看到相同的数据,说明主从复制配置成功。
USE mydatabase;
SELECT * FROM test;