MySQL作为最流行的开源关系型数据库管理系统之一,其主从复制功能为实现数据冗余、读写分离以及故障转移提供了强有力的支持
结合Docker容器化技术,我们可以更加高效、灵活地部署和管理MySQL主从架构
本文将详细介绍如何使用Docker进行MySQL主从配置,为您的业务系统提供坚实的数据保障
一、MySQL主从复制原理 MySQL主从复制(Replication)是一种实现数据冗余和高可用性的技术
它将主数据库(Master)的变更操作同步到一个或多个从数据库(Slave),实现数据的实时或准实时复制
主从复制的核心在于二进制日志(Binary Log,简称binlog)和中继日志(Relay Log)
1.主库操作记录:当主库接收到数据操作时,它会将这些操作写入binlog
binlog记录了所有更改数据库数据的语句,如INSERT、UPDATE、DELETE等
2.从库请求同步:从库通过TCP连接请求主库发送binlog
主库有一个dump线程负责将binlog传输给从库
3.从库写入中继日志:从库接收到binlog后,会先将其写入中继日志
中继日志是从库用于记录从主库接收到的所有操作日志的中间文件
4.从库重放操作:从库的SQL线程会读取中继日志中的操作,并在从库中重放这些操作,从而实现数据的同步
二、Docker环境准备 在使用Docker进行MySQL主从配置之前,我们需要确保Docker环境已经搭建完成
Docker是一个开源的应用容器引擎,它允许开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何支持Docker的平台上
1.安装Docker:根据操作系统的不同,您可以从Docker官方网站下载并安装Docker
安装完成后,您可以通过运行`docker --version`命令来检查Docker是否安装成功
2.拉取MySQL镜像:在Docker Hub上,有官方提供的MySQL镜像
您可以使用`docker pull mysql:latest`命令来拉取最新版本的MySQL镜像,或者指定版本号如`docker pull mysql:5.7`来拉取特定版本的镜像
三、Docker MySQL主从配置步骤 接下来,我们将详细介绍如何使用Docker进行MySQL主从配置
1. 创建主库容器 首先,我们需要创建一个MySQL主库容器
可以使用以下命令: docker run -p 3307:3306 --name mysql-master -v /mydata/mysql-master/log:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7 这条命令做了以下几件事情: - `-p 3307:3306`:将容器的3306端口映射到宿主机的3307端口,方便我们后续通过工具连接主库
- `--name mysql-master`:为容器指定一个名称为`mysql-master`
- `-v /mydata/mysql-master/log:/var/log/mysql`和`-v /mydata/mysql-master/data:/var/lib/mysql`:将宿主机的目录挂载到容器内,用于持久化存储日志和数据
- `-e MYSQL_ROOT_PASSWORD=root`:设置MySQL root用户的密码为`root`
- `-d mysql:5.7`:以后台模式运行MySQL 5.7版本的容器
2. 配置主库 进入主库容器,并编辑MySQL的配置文件`my.cnf`
可以使用以下命令进入容器: docker exec -it mysql-master /bin/bash 然后,在容器内创建`my.cnf`文件,并添加以下内容: 【mysqld】 server-id=101 log-bin=mysql-bin binlog_cache_size=1M expire_logs_days=7 slave_skip_errors=1062 这些配置的含义如下: - `server-id`:服务器的唯一标识符,在同一局域网中需要唯一
- `log-bin`:启用二进制日志功能,并指定日志文件名前缀
- `binlog_cache_size`:设置二进制日志使用的内存大小
- `expire_logs_days`:设置二进制日志的过期清理时间,单位为天
- `slave_skip_errors`:跳过主从复制中遇到的所有错误或指定类型的错误,避免从库复制中断
保存并退出编辑器后,重启主库容器以使配置生效: docker restart mysql-master 3. 创建同步用户 在主库容器中,创建用于同步的用户,并授予相应的权限: CREATE USER slave@% IDENTIFIED BY slave_password; GRANT REPLICATION SLAVE, REPLICATION CLIENT ON. TO slave@%; FLUSH PRIVILEGES; 这里我们创建了一个名为`slave`的用户,密码为`slave_password`,并授予了REPLICATION SLAVE和REPLICATION CLIENT权限
4. 创建从库容器 接下来,我们需要创建一个MySQL从库容器
可以使用以下命令: docker run -p 3308:3306 --name mysql-slave -v /mydata/mysql-slave/log:/var/log/mysql -v /mydata/mysql-slave/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7 这条命令与创建主库容器的命令类似,只是端口号和容器名称不同
5. 配置从库 进入从库容器,并编辑MySQL的配置文件`my.cnf`
可以使用与主库相同的命令进入容器,并在容器内创建`my.cnf`文件,添加以下内容: 【mysqld】 server-id=102 relay-log=mysql-relay-bin 这些配置的含义如下: - `server-id`:服务器的唯一标识符,与主库不同
- `relay-log`:启用中继日志功能,并指定日志文件名前缀
保存并退出编辑器后,重启从库容器以使配置生效: docker restart mysql-slave 6. 配置从库连接主库 在从库容器中,配置从库连接主库的相关信息
可以使用以下SQL语句: CHANGE MASTER TO MASTER_HOST=mysql-master_ip, MASTER_USER=slave, MASTER_PASSWORD=slave_password, MASTER_LOG_FILE=mysql-bin.000001, MASTER_LOG_POS= 120; 这里的`MASTER_HOST`需要替换为主库容器的IP地址,可以通过`docker inspect --format={{.NetworkSettings.IPAddress}} mysql-master`命令获取
`MASTER_LOG_FILE`和`MASTER_LOG_POS`需要替换为主库的二进制日志文件名和位置,可以通过在主库中执行`SHOW MASTER STATUS;`命令获取
配置完成后,启动从库的复制进程: START SLAVE; 7. 验证同步状态 最后,我们需要验证主从同步是否成功
可以在从库中执行以下SQL语句来检查从库的状态: SHOW SLAVE STATUSG; 如果`Slave_IO_Running`和`Slave_SQL_Running`的状态都是`Yes`,则说明主从同步已经成功配置
四、主从复制的优势