首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >深入解析MySQL(9)——主从复制架构详解

深入解析MySQL(9)——主从复制架构详解

作者头像
用户11873138
发布2026-01-13 21:46:04
发布2026-01-13 21:46:04
2290
举报

MySQL版本:8.0.44 Linux操作系统版本:Ubuntu 24.04 LTS

1.MySQL集群

1.1 单机模式

在单一服务器上安装和运行MySQL数据库,多个应用程序都访问同一台数据库服务器

在这里插入图片描述
在这里插入图片描述

优点:

  • 简单易用:部署和维护成本低,无需配置复杂的集群管理工具或分布式协议
  • 低成本:无需额外购买多台服务器或负载均衡设备,硬件和运维成本较低

缺点:

  • 单点故障风险:所有数据和服务依赖单一节点,一旦服务器硬件故障或网络问题,整个系统将不可用
  • 读写压力集中:所有读写请求集中在单台服务器,可能成为性能瓶颈,尤其在数据量或并发量大的场景下

1.2 集群模式

通过多台服务器协同工作来提高数据库性能、可用性和可扩展性

在这里插入图片描述
在这里插入图片描述

优点:

  • 负载均衡:读操作可分散到多个从节点,降低主节点压力
  • 数据冗余:数据在多个节点同步存储,避免单点故障导致数据丢失
  • 扩展性:水平扩展能力强,可通过增加节点提升处理能力

缺点:

  • 数据同步延迟:异步复制可能导致从节点数据滞后,尤其在网络波动或高负载时
  • 资源消耗:多节点需额外硬件资源
  • 配置复杂度高:集群部署需调整多项参数,维护成本较高

1.3 主从结构

1.3.1 角色

主服务器(Master):主要负责写操作和简单查询操作 从服务器(Slave):主要负责复杂查询操作和备份

1.3.2 原理
  • 主库的Binlog Dump Thread:当从库连接主库时,主库创建一个Binlog Dump Thread,负责将二进制日志内容发送给从库
  • 从库的I/O Thread:接收主库的二进制日志事件并写入从库的中继日志(Relay Log)
  • 从库的SQL Thread:读取中继日志(Relay Log)中的事件并执行,实现数据同步
在这里插入图片描述
在这里插入图片描述
  1. Slave连接master,读取master的版本和时钟信息,并在master中注册自己
  2. Master根据Slave的连接数为每个连接创建Binlog Dump Thread
  3. Master节点在进行insert、update、delete操作时,把相应操作按执行顺序写入Binary Log
  4. 当Master节点的Binary Log发生变化时,Binlog Dump Thread通知所有Slave节点,并把Binary Log的增量内容以event的方式推送给Slave的I/O Thread
  5. Slave的I/O Thread把接收到的内容写入Relay Log
  6. Slave的SQL Thread读取Relay Log的内容
  7. Slave的SQL Thread解析日志并转为SQL进行回放操作,把数据写入Databases

1.4 高性能架构

  • 读写分离:将读操作和写操作分发到不同的数据库节点,提升系统整体性能。写操作集中在主库(Master),读操作分散到从库(Slave)
  • 数据库分片:将数据水平拆分到多个独立数据库实例(database),解决单库数据量过大导致的性能瓶颈

2.Ubuntu系统安装Docker

2.1 添加Docker官方密钥

添加Docker官方GPG密钥是为了验证从Docker仓库下载的软件包的真实性和完整性

  • 验证软件源的真实性
    • 确保你下载的Docker软件包确实来自官方
    • 防止中间人攻击或恶意镜像站提供被篡改的软件包
  • 确保软件包完整性
    • 用GPG密钥验证软件包的数字签名
    • 确认软件在传输过程中没有被修改
代码语言:javascript
复制
apt install apt-transport-https ca-certificates curl software-propertiescommon -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 1. 下载Docker官方的公钥
# 2. 存储在系统的密钥环中
# 3. APT在安装时会用这个密钥验证软件包签名

2.2 添加阿里云Docker APT源

Docker官方服务器位于国外,国内访问速度慢。阿里云在国内,下载速度通常能大幅提升

代码语言:javascript
复制
add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/dockerce/linux/ubuntu $(lsb_release -cs) stable"

