【云原生】Docker 搭建MySql 主从服务实战操作详解
Docker 搭建MySql 主从服务实战操作详解
目录
一、前言
在日常的开发中,mysql数据库使用可以说必不可少,截止到今天,mysql的使用已经非常广泛。同时,基于实际业务场景,为了满足日益复杂的业务需求,往往单机mysql数据承载能力有限,对业务系统的高并发、高性能、低延迟的满足也容易到达瓶颈,因此基于mysql也逐渐产生了很多复杂的架构,比如mysql的主从架构,PXC架构等,核心目的还是为了满足业务系统的关键指标,本篇以mysql的常见的主从架构为例,详细介绍如何搭建mysql 主从服务。
二、MySQL主从架构介绍
2.1 什么是MySQL主从架构
MySQL主从架构是一种数据复制技术,它允许将一个MySQL数据库服务器(称为主库,Master)的数据自动同步到一个或多个其他MySQL服务器(称为从库,Slave)上。用于在两个或多个MySQL服务器之间复制数据。它通常用于数据备份、读写分离、提高数据可用性和扩展性。
MySQL主从架构中的核心角色:
-
主库: 负责处理所有的写操作 和事务性更新。任何数据的变更(INSERT、UPDATE、DELETE)都必须在主库上进行。
-
从库: 负责复制主库的数据,并通常处理读操作。它通过读取主库的二进制日志来重放、执行相同的数据变更。
2.2 MySQL主从架构核心原理
2.2.1 主从架构执行过程
如下是MySQL主从架构在实际工作过程中的主要执行流程,具体来说,整个执行过程可以分为下面的步骤:
-
主库记录二进制日志: 当主库上有数据变更时,它会将变更事件以二进制的格式记录到Binlog中。
-
从库IO线程拉取日志: 从库的IO线程会连接到主库,并请求主库发送自指定位置之后的二进制日志内容。
-
主库Binlog Dump线程发送日志: 主库在收到从库的请求后,会创建一个Binlog Dump线程,负责向从库发送二进制日志事件。
-
从库写入中继日志: 从库的IO线程将接收到的二进制日志事件写入到本地的Relay Log中。
-
从库SQL线程重放日志: 从库的SQL线程会读取Relay Log中的事件,并在从库上重新执行这些SQL语句,从而使得从库的数据与主库保持一致。

