基于Docker容器的MySQL数据主从同步技术实现
1. 引言
本文旨在展示如何通过Docker容器技术实现MySQL数据库的主从同步。本文将详细介绍环境准备、主从服务器的创建与配置、主从同步的实现及验证过程。
2. 环境准备
2.1 准备工作
本文在Ubuntu 20.04 (64-bit) 操作系统上进行,使用Docker来部署MySQL服务器。确保主机Host的网络配置正确,能够连接互联网。
2.2 Docker安装与配置
我这里使用阿里云镜像网站提供的Docker社区版软件包管理器源文件,在Ubuntu系统上安装Docker。安装完成后,启动Docker,并验证其版本号,本文使用的Docker版本号为24.0.7。为了方便后续操作,将Docker设置为开机自启动,并确保其运行状态为激活(Active)。
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo systemctl enable docker
sudo systemctl start docker
#检验docker是否安装成功
docker --version
3. MySQL数据一主多从实现
3.1 主从同步原理
使用 Docker 数据卷可以将宿主机的目录或文件与容器中的目录或文件进行绑定,实现数据的持久化和共享。数据卷允许容器中的数据与宿主机的数据进行实时同步,并可以被多个容器同时挂载,从而实现数据共享。
MySQL 主从复制是一种数据复制技术,通过在主数据库上记录所有的数据更改操作并将其传播到一个或多个从数据库上,从而实现数据的同步。
- 主数据库(Master)接收来自客户端的写操作,并将这些操作记录在二进制日志(binlog)中。
- 从数据库(Slave)连接到主数据库,并通过读取主数据库的 binlog 文件来复制数据更改操作,从而保持与主数据库的数据同步。
3.2 部署过程
3.2.1 关闭防火墙并重启Docker
为了防止后续安装的MySQL无法启动,应先关闭防火墙,并重启Docker。
sudo ufw disable
sudo systemctl restart docker
3.2.2 创建主服务器 hitd-mysql-master
在 Docker 中创建名为 hitd-mysql-master 的容器作为主服务器,并使用 MySQL 官方提供的镜像版本为 8.0.29。该容器在主服务器上监听标准的 MySQL 端口 3306,以便客户端可以连接并进行数据操作。设置数据卷以确保数据持久化和配置灵活性,主服务器的配置文件存储在 /hitd/mysql/master/conf
目录下,数据存储在 /hitd/mysql/master/data
目录下。
docker run -d --name hitd-mysql-master \
-p 3306:3306 \
-v /hitd/mysql/master/conf:/etc/mysql/conf.d \
-v /hitd/mysql/master/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0.29
配置文件 my.cnf
关键配置项:
[mysqld]
server-id=1
log-bin=mysql-bin
binlog_format=STATEMENT
3.2.3 创建slave用户并记录状态
进入主服务器容器,创建slave用户,并记录File和Position的值。
docker exec -it hitd-mysql-master mysql -uroot -prootpassword
# 在 MySQL shell 中执行以下命令:
CREATE USER 'slaveuser'@'%' IDENTIFIED BY 'slavepassword';
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser'@'%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS;
记录File
和Position
的值。
状态记录将会展示类似如下输出:
3.2.4 创建从服务器
配置多台从服务器,它们的连接主服务器均为master。以配置slave1为例,从Docker中创建并启动MySQL从服务器。
docker run -d --name hitd-mysql-slave1 \
-p 3307:3306 \
-v /hitd/mysql/slave1/conf:/etc/mysql/conf.d \
-v /hitd/mysql/slave1/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0.29
从服务器配置文件 my.cnf
关键配置项:
[mysqld]
server-id=2
同样的方法可以配置多台从服务器如slave2、slave3等。
3.2.5 配置主从关系
进入从服务器容器,配置主从关系。
docker exec -it hitd-mysql-slave1 mysql -uroot -prootpassword
# 在 MySQL shell 中执行以下命令:
CHANGE MASTER TO
MASTER_HOST='hitd-mysql-master',
MASTER_USER='slaveuser',
MASTER_PASSWORD='slavepassword',
MASTER_LOG_FILE='mysql-bin.000001', # 这里填写之前记录的File值
MASTER_LOG_POS=123; # 这里填写之前记录的Position值
START SLAVE;
3.2.6 检验主从同步配置
启动从机服务器的复制功能,执行SQL,查看状态时,需要保证进程 Slave_IO_Running
和进程 Slave_SQL_Running
的状态值均为Yes,此时主从数据配置成功。
SHOW SLAVE STATUS\G;
确保 Slave_IO_Running
和 Slave_SQL_Running
均为 Yes
。
4. 主从同步数据验证
在主机服务器创建数据库StudentDB,并加入表格和数据,同时在从机服务器中进行观察是否已经同步。
4.1 主服务器展示
在主服务器上创建数据库和表格并插入数据:
docker exec -it hitd-mysql-master mysql -uroot -prootpassword
# 在 MySQL shell 中执行以下命令:
CREATE DATABASE StudentDB;
USE StudentDB;
CREATE TABLE Students (ID INT PRIMARY KEY, Name VARCHAR(100));
INSERT INTO Students (ID, Name) VALUES (1, 'John Doe');
4.2 从服务器展示
在从服务器上查看数据是否同步:
docker exec -it hitd-mysql-slave1 mysql -uroot -prootpassword
# 在 MySQL shell 中执行以下命令:
USE StudentDB;
SELECT * FROM Students;
数据表 Students
应包含与主服务器相同的数据。
好啦,以上就是基于Docker容器的MySQL数据主从同步实现,希望对大家有所帮助,有什么问题欢迎大家留言!(●ˇ∀ˇ●)