返回
Docker 下 MySQL 的高可用实现:主从复制实战 (Mac M1)
后端
2023-11-27 01:59:53
在 Mac M1 上 Docker 化 MySQL 主从复制指南
在数据主导的时代,数据库在现代软件架构中扮演着至关重要的角色。其中,MySQL 作为备受推崇的开源关系型数据库,凭借其高效性和可扩展性,在业界广受青睐。为了满足企业对数据安全、高可用和扩展性的需求,MySQL 主从复制应运而生。
本文将深入浅出地指导您在 Mac M1 机器上使用 Docker 技术搭建 MySQL 主从复制环境,让您轻松应对数据库管理的挑战。
第一步:准备工作
- 确保您的 Mac M1 机器已安装 Docker Desktop。
- 下载适用于 Mac M1 的 MySQL 镜像。
- 创建两个文件夹,分别用于存储主服务器和从服务器的数据和配置文件。
第二步:搭建 MySQL 主服务器容器
使用以下命令启动 MySQL 主服务器容器:
docker run -d --name mysql-master -p 3306:3306 -v /path/to/master-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password mysql:latest
-d
:以守护进程模式运行容器。--name mysql-master
:为容器指定名称。-p 3306:3306
:将容器的 3306 端口映射到主机的 3306 端口,以便您可以从主机访问 MySQL 服务。-v /path/to/master-data:/var/lib/mysql
:将主机的/path/to/master-data
目录挂载到容器的/var/lib/mysql
目录,以便存储 MySQL 数据。-e MYSQL_ROOT_PASSWORD=password
:设置 MySQL 根用户的密码。
第三步:搭建 MySQL 从服务器容器
使用以下命令启动 MySQL 从服务器容器:
docker run -d --name mysql-slave -p 3307:3306 -v /path/to/slave-data:/var/lib/mysql --link mysql-master:mysql-master mysql:latest
-d
:以守护进程模式运行容器。--name mysql-slave
:为容器指定名称。-p 3307:3306
:将容器的 3306 端口映射到主机的 3307 端口,以便您可以从主机访问 MySQL 服务。-v /path/to/slave-data:/var/lib/mysql
:将主机的/path/to/slave-data
目录挂载到容器的/var/lib/mysql
目录,以便存储 MySQL 数据。--link mysql-master:mysql-master
:将从服务器容器链接到主服务器容器,以便从服务器可以访问主服务器。
第四步:配置 MySQL 主从复制
在主服务器容器中执行以下命令:
CREATE USER 'slave'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
FLUSH PRIVILEGES;
- 这将创建一个名为
slave
的用户,并授予其从服务器所需的复制权限。
在从服务器容器中执行以下命令:
CHANGE MASTER TO MASTER_HOST='mysql-master', MASTER_USER='slave', MASTER_PASSWORD='password', MASTER_PORT=3306;
START SLAVE;
- 这将把从服务器连接到主服务器,并启动复制进程。
常见踩坑与解决方案
踩坑一:从服务器无法连接到主服务器
- 确保主服务器和从服务器容器都在运行。
- 确保主服务器的防火墙已打开 3306 端口。
- 确保从服务器的
MASTER_HOST
、MASTER_USER
和MASTER_PASSWORD
配置正确。
踩坑二:从服务器复制延迟
- 确保主服务器和从服务器之间的网络连接速度足够快。
- 确保从服务器的硬件配置足够强大,能够处理复制负载。
- 优化 MySQL 配置,例如增加
innodb_flush_log_at_trx_commit
的值。
结语
通过以上步骤,您已经成功地在 Mac M1 机器上搭建了基于 Docker 的 MySQL 主从复制环境。现在,您可以放心地将数据存储在主服务器上,并利用从服务器来处理读请求,从而提高数据库的性能和可靠性。
常见问题解答
1. 如何检查主从复制是否正常工作?
show slave status\G
如果 Slave_IO_Running
和 Slave_SQL_Running
都为 Yes
,则表明复制正在正常工作。
2. 如何停止复制进程?
STOP SLAVE;
3. 如何重置复制进程?
RESET SLAVE;
4. 如何手动触发复制?
START SLAVE;
5. 如何在主服务器上创建新表并在从服务器上复制?
在主服务器上创建新表:
CREATE TABLE new_table (...);
在从服务器上刷新复制:
FLUSH TABLES WITH READ LOCK;
UNLOCK TABLES;