MySQL 主从复制架构详解
MySQL 版本: Linux 操作系统版本:
MySQL 主从复制架构通过主库写入 Binlog,从库 I/O 线程接收并写入 Relay Log,SQL 线程回放实现数据同步。基于 Docker 在 Ubuntu 上演示一主一从、一主多从及多主多从模式,涵盖 Docker 安装配置、MySQL 容器化部署、主从账号权限设置及复制启动验证流程,帮助理解读写分离与高可用架构原理。

MySQL 版本: Linux 操作系统版本:
8.0.44Ubuntu 24.04 LTS在单一服务器上安装和运行 MySQL 数据库,多个应用程序都访问同一台数据库服务器。
优点:
缺点:
通过多台服务器协同工作来提高数据库性能、可用性和可扩展性。
优点:
缺点:
添加 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
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't be verified because the public key is not available: NO_PUBKEY ...
解决方法:把 Docker 官方的公钥添加到你的系统中。
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7EA0A9C3F273FCD8
# 更新 APT 包索引
apt update
# 安装 Docker
apt install docker-ce docker-ce-cli containerd.io -y
# 查看状态
systemctl status docker
# 查看版本
docker version
# 设置开机自启动
systemctl enable docker
# 查看是否开机启动
systemctl list-unit-files | grep docker.service
# 停止防火墙
systemctl stop ufw
# 查看防火墙状态
systemctl status ufw
# 禁用防火墙开机自启动
systemctl disable ufw
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerhub.timeweb.cloud",
"https://huecker.io"
]
}
一台主服务器主要负责读写操作,一台从服务器主要负责读操作或备份。
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 随便设置,保证不重复即可
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
# 重启容器,使配置生效
docker restart org-mysql-master
# 进入容器
docker exec -it org-mysql-master env LANG=C.UTF-8 /bin/bash
# 登录 MySQL
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;
-- 查看 master 状态,记录 File 和 Position 的值
SHOW MASTER STATUS;
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 随便设置,保证不重复即可
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
# 重启容器,使配置生效
docker restart org-mysql-slave1
# 进入容器
docker exec -it org-mysql-slave1 env LANG=C.UTF-8 /bin/bash
# 登录 MySQL
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;
# 在从服务器中启动复制
mysql> START REPLICA;
-- 查看从服务器状态
mysql> SHOW REPLICA STATUS\G;

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online
解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL转CSV/JSON/XML在线工具,online