可能出现的错误信息:

代码语言:javascript
复制
W: GPG error: https://mirrors.aliyun.com/docker-ce/linux/ubuntu noble
InRelease: The following signatures couldn't be verified because the public
key is not available: NO_PUBKEY 7EA0A9C3F273FCD8

简单来说,这个错误的意思是:“阿里云给了我Docker的软件列表,并且说这是用7EA0A9C3F273FCD8这个钥匙签名的,但是我的钥匙串里没有这把钥匙,所以我无法确认这是不是真的Docker官方列表。” 解决方法: 把Docker官方的公钥添加到你的系统中

代码语言:javascript
复制
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7EA0A9C3F273FCD8

2.3 安装Docker

代码语言:javascript
复制
#更新APT包索引
apt update
#安装Docker
apt install docker-ce docker-ce-cli containerd.io -y

2.4 查看结果

代码语言:javascript
复制
# 查看状态
systemctl status docker
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
# 查看版本
docker version
在这里插入图片描述
在这里插入图片描述

2.5 设置配置

代码语言:javascript
复制
# 设置开机自启动
root@VM-0-7-ubuntu:~# systemctl enable docker
# 查看是否开机启动
root@VM-0-7-ubuntu:~# systemctl list-unit-files|grep docker.service
docker.service                                                                enabled         enabled
代码语言:javascript
复制
# 停止防火墙
root@VM-0-7-ubuntu:~# systemctl stop ufw
# 查看防火墙
root@VM-0-7-ubuntu:~# systemctl status ufw
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
# 禁用防火墙开机自启动
systemctl disable ufw

2.6 修改镜像源

代码语言:javascript
复制
vim /etc/docker/daemon.json
代码语言:javascript
复制
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://dockerhub.timeweb.cloud",
    "https://huecker.io"
  ]
}

3.主从复制

3.1 一主一从

  • ⼀台主服务器主要负责读写操作,⼀台从服务器主要负责读操作或备份(本文演示该模式,但在实际开发中不常用)
在这里插入图片描述
在这里插入图片描述

3.2 一主多从

  • ⼀台主服务器负责写操作,多台从服务器负责读操作和备份。从节点从主节点同步数据
在这里插入图片描述
在这里插入图片描述
  • ⼀台主服务器负责写操作,多台从服务器负责读操作和备份。其中⼀个从节点从主节点同步数据,并为其他从节点提供数据同步服务,这样可以降低主节点数据同步的压力
在这里插入图片描述
在这里插入图片描述

3.3 多主多从

在这里插入图片描述
在这里插入图片描述

3.4 主库配置

代码语言:javascript
复制
docker run \
-d \
-p 53306:3306 \
-v /org/mysql/master/conf:/etc/mysql/conf.d \
-v /org/mysql/master/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name org-mysql-master \
mysql:8.0.44

docker run

  • 作用:创建并启动一个新的容器
  • docker create:只创建不启动
  • docker start:启动已存在的容器
  • docker run = create + start

-d

  • 作用:在后台运行容器(守护进程模式)

-p 53306:3306

  • 格式:-p 宿主机端口:容器端口
  • 作用:端口映射

-v /org/mysql/master/conf:/etc/mysql/conf.d

作用:数据卷挂载 - 数据库数据,容器删除后数据不会丢失

代码语言:javascript
复制
宿主机:/org/mysql/master/mysql
       ↓ 挂载(双向同步)
容器内:/var/lib/mysql

-e MYSQL_ROOT_PASSWORD=123456

  • 格式:-e 环境变量名=值
  • 作用: 设置容器内的环境变量

–name org-mysql-master

  • 作用:给容器命名

mysql:8.0.44(指定版本)