2.2.2 主从架构核心角色与元素说明
在上面的架构图中,为了方便深入理解mysql主从架构的执行原理,对其中几个关键元素进行补充说明:
1)Binlog 日志
-
二进制日志(binlog):主服务器中的一个关键组件是二进制日志。二进制日志记录了所有更改数据的语句(如
INSERT、UPDATE和DELETE),以及DDL语句如CREATE TABLE和ALTER TABLE。这些记录是按照它们发生的顺序来写入的,允许服务器在必要时重放这些事件。
2)复制线程
-
IO线程:从服务器上的IO线程连接到主服务器,并请求从当前的二进制日志文件位置开始复制数据。主服务器接收到这个请求后,通过IO线程发送二进制日志的内容到从服务器。
-
SQL线程:接收到二进制日志内容后,从服务器将这些内容写入自己的中继日志(relay log)。从服务器上的SQL线程会读取中继日志,并在本地执行这些日志记录的SQL语句,从而使得从服务器的数据库与主服务器的数据库保持同步。
2.3 MySQL 主从架构特点
MySQL 主从架构具备如下优点:
| 特点 | 描述 |
| 数据冗余与备份 | 从库本质上是主库的一个实时“热备”,大大增强了数据安全性。 |
| 读写分离 | 可以将读请求分发到多个从库,极大地提升整个系统的查询吞吐量。 |
| 负载均衡 | 通过分散读负载,避免了单台数据库服务器的性能瓶颈。 |
| 高可用与故障转移 | 当主库出现故障时,可以快速将一个从库提升为新的主库,减少系统停机时间。 |
| 无阻塞数据分析 | 可以在从库上运行大量的报表查询或数据分析任务,而不影响主库的在线业务。 |
MySQL 主从架构的不足:
| 特点 | 描述 |
| 数据延迟 | 由于复制是异步的,从库的数据可能会比主库慢几毫秒或几秒,在极端情况下可能更久。 |
| 写操作扩展性有限 | 所有的写操作仍然集中在单个主库上,写性能无法通过增加从库来提升。 |
| 架构复杂性 | 引入了额外的运维复杂度,需要监控主从状态、处理复制错误等。 |
2.4 MySQL 主从架构使用场景
经过多年的发展与探索,在下面的一些场景中可以选择使用MySQL 主从架构
-
读写分离
-
描述: 这是最普遍的应用。应用程序在代码或中间件(如MyCat、ShardingSphere、ProxySQL)层面进行判断,将写请求发送到主库,将读请求随机或按策略发送到多个从库。
-
案例: 电商网站、社交应用等读多写少的业务。
-
-
数据备份与灾难恢复
-
描述: 使用一个从库专门用于执行物理或逻辑备份,而不会对主库造成任何锁表影响。同时,异地部署的从库可以作为异地容灾节点。
-
案例: 金融、政务等对数据安全要求极高的行业。
-
-
数据分析与报表
-
描述: 在从库上执行复杂的、耗时的数据分析查询和生成报表,这些操作通常涉及大量数据扫描和聚合,在从库执行可以完全避免对主库在线交易造成性能冲击。
-
案例: 商业智能系统、每日运营报表。
-
-
垂直拆分与业务隔离
-
描述: 可以将不同业务的读请求路由到不同的从库。例如,将一个从库专门服务于前端用户查询,另一个服务于内部运营平台。
-
案例: 大型互联网平台的微服务架构。
-
-
平滑升级与测试
-
描述: 可以先在从库上进行数据库版本升级或Schema变更,进行充分测试,确认无误后再对主库进行操作,降低风险。
-
案例: DBA进行数据库维护和变更。
-
小结:
总的来说,MySQL主从架构是一种以空间换时间、以冗余换可用的经典设计。它虽然不是分布式的银弹,无法解决写操作的扩展性问题,但在应对读多写少的业务场景时,是一种非常成熟、有效且成本相对较低的解决方案,是构建高性能、高可用现代应用数据库层的核心组件之一。
三、环境准备
3.1 服务器环境
准备一台服务器(或虚拟机),配置:2C4G(最低)
3.2 Docker环境
为了降低学习和操作难度,本文的案例中将使用docker来搭建一主一丛的架构,需要提前在服务器上按照完docker环境。
四、搭建MySql Master 容器
4.1 创建一个docker 网络
创建一个专用的Docker网络,便于容器间通过容器名通信
docker network create mysql-network
4.2 配置与启动主库 (Master)
4.2.1 执行以下命令启动主库容器,并挂载数据和配置目录
使用下面的命令启动第一个mysql容器
-
注意提前创建相关的数据映射目录
docker run -d --name mysql-master \
--network mysql-network \
-p 3306:3306 \
-v /usr/local/docker/sql/master/conf:/etc/mysql/conf.d \
-v /usr/local/docker/sql/master/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0.29
通过docker ps命令检查容器是否启动成功

参数说明:
-
-v /your_path/mysql-master/conf:/etc/mysql/conf.d:将宿主机配置目录挂载到容器内。 -
-v /your_path/mysql-master/data:/var/lib/mysql:挂载数据目录,实现数据持久化。 -
-e MYSQL_ROOT_PASSWORD=123456:设置MySQL root用户密码
4.2.2 创建配置文件
在宿主机上创建并编辑主库的配置文件 /your_path/mysql-master/conf/my.cnf,配置的内容如下:
[mysqld]
server-id=1
log-bin=mysql-bin
binlog_format=ROW
binlog-ignore-db=mysql
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
关键配置参数说明:
-
server-id=1:主库的唯一标识,必须唯一 -
log-bin=mysql-bin:开启二进制日志,这是主从复制的核心 -
binlog-ignore-db=mysql:忽略不需要复制的系统库
配置完成后,重启主库容器使配置生效
docker restart mysql-master

