Docker MySQL主从自动化部署-GTID模式

引言

MySQL是一款常用的关系型数据库管理系统,而Docker是一款流行的容器化平台。结合MySQL和Docker,可以实现MySQL数据库的快速部署和管理。本文将介绍如何使用Docker自动化部署MySQL主从复制,并使用GTID模式来确保数据的一致性和高可用性。

1. Docker安装和配置

首先,我们需要安装Docker并进行基本的配置。

1.1 安装Docker

使用以下命令安装Docker:

$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

1.2 配置Docker

在安装完Docker后,我们需要配置Docker的相关参数。可以通过修改/etc/docker/daemon.json文件来配置Docker守护进程。

打开/etc/docker/daemon.json文件,添加以下内容:

{
  "data-root": "/data/docker",
  "storage-driver": "overlay2"
}

其中,data-root指定了Docker数据的存储路径,storage-driver指定了使用的存储驱动。

保存并退出文件后,重启Docker服务:

$ sudo systemctl restart docker

2. 创建MySQL主从容器

在部署MySQL主从复制前,我们需要创建两个MySQL容器,分别用于主库和从库。

2.1 创建MySQL主库容器

使用以下命令创建MySQL主库容器:

$ docker run -d --name mysql-master \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -e MYSQL_REPLICATION_USER=repl \
  -e MYSQL_REPLICATION_PASSWORD=replica \
  mysql/mysql-server:5.7

以上命令创建了一个名为mysql-master的容器,并指定了MySQL的root密码、复制用户和密码。

2.2 创建MySQL从库容器

使用以下命令创建MySQL从库容器:

$ docker run -d --name mysql-slave \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -e MYSQL_REPLICATION_USER=repl \
  -e MYSQL_REPLICATION_PASSWORD=replica \
  mysql/mysql-server:5.7

以上命令创建了一个名为mysql-slave的容器,并指定了MySQL的root密码、复制用户和密码。

3. 配置MySQL主从复制

在创建了MySQL主从容器后,我们需要配置MySQL的主从复制。

3.1 配置主库

首先,我们需要进入MySQL主库容器:

$ docker exec -it mysql-master bash

然后,登录MySQL服务:

$ mysql -uroot -p123456

在MySQL shell中,创建用于复制的用户:

CREATE USER 'repl'@'%' IDENTIFIED BY 'replica';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

接下来,查看主库的binlog信息并记录下来:

SHOW MASTER STATUS;

记下FilePosition的值,稍后在从库中会用到。

3.2 配置从库

同样地,我们需要进入MySQL从库容器:

$ docker exec -it mysql-slave bash

然后,登录MySQL服务:

$ mysql -uroot -p123456

在MySQL shell中,配置从库的复制参数:

CHANGE MASTER TO
  MASTER_HOST='mysql-master',
  MASTER_USER='repl',
  MASTER_PASSWORD='replica',
  MASTER_LOG_FILE='<File>',
  MASTER_LOG_POS=<Position>;

其中,<File><Position>是在主库中记录的binlog信息。

最后,开启从库的复制:

START SLAVE;

3.3 验证主从复制

在完成主从复制的配置后,我们可以验证主从复制是否正常工作。

在主库中,创建一个测试数据库和表:

CREATE DATABASE test;
USE test;
CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20));
INSERT INTO users (name) VALUES ('Alice'), ('Bob'), ('Charlie');

在从库中,查看是否同步了主库的数据:

USE test;
SELECT * FROM users;

如果在从库中看到了主库中创建的数据库和表,并且数据也一致,