目录

一、前言

二、MySQL主从架构介绍

2.1 什么是MySQL主从架构

2.2 MySQL主从架构核心原理

2.2.1 主从架构执行过程

2.2.2 主从架构核心角色与元素说明

2.3 MySQL 主从架构特点

2.4 MySQL 主从架构使用场景

三、环境准备

3.1 服务器环境

3.2 Docker环境

四、搭建MySql Master 容器

4.1 创建一个docker 网络

4.2 配置与启动主库 (Master)

4.2.1 执行以下命令启动主库容器,并挂载数据和配置目录

4.2.2 创建配置文件

4.3 创建同步的数据库账户

4.4 查看主库master状态

五、搭建Slave容器服务

5.1 启动Slave的mysql容器

5.2 配置从库my.cnf

六、配置mysql 主从关系

6.1 配置主从同步过程

6.2 效果验证

七、常见问题补充说明

八、写在文末


一、前言

在日常的开发中,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主从架构在实际工作过程中的主要执行流程,具体来说,整个执行过程可以分为下面的步骤:

  1. 主库记录二进制日志: 当主库上有数据变更时,它会将变更事件以二进制的格式记录到Binlog中。

  2. 从库IO线程拉取日志: 从库的IO线程会连接到主库,并请求主库发送自指定位置之后的二进制日志内容。

  3. 主库Binlog Dump线程发送日志: 主库在收到从库的请求后,会创建一个Binlog Dump线程,负责向从库发送二进制日志事件。

  4. 从库写入中继日志: 从库的IO线程将接收到的二进制日志事件写入到本地的Relay Log中。

  5. 从库SQL线程重放日志: 从库的SQL线程会读取Relay Log中的事件,并在从库上重新执行这些SQL语句,从而使得从库的数据与主库保持一致。

2.2.2 主从架构核心角色与元素说明

在上面的架构图中,为了方便深入理解mysql主从架构的执行原理,对其中几个关键元素进行补充说明:

1)Binlog 日志

  • 二进制日志(binlog):主服务器中的一个关键组件是二进制日志。二进制日志记录了所有更改数据的语句(如 INSERTUPDATEDELETE),以及DDL语句如 CREATE TABLEALTER TABLE。这些记录是按照它们发生的顺序来写入的,允许服务器在必要时重放这些事件。

2)复制线程

  • IO线程:从服务器上的IO线程连接到主服务器,并请求从当前的二进制日志文件位置开始复制数据。主服务器接收到这个请求后,通过IO线程发送二进制日志的内容到从服务器。

  • SQL线程:接收到二进制日志内容后,从服务器将这些内容写入自己的中继日志(relay log)。从服务器上的SQL线程会读取中继日志,并在本地执行这些日志记录的SQL语句,从而使得从服务器的数据库与主服务器的数据库保持同步。

2.3 MySQL 主从架构特点

MySQL 主从架构具备如下优点:

特点 描述
数据冗余与备份 从库本质上是主库的一个实时“热备”,大大增强了数据安全性。
读写分离 可以将读请求分发到多个从库,极大地提升整个系统的查询吞吐量。
负载均衡 通过分散读负载,避免了单台数据库服务器的性能瓶颈。
高可用与故障转移 当主库出现故障时,可以快速将一个从库提升为新的主库,减少系统停机时间。
无阻塞数据分析 可以在从库上运行大量的报表查询或数据分析任务,而不影响主库的在线业务。

MySQL 主从架构的不足:

特点 描述
数据延迟 由于复制是异步的,从库的数据可能会比主库慢几毫秒或几秒,在极端情况下可能更久。
写操作扩展性有限 所有的写操作仍然集中在单个主库上,写性能无法通过增加从库来提升。
架构复杂性 引入了额外的运维复杂度,需要监控主从状态、处理复制错误等。

2.4 MySQL 主从架构使用场景

经过多年的发展与探索,在下面的一些场景中可以选择使用MySQL 主从架构

  1. 读写分离

    1. 描述: 这是最普遍的应用。应用程序在代码或中间件(如MyCat、ShardingSphere、ProxySQL)层面进行判断,将写请求发送到主库,将读请求随机或按策略发送到多个从库。

    2. 案例: 电商网站、社交应用等读多写少的业务。

  2. 数据备份与灾难恢复

    1. 描述: 使用一个从库专门用于执行物理或逻辑备份,而不会对主库造成任何锁表影响。同时,异地部署的从库可以作为异地容灾节点。

    2. 案例: 金融、政务等对数据安全要求极高的行业。

  3. 数据分析与报表

    1. 描述: 在从库上执行复杂的、耗时的数据分析查询和生成报表,这些操作通常涉及大量数据扫描和聚合,在从库执行可以完全避免对主库在线交易造成性能冲击。

    2. 案例: 商业智能系统、每日运营报表。

  4. 垂直拆分与业务隔离

    1. 描述: 可以将不同业务的读请求路由到不同的从库。例如,将一个从库专门服务于前端用户查询,另一个服务于内部运营平台。

    2. 案例: 大型互联网平台的微服务架构。

  5. 平滑升级与测试

    1. 描述: 可以先在从库上进行数据库版本升级或Schema变更,进行充分测试,确认无误后再对主库进行操作,降低风险。

    2. 案例: 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_FILEMASTER_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_ErrorLast_SQL_Error 字段获取错误信息。

    • 常见原因包括主从密码错误、server-id冲突、防火墙或网络问题导致从库无法连接主库等。

  • 连接问题:

    • 确保从库容器能通过mysql-master主机名访问主库。在从库容器内使用 ping mysql-master 测试。

  • 已有数据的数据库:

    • 如果主库已有数据,需要先将主库数据导出,导入从库,再配置主从,否则会因初始数据不一致导致失败。可以使用 mysqldump 工具。

八、写在文末

本文通过实际案例操作,详细演示了基于Docker环境搭建mysql主从服务的详细过程,更多细节的配置有兴趣的同学可以在此基础上继续深入研究,本篇到此结束,感谢观看。

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