4.3 创建同步的数据库账户
进入主库容器,并登录MySQL
docker exec -it mysql-master mysql -uroot -p123456
在MySQL命令行中,执行以下操作:
-- 创建用于数据同步的用户,'slave'是用户名,'123456'是密码
CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
-- 授予复制权限
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
注意:MySQL 8默认使用caching_sha2_password认证,但部分从库可能兼容性不佳,因此这里显式指定为mysql_native_password

4.4 查看主库master状态
在主库MySQL命令行中,执行下面的命令:
SHOW MASTER STATUS;

在上图中,请记录下返回结果中的 File (例如 mysql-bin.000001) 和 Position (例如 849) 的值,下一步配置从库时会用到。
五、搭建Slave容器服务
5.1 启动Slave的mysql容器
执行以下命令启动从库容器
-
注意从库的端口映射为
3307:3306,以避免与主库冲突。
docker run -d --name mysql-slave \
--network mysql-network \
-p 3307:3306 \
-v /usr/local/docker/sql/slave/conf:/etc/mysql/conf.d \
-v /usr/local/docker/sql/slave/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0.29

5.2 配置从库my.cnf
在宿主机上创建并编辑从库的配置文件 /your_path/mysql-slave/conf/my.cnf,配置内容如下:
[mysqld]
server-id=2
log-bin=mysql-bin
binlog_format=ROW
relay_log=mysql-relay-bin
log_slave_updates=1
read_only=1
binlog-ignore-db=mysql
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
关键配置参数说明:
-
server-id=2:从库的唯一标识,必须与主库不同 -
relay_log=mysql-relay-bin:配置中继日志 -
read_only=1:设置从库为只读模式(具有super权限的用户除外),防止误操作
配置完成后,重启从库容器
docker restart mysql-slave

六、配置mysql 主从关系
在从库上配置主从关系,进入从库容器,并登录MySQL
docker exec -it mysql-slave mysql -uroot -p123456
6.1 配置主从同步过程
1)从机客户端执行下面的命令
在从库的下面的MySQL命令行中,请将 MASTER_LOG_FILE 和 MASTER_LOG_POS 的值替换为你之前记录的主库状态值
CHANGE MASTER TO MASTER_HOST='mysql-master',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=849;

2)启动从库复制进程
在从库的命令行继续执行
START SLAVE;

3)查看主从同步状态
SHOW SLAVE STATUS\G
在展示出的参数信息中,关键是要检查下面这两项:
-
Slave_IO_Running: Yes -
Slave_SQL_Running: Yes-
如果这两项均为
Yes,恭喜你,主从复制链路已经成功建立
-
如下,如果上面的2项都为YES,说明主从复制链路已经成功建立

6.2 效果验证
使用客户端工具,比如navicat连接,在master创建一个数据库,可以看到很快就能在slave数据库也创建出来了
七、常见问题补充说明
在搭建主从服务过程中,可能会遇到下面的问题,可以参考如下解决办法。
-
常见问题:如果
SHOW SLAVE STATUS显示 IO 或 SQL 线程不是Yes,可以检查Last_IO_Error或Last_SQL_Error字段获取错误信息。-
常见原因包括主从密码错误、
server-id冲突、防火墙或网络问题导致从库无法连接主库等。
-
-
连接问题:
-
确保从库容器能通过
mysql-master主机名访问主库。在从库容器内使用ping mysql-master测试。
-
-
已有数据的数据库:
-
如果主库已有数据,需要先将主库数据导出,导入从库,再配置主从,否则会因初始数据不一致导致失败。可以使用
mysqldump工具。
-
八、写在文末
本文通过实际案例操作,详细演示了基于Docker环境搭建mysql主从服务的详细过程,更多细节的配置有兴趣的同学可以在此基础上继续深入研究,本篇到此结束,感谢观看。
更多推荐


所有评论(0)