返回

Docker 下 MySQL 的高可用实现:主从复制实战 (Mac M1)

后端

在 Mac M1 上 Docker 化 MySQL 主从复制指南

在数据主导的时代,数据库在现代软件架构中扮演着至关重要的角色。其中,MySQL 作为备受推崇的开源关系型数据库,凭借其高效性和可扩展性,在业界广受青睐。为了满足企业对数据安全、高可用和扩展性的需求,MySQL 主从复制应运而生。

本文将深入浅出地指导您在 Mac M1 机器上使用 Docker 技术搭建 MySQL 主从复制环境,让您轻松应对数据库管理的挑战。

第一步:准备工作

  1. 确保您的 Mac M1 机器已安装 Docker Desktop。
  2. 下载适用于 Mac M1 的 MySQL 镜像。
  3. 创建两个文件夹,分别用于存储主服务器和从服务器的数据和配置文件。

第二步:搭建 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_HOSTMASTER_USERMASTER_PASSWORD 配置正确。

踩坑二:从服务器复制延迟

  • 确保主服务器和从服务器之间的网络连接速度足够快。
  • 确保从服务器的硬件配置足够强大,能够处理复制负载。
  • 优化 MySQL 配置,例如增加 innodb_flush_log_at_trx_commit 的值。

结语

通过以上步骤,您已经成功地在 Mac M1 机器上搭建了基于 Docker 的 MySQL 主从复制环境。现在,您可以放心地将数据存储在主服务器上,并利用从服务器来处理读请求,从而提高数据库的性能和可靠性。

常见问题解答

1. 如何检查主从复制是否正常工作?

show slave status\G

如果 Slave_IO_RunningSlave_SQL_Running 都为 Yes,则表明复制正在正常工作。

2. 如何停止复制进程?

STOP SLAVE;

3. 如何重置复制进程?

RESET SLAVE;

4. 如何手动触发复制?

START SLAVE;

5. 如何在主服务器上创建新表并在从服务器上复制?

在主服务器上创建新表:

CREATE TABLE new_table (...);

在从服务器上刷新复制:

FLUSH TABLES WITH READ LOCK;
UNLOCK TABLES;