跳到主要内容MySQL 主从复制架构详解 | 极客日志SQLjava
MySQL 主从复制架构详解
MySQL 主从复制架构通过主库写入 Binlog,从库 I/O 线程接收并写入 Relay Log,SQL 线程回放实现数据同步。基于 Docker 在 Ubuntu 上演示一主一从、一主多从及多主多从模式,涵盖 Docker 安装配置、MySQL 容器化部署、主从账号权限设置及复制启动验证流程,帮助理解读写分离与高可用架构原理。
星河入梦7.1K 浏览 MySQL 主从复制架构详解
MySQL 版本:8.0.44
Linux 操作系统版本:Ubuntu 24.04 LTS
1. MySQL 集群
1.1 单机模式
在单一服务器上安装和运行 MySQL 数据库,多个应用程序都访问同一台数据库服务器。
优点:
- 简单易用:部署和维护成本低,无需配置复杂的集群管理工具或分布式协议。
- 低成本:无需额外购买多台服务器或负载均衡设备,硬件和运维成本较低。
缺点:
- 单点故障风险:所有数据和服务依赖单一节点,一旦服务器硬件故障或网络问题,整个系统将不可用。
- 读写压力集中:所有读写请求集中在单台服务器,可能成为性能瓶颈,尤其在数据量或并发量大的场景下。
1.2 集群模式
通过多台服务器协同工作来提高数据库性能、可用性和可扩展性。
优点:
- 负载均衡:读操作可分散到多个从节点,降低主节点压力。
- 数据冗余:数据在多个节点同步存储,避免单点故障导致数据丢失。
- 扩展性:水平扩展能力强,可通过增加节点提升处理能力。
缺点:
- 数据同步延迟:异步复制可能导致从节点数据滞后,尤其在网络波动或高负载时。
- 资源消耗:多节点需额外硬件资源。
- 配置复杂度高:集群部署需调整多项参数,维护成本较高。
1.3 主从结构
1.3.1 角色
- 主服务器 (Master):主要负责写操作和简单查询操作。
- 从服务器 (Slave/Replica):主要负责复杂查询操作和备份。
1.3.2 原理
- 主库的 Binlog Dump Thread:当从库连接主库时,主库创建一个 Binlog Dump Thread,负责将二进制日志内容发送给从库。
- 从库的 I/O Thread:接收主库的二进制日志事件并写入从库的中继日志 (Relay Log)。
- 从库的 SQL Thread:读取中继日志 (Relay Log) 中的事件并执行,实现数据同步。

- Slave 连接 Master,读取 Master 的版本和时钟信息,并在 Master 中注册自己。
- Master 根据 Slave 的连接数为每个连接创建 Binlog Dump Thread。
- Master 节点在进行 insert、update、delete 操作时,把相应操作按执行顺序写入 Binary Log。
- 当 Master 节点的 Binary Log 发生变化时,Binlog Dump Thread 通知所有 Slave 节点,并把 Binary Log 的增量内容以 event 的方式推送给 Slave 的 I/O Thread。
Slave 的 I/O Thread 把接收到的内容写入 Relay Log。Slave 的 SQL Thread 读取 Relay Log 的内容。Slave 的 SQL Thread 解析日志并转为 SQL 进行回放操作,把数据写入 Databases。1.4 高性能架构
- 读写分离:将读操作和写操作分发到不同的数据库节点,提升系统整体性能。写操作集中在主库 (Master),读操作分散到从库 (Slave)。
- 数据库分片:将数据水平拆分到多个独立数据库实例 (database),解决单库数据量过大导致的性能瓶颈。
2. Ubuntu 系统安装 Docker
2.1 添加 Docker 官方密钥
添加 Docker 官方 GPG 密钥是为了验证从 Docker 仓库下载的软件包的真实性和完整性。
apt install apt-transport-https ca-certificates curl software-properties-common -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
2.2 添加阿里云 Docker APT 源
Docker 官方服务器位于国外,国内访问速度慢。阿里云在国内,下载速度通常能大幅提升。
add-apt-repository "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
W: GPG error: ... The following signatures couldn
解决方法:把 Docker 官方的公钥添加到你的系统中。
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7EA0A9C3F273FCD8
2.3 安装 Docker
apt update
apt install docker-ce docker-ce-cli containerd.io -y
2.4 查看结果
2.5 设置配置
systemctl enable docker
systemctl list-unit-files | grep docker.service
systemctl stop ufw
systemctl status ufw
2.6 修改镜像源
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerhub.timeweb.cloud",
"https://huecker.io"
]
}
3. 主从复制
3.1 一主一从
一台主服务器主要负责读写操作,一台从服务器主要负责读操作或备份。
3.2 一主多从
- 一台主服务器负责写操作,多台从服务器负责读操作和备份。从节点从主节点同步数据。
- 一台主服务器负责写操作,多台从服务器负责读操作和备份。其中一个从节点从主节点同步数据,并为其他从节点提供数据同步服务,这样可以降低主节点数据同步的压力。
3.3 多主多从
3.4 主库配置
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
-d:在后台运行容器(守护进程模式)。
-p 53306:3306:端口映射,格式为 宿主机端口:容器端口。
-v:数据卷挂载,数据库数据持久化。
-e:设置环境变量。
--name:容器命名。
vim /org/mysql/master/conf/my.cnf
[mysqld]
server-id = 11253306
log-bin = binlog
binlog_format = ROW
binlog_expire_logs_seconds = 864000
sync-binlog = 1
docker restart org-mysql-master
docker exec -it org-mysql-master env LANG=C.UTF-8 /bin/bash
mysql -uroot -p
SET PASSWORD = '123456';
SELECT @@server_id;
CREATE USER 'org_slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'org_slave'@'%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS;
3.5 从库配置
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
vim /org/mysql/slave1/conf/my.cnf
[mysqld]
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
docker restart org-mysql-slave1
docker exec -it org-mysql-slave1 env LANG=C.UTF-8 /bin/bash
mysql -uroot -p
SET PASSWORD = '123456';
SELECT @@server_id;
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 启动主从复制
mysql> START REPLICA;
-- 查看从服务器状态
mysql> SHOW REPLICA STATUS\G;
相关免费在线工具
- Keycode 信息
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
- Escape 与 Native 编解码
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
- JavaScript / HTML 格式化
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
- JavaScript 压缩与混淆
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
- SQL 美化和格式化
在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online
- SQL转CSV/JSON/XML
解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL转CSV/JSON/XML在线工具,online