代码语言:javascript
复制
# 在配置文件中添加如下配置
root@VM-0-7-ubuntu:~# vim /org/mysql/master/conf/my.cnf
代码语言:javascript
复制
# MySQL服务器节点
[mysqld]
# server-id随便设置,保证不重复即可
server-id=11253306
log-bin=binlog
binlog_format=ROW
binlog_expire_logs_seconds=864000
sync-binlog=1
#指定需要复制的数据库,默认全部
# binlog-do-db=db_name
#设置不需要复制的数据库
# binlog-ignore-db=db_name1
# binlog-ignore-db=db_name2
代码语言:javascript
复制
# 重启容器,使配置⽣效
root@VM-0-7-ubuntu:~# docker restart org-mysql-master
# 进入容器
root@VM-0-7-ubuntu:~# docker exec -it org-mysql-master env LANG=C.UTF-8 /bin/bash
bash-5.1# mysql -uroot -p
代码语言:javascript
复制
mysql> set password = '123456';
# 查看配置是否⽣效
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|    13803306 |
+-------------+
-- 为从服务器创建访问账号并设置密码,⽤于从服务器登录主服务器
mysql> create user 'org_slave'@'%' identified with mysql_native_password by '123456';
-- 为用户赋予复制权限
mysql> grant replication slave on *.* to 'org_slave'@'%';
-- 刷新权限
mysql> flush privileges;
-- 查看master状态,记录File和Position的值,
-- 之后要在从服务器中配置中⽤到这两个值,表⽰从哪个⽇志⽂件中的哪个位置开始同步数据
mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000004 |      157 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+

3.5 从库配置

代码语言:javascript
复制
docker run \
-d \
-p 53307:3306 \
-v /org/mysql/slave1/conf:/etc/mysql/conf.d \
-v /org/mysql/slave1/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name org-mysql-slave1 \
mysql:8.0.44
代码语言:javascript
复制
# 在配置文件中添加如下配置
root@VM-0-7-ubuntu:~# vim /org/mysql/slave1/conf/my.cnf
代码语言:javascript
复制
[mysqld]
# server-id随便设置,保证不重复即可
server-id=11253307
log-bin=binlog
binlog_format=ROW
binlog_expire_logs_seconds=864000
sync-binlog=1
########################### 从服务器配置 ##################################
#中继日志基本名
relay-log=relay-bin
#服务器启动时不启动复制,通过手动启动
skip-replica-start=ON
# 链式日志同步,如上图“一主多从”模式的第二种模式
# log-replica-updates=ON
# 禁用二进制日志
# skip-log-bin
###########################################################################
#指定需要复制的数据库,默认全部
# binlog-do-db=db_name
#设置不需要复制的数据库
# binlog-ignore-db=db_name1
# binlog-ignore-db=db_name2
代码语言:javascript
复制
# 重启容器,使配置⽣效
root@VM-0-7-ubuntu:~# docker restart org-mysql-slave1
# 进入容器
root@VM-0-7-ubuntu:~# docker exec -it org-mysql-slave1 env LANG=C.UTF-8 /bin/bash
bash-5.1# mysql -uroot -p
代码语言:javascript
复制
mysql> set password = '123456';
# 查看配置是否⽣效
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|    13803307 |
+-------------+
mysql> change master to
	master_host = '81.69.218.112',
	master_port = 53306,
	master_user = 'org_slave',
	master_password = '123456',
	master_log_file = 'binlog.000004',
	master_log_pos = 157;

3.6 启动主从复制

代码语言:javascript
复制
# 在从服务器中启动复制
mysql> start replica;
# 查看从服务器状态
mysql> show replica status\G;

4.下节预告

深入解析MySQL(10)——基于ShardingSphere的高性能架构详解

5.我的博客即将同步至腾讯云开发者社区声明

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-01-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.MySQL集群
    • 1.1 单机模式
    • 1.2 集群模式
    • 1.3 主从结构
      • 1.3.1 角色
      • 1.3.2 原理
    • 1.4 高性能架构
  • 2.Ubuntu系统安装Docker
    • 2.1 添加Docker官方密钥
    • 2.2 添加阿里云Docker APT源
    • 2.3 安装Docker
    • 2.4 查看结果
    • 2.5 设置配置
    • 2.6 修改镜像源
  • 3.主从复制
    • 3.1 一主一从
    • 3.2 一主多从
    • 3.3 多主多从
    • 3.4 主库配置
    • 3.5 从库配置
    • 3.6 启动主从复制
  • 4.下节预告
  • 5.我的博客即将同步至腾讯云开发者社区声明
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档