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;
记下File
和Position
的值,稍后在从库中会用到。
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;
如果在从库中看到了主库中创建的数据库和表,并且数据也一致,