基于 Docker 如何实现 MySQL 主从复制
在使用 Docker 部署 MySQL 的过程中,我们通常都会涉及到数据的备份、恢复以及高可用方案的实现。其中,主从复制就是一种高可用方案,可以提高 MySQL 数据库的可用性和稳定性。
本文将通过 Docker 部署 MySQL 主从复制的流程,以及其中可能遇到的一些问题。
准备工作
在进行部署之前,需要确保本地已经安装 Docker 和 Docker Compose。如果尚未安装,请参考以下文档进行安装:
步骤一:创建 Docker Compose 文件
首先,我们需要创建一个 Docker Compose 文件,用于定义我们的 MySQL 环境。
在本例中,我们将使用一个名为 docker-compose.yml
的文件,其中包含 MySQL 主实例和从实例的定义。以下是我们的 docker-compose.yml
文件的示例:
version: '3'
services:
primary:
image: mysql:5.7
container_name: mysql_primary
restart: always
environment:
MYSQL_DATABASE: testdb
MYSQL_USER: testuser
MYSQL_PASSWORD: testpassword
MYSQL_ROOT_PASSWORD: rootpassword
volumes:
- ./mysql/conf.d:/etc/mysql/conf.d
- ./mysql/data:/var/lib/mysql
ports:
- "3306:3306"
secondary:
image: mysql:5.7
container_name: mysql_secondary
restart: always
environment:
MYSQL_DATABASE: testdb
MYSQL_USER: testuser
MYSQL_PASSWORD: testpassword
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_MASTER_HOST: primary
MYSQL_MASTER_PORT: 3306
MYSQL_MASTER_USER: replicator
MYSQL_MASTER_PASSWORD: replicatorpassword
volumes:
- ./mysql/conf.d:/etc/mysql/conf.d
- ./mysql/data:/var/lib/mysql
depends_on:
- primary
在此 Compose 文件中,我们定义了两个 MySQL 容器服务。一个是 primary
,它将是我们的主 MySQL 实例;另一个是 secondary
,它将是我们的从 MySQL 实例。
在 primary
容器中,我们指定了一个 MySQL 5.7 的镜像,并定义了容器名、环境变量、数据卷和端口映射等配置。在 secondary
容器中,我们同样指定了 MySQL 5.7 的镜像,并定义了容器名、环境变量和数据卷等配置。此外,我们还在 secondary
中使用 MYSQL_MASTER_HOST
和 MYSQL_MASTER_PORT
环境变量来将从实例与主实例连接。
步骤二:启动容器
一旦我们定义了 Docker Compose 文件,我们就可以使用 Docker Compose 工具来启动容器了。
在终端中,使用 cd
命令进入到我们的 Docker Compose 文件所在的目录,并输入以下命令:
$ docker-compose up -d
这个命令会启动我们的 MySQL 容器,并将它们放在后台运行。我们可以使用 docker ps
命令来查看正在运行的容器信息。
步骤三:配置主从复制
启动容器后,我们需要在 MySQL 服务器上配置主从复制。我们将在主服务器上创建一个新用户 replicator
,并授权给这个用户在从服务器上进行复制操作。
首先,我们需要进入主服务器的容器,使用以下命令:
$ docker exec -it mysql_primary bash
进入容器后,连接到 MySQL 服务器:
$ mysql -uroot -p
在 MySQL 服务器上创建新用户 replicator
:
mysql> CREATE USER 'replicator'@'%' IDENTIFIED BY 'replicatorpassword';
授予这个用户 REPLICATION SLAVE
和 REPLICATION CLIENT
权限:
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'replicator'@'%';
完成后,退出 MySQL 服务器并退出容器。
mysql> exit
$ exit
现在我们已经在主服务器上创建了新用户 replicator
,接下来我们需要从服务器连接到主服务器,并配置主从复制。同样,我们需要进入从服务器的容器,并使用以下命令:
$ docker exec -it mysql_secondary bash
进入容器后,连接到 MySQL 服务器:
$ mysql -uroot -p
将从服务器连接到主服务器:
mysql> CHANGE MASTER TO MASTER_HOST='primary', MASTER_USER='replicator', MASTER_PASSWORD='replicatorpassword', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=0;
其中,MASTER_HOST
是主服务器的 IP 地址,MASTER_USER
和 MASTER_PASSWORD
是在主服务器上创建的新用户 replicator
的用户名和密码,而 MASTER_LOG_FILE
和 MASTER_LOG_POS
是主服务器当前二进制日志文件中的位置。
接下来,启动从服务器的复制过程:
mysql> START SLAVE;
然后,使用以下命令检查复制状态:
mysql> SHOW SLAVE STATUS\G
在输出信息中,我们需要查看以下关键字:
Slave_IO_State
:这是从服务器的复制进程正在执行的状态。Master_Host
:这是从服务器正在复制数据的主服务器的 IP 地址。Master_User
:这是从服务器正在复制数据的主服务器的用户名。Master_Port
:这是从服务器正在复制数据的主服务器的端口号。Slave_IO_Running
:这个值应该为Yes
,表示从服务器的主从复制进程正在运行。Slave_SQL_Running
:这个值同样应该为Yes
,表示从服务器的 SQL 线程正在运行。
如果输出信息中的状态显示正确,那么说明我们已经成功配置了主从复制。
示例一:添加数据
我们可以在主服务器上插入新数据,然后在从服务器上查看数据是否已经同步。
mysql> use testdb;
mysql> CREATE TABLE Persons (PersonID INT, LastName VARCHAR(255), FirstName VARCHAR(255), Address VARCHAR(255), City VARCHAR(255));
mysql> INSERT INTO Persons (PersonID, LastName, FirstName, Address, City) VALUES ('1', 'Doe', 'John', '123 Main St.', 'Anytown');
接着,在从服务器上查看这个表:
mysql> use testdb;
mysql> SELECT * FROM Persons;
输出应该是以下内容:
+----------+---------+------------+--------------+---------+
| PersonID | LastName | FirstName | Address | City |
+----------+---------+------------+--------------+---------+
| 1 | Doe | John | 123 Main St. | Anytown |
+----------+---------+------------+--------------+---------+
示例二:测试主服务器宕机
我们可以在主服务器上执行以下命令,模仿主服务器宕机的情况:
mysql> FLUSH TABLES WITH READ LOCK;
当主服务器出现故障时,我们需要将从服务器转变为主服务器。
在从服务器上,我们首先需要停止主从复制进程:
mysql> STOP SLAVE;
然后,我们需要移除从服务器上的 master 信息:
mysql> RESET MASTER;
接着,我们需要将从服务器的数据导入一个外部存储设备:
$ docker-compose stop
$ tar -czvf mysql_backup.tar.gz ./mysql/
最后,我们需要将从服务器转变为主服务器:
$ docker-compose up -d --scale primary=0 --scale secondary=1
启动后,我们需要进入 secondary
容器,并在 MySQL 服务器上执行以下命令:
mysql> RESET SLAVE;
然后,重新启动主从复制进程:
mysql> CHANGE MASTER TO MASTER_HOST='', MASTER_USER='', MASTER_PASSWORD='', MASTER_LOG_FILE='', MASTER_LOG_POS=0;
mysql> START SLAVE;
完成后,我们可以在新的主服务器上插入数据,并检查从服务器是否已经同步。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于Docker如何实现MySQL主从复制详解 - Python技术站