📑 目录
- [什么是 DRBD?](#什么是 DRBD?)
- 名词解释(命令与术语)
- 相关概念与方案一览
- [DRBD 架构与工作原理](#DRBD 架构与工作原理)
- [DRBD 配置详解](#DRBD 配置详解)
- [DRBD 部署实战](#DRBD 部署实战)
- [DRBD 与 Corosync 集成](#DRBD 与 Corosync 集成)
- [DRBD 状态监控](#DRBD 状态监控)
- 常见问题与故障排查
- [DRBD 性能优化](#DRBD 性能优化)
- 最佳实践
- 总结
- 官方文档与参考
🎯 什么是 DRBD?
核心概念
DRBD (Distributed Replicated Block Device) 是一种分布式复制块设备,工作在 Linux 内核层面的块级数据复制解决方案。

生活类比:
- DRBD 就像是两台打印机之间的"同步复印功能"
- 主节点 = 你正在使用的打印机
- 从节点 = 备用打印机,自动接收所有打印任务
- 块级复制 = 复印整页内容,而不是逐字抄写
官方定义简述 (来源:LINBIT DRBD User Guide):DRBD 是一种基于软件、无共享(shared-nothing)的复制存储方案,将块设备(硬盘、分区、逻辑卷等)的内容在多个主机之间镜像 。复制是实时、透明 的,应用无需感知数据存于多台主机;支持同步或异步镜像------同步时写完成要等所有(已连接)主机都写完才返回,异步时本地写完即可返回(通常早于传到对端)。
📖 名词解释(命令与术语)
以下对文档中出现的命令、配置项、状态字段做简要解释,并配上生活例子,便于记忆。
常用命令
| 命令/名称 | 全称或含义 | 说明 | 生活例子 |
|---|---|---|---|
| drbdadm | DRBD Administration | 高层管理工具,从 /etc/drbd.conf 读配置并调用 drbdsetup/drbdmeta |
像「项目经理」:看图纸(配置)派活,不亲自拧螺丝 |
| drbdsetup | DRBD Setup | 直接配置内核中的 DRBD 模块,参数需命令行传入 | 像「现场工人」:直接动手调设备,一般用 drbdadm 即可 |
| drbdmeta | DRBD Metadata | 创建、导出、修改 DRBD 元数据结构 | 像「档案员」:管元数据这本「账」,普通运维很少直接敲 |
| drbdadm create-md | Create Metadata | 在底层设备上初始化 DRBD 元数据(首次建资源必做) | 像「给新本子写扉页」:在磁盘上划出一块记「谁和谁在同步、哪些块已同步」 |
| drbdadm up | Up (bring up) | 启动资源,建立网络连接,使设备可用 | 像「开门营业」:把资源拉起来、和对端连上 |
| drbdadm primary | Primary role | 将本节点提升为主节点,可挂载、读写 | 像「接过话筒」:只有主能挂文件系统、写数据 |
| drbdadm secondary | Secondary role | 将本节点降为从节点,仅接收同步 | 像「交还话筒」:不能再挂载,只当备份接收数据 |
| drbdadm connect --discard-my-data | Connect, discard my data | 脑裂恢复时本节点丢弃本地数据、以对端为准 | 像「以对方账本为准,我这本作废」 |
配置与概念
| 名词 | 含义 | 生活例子 |
|---|---|---|
| resource | 一个复制单元的名字,对应一份「镜像对」 | 像给一对同步文件夹起名,如 mysql、web |
| device | DRBD 虚拟块设备,如 /dev/drbd0 |
像「虚拟U盘」:上层当普通块设备用,底层在两边同步 |
| protocol A/B/C | 复制协议:A 异步、B 半同步、C 同步 | 见下文「复制模式对比」 |
| meta-disk internal/external | 元数据写在数据盘末尾 / 单独分区 | internal=笔记写在书最后一页;external=另备一本笔记本 |
| cs (connection state) | 连接状态:Connected、SyncSource、WFConnection 等 | 像「电话是否接通、是否正在传文件」 |
| ro (role) | 角色:Primary/Secondary | 谁在「主」谁在「从」 |
| ds (disk state) | 磁盘状态:UpToDate、Inconsistent、Diskless | 像「本地数据是否和对端一致、是否缺盘」 |
| syncer | 同步器配置(速率、活动日志等) | 像「传文件的限速和记录本」 |
DRBD vs RAID 对比
RAID
同服务器复制
相同物理位置
总线传输
DRBD
跨服务器复制
不同物理位置
网络传输
| 特性 | DRBD | RAID1(镜像) |
|---|---|---|
| 复制范围 | 跨服务器,可异地 | 同一服务器内 |
| 传输方式 | 网络复制 | 磁盘总线复制 |
| 距离限制 | 理论无限制(受网络延迟影响) | 受限于线缆长度 |
| 灾难恢复 | 防止机房级灾难 | 只能防止单盘故障 |
| 性能影响 | 受网络带宽影响 | 几乎无影响 |
| 成本 | 需要两台独立服务器 | 只需一台服务器 |
生活类比:
- DRBD = 把一份文件同时传给北京和上海的朋友
- RAID1 = 在同一个房间里复印两份文件
DRBD vs 其他复制方式 对比
| 维度 | DRBD | rsync / 文件同步 | 存储阵列复制(如 SAN 双活) |
|---|---|---|---|
| 层级 | 块设备层 | 文件/目录层 | 存储设备层 |
| 实时性 | 实时块级同步 | 定时或触发,非实时 | 实时(视产品) |
| 一致性 | 块一致,可配合任意文件系统 | 依赖同步时点,可能不一致 | 由阵列保证 |
| 主从切换 | 需提升 Primary,配合集群 | 需应用层或脚本切换 | 通常由阵列/多路径决定 |
| 典型场景 | 双机 HA、数据库镜像 | 备份、批量同步文件 | 企业存储高可用 |
| 生活例子 | 两台电视同步播同一节目 | 定期把 U 盘拷到移动硬盘 | 商场总机房和分机房存储柜同步 |
🔀 相关概念与方案一览
一、容易混淆的概念
块复制、主从、同步、脑裂等说法在不同技术里含义略有差别,稍作梳理有助于和 DRBD 一起理解。
1. 主/从在不同产品里指什么
| 产品/场景 | 「主」的含义 | 「从」的含义 | 备注 |
|---|---|---|---|
| DRBD | Primary:可挂载、读写,数据同步源 | Secondary:仅接收同步,不可挂载 | 单主时仅一个 Primary,双主需配合集群 FS |
| MySQL 主从 | 主库:接受写、binlog 源 | 从库:只读、拉取 binlog 重放 | 应用层主从;DRBD 在块层,不关心库内容 |
| Pacemaker 资源 | Master:资源运行并承担主角色 | Slave:资源运行但从角色 | 谁当主由 Pacemaker 管,DRBD 负责块镜像 |
| 数据库 Active/Passive | Active:对外服务 | Passive:待机接管 | 常与 DRBD 单主一起用:主节点 Active+Primary,从节点 Passive+Secondary |
可以简单记:DRBD 的主从管的是「谁有权写这块盘 」,数据库的主从管的是「谁处理写请求」。实践中主库往往跑在 DRBD Primary 上,从库在 Secondary 上,二者配合使用。
2. 「同步」在块、库、文件里的不同含义
| 维度 | DRBD Protocol C | 数据库半同步复制 | 文件同步(rsync/scp) |
|---|---|---|---|
| 层级 | 块设备 | 事务/日志 | 文件/目录 |
| 「同步」指 | 写块在本地和对端都落盘后返回 | 事务在从库落盘(或从库确认收到)后返回 | 某次同步任务完成时点一致 |
| 一致性粒度 | 块一致 | 事务一致 | 文件级,非实时 |
| 切换后 | 块连续、可挂 FS | 从库可提升为主库 | 需再次同步或脚本切换 |
3. 脑裂(Split-Brain)在几种场景下的含义
| 场景 | 含义 | 常见应对 |
|---|---|---|
| DRBD | 两边都变成 Primary 并写入,数据分歧 | 人工选一边,另一边 discard-my-data 或以对方为准 |
| 集群(Pacemaker) | 网络分区后两边都认为自己是多数派 | Quorum、Fencing(STONITH) |
| 数据库主从 | 误把从库当主写,或双主同时写 | 避免双写、用 GTID/位点做一致性选择 |
二、块级与高可用存储的生态
DRBD 做的是块级、主机间镜像;同一类需求下还会遇到下面这些方案,放在一起看会更有数。
块级复制 / 高可用存储
| 软件/方案 | 类型 | 特点 | 简要说明 |
|---|---|---|---|
| DRBD | 内核块设备镜像 | 双机(或多机)块同步,主从或双主+集群 FS,配置清晰 | 成熟、与 Pacemaker 集成好,适合双机 HA |
| Ceph RBD | 分布式块存储 | 多副本、多节点、自愈,需 Ceph 集群 | 规模大、多节点时更合适;双机简单 HA 用 DRBD 更轻 |
| GlusterFS(块) | 通常用文件层 | Gluster 以文件/卷为主,块需另配(如 QEMU 等) | 纯块复制场景 DRBD 更直接 |
| ZFS zfs send / receive | 文件系统层复制 | 快照+增量流式同步,非实时 | 适合备份与异地;要实时双机写则用 DRBD |
| LVM 镜像 | 单机块镜像 | 同机多盘镜像,不能跨主机 | 跨机需 DRBD 或存储阵列 |
| StarWind vSAN | 商业/虚拟化 | 常用于 Hyper-V/VMware,块镜像+仲裁 | 商业方案;DRBD 为开源替代 |
| 存储阵列复制(如 EMC SRDF、HP 3PAR) | 阵列级 | 阵列间同步,与主机无关 | 有预算、已有阵列时可考虑;DRBD 为纯软件、无专用硬件 |
按需求看更贴合的方案
| 需求 | 更贴合的方案 | 生活例子 |
|---|---|---|
| 两台服务器、块级实时镜像、开源 | DRBD | 两台电脑共用一个「虚拟硬盘」,实时抄写 |
| 多节点、自愈、规模大 | Ceph | 一个仓库多处分店,自动补货、自愈 |
| 定期备份、可接受非实时 | ZFS send/receive、rsync | 定期把账本复印一份寄到分公司 |
| 已有 SAN、阵列级容灾 | 阵列复制 | 总仓和分仓的货架自动同步 |
| 虚拟化环境、商业预算 | StarWind 等 | 现成的「双机热备」商业方案 |
🏗️ DRBD 架构与工作原理
DRBD 在 Linux 内核中的位置
🖥️ 用户空间
应用程序
📁 文件系统
ext4/xfs
🔄 DRBD 内核模块
块设备层
⏱️ 磁盘调度层
💾 磁盘驱动
/dev/sdb
📡 网络协议栈
TCP/IP
🔌 网络接口
eth0
DRBD 复制模式
协议C_同步
✏️ 主节点写数据
💾 本地+从节点都写
🤝 双方确认
✅ 返回成功
协议B_半同步
✏️ 主节点写数据
💾 本地写完成
⏳ 等待从节点确认
✅ 返回成功
协议A_异步
✏️ 主节点写数据
💾 本地写完成
✅ 立即返回成功
📤 后台同步到从节点
| 协议 | 名称 | 说明 | 性能 | 安全性 |
|---|---|---|---|---|
| Protocol A | 异步复制 | 本地写完即返回,后台同步 | ⭐⭐⭐ 最高 | ⭐ 最低 |
| Protocol B | 半同步复制 | 本地写完+收到从节点确认 | ⭐⭐ 中等 | ⭐⭐ 中等 |
| Protocol C | 同步复制 | 双方都写完才返回 | ⭐ 最低 | ⭐⭐⭐ 最高 |
复制协议 A/B/C 详细对比
| 项目 | Protocol A | Protocol B | Protocol C |
|---|---|---|---|
| 何时返回「写成功」 | 本地落盘 + 数据进本机 TCP 发送缓冲区 | 本地落盘 + 对端已收到数据包(未必落盘) | 本地与对端都落盘 |
| 主节点宕机可能丢数据 | 可能丢(缓冲区未传完的) | 通常不丢(对端已收到) | 不丢 |
| 双机同时断电 | 可能丢最近写入 | 可能丢最近写入 | 不丢 |
| 生活例子 | 发微信,点发送就显示「已发送」 | 快递「已签收」才算完成,但签收后仓库可能还没入库 | 两人各拿一本账本,两边都写完这一笔才翻页 |
| 典型用途 | 异地容灾、长距离复制 | 折中延迟与安全 | 同机房双机 HA(推荐) |
DRBD 角色状态
Secondary Primary 同步源
等待连接
同步目标
等待连接
初始状态
提升为主
降级为从
连接状态
SyncSource
WFConnection
SyncTarget
✅ 主节点可以挂载文件系统
✅ 可以读写数据
❌ 从节点不能挂载
📥 只能接收同步数据
| 角色 | 说明 | 能否挂载 | 能否读写 |
|---|---|---|---|
| Primary | 主节点,可以读写 | ✅ 可以 | ✅ 可以 |
| Secondary | 从节点,只接收数据 | ❌ 不可以 | ❌ 不可以 |
重要概念:DRBD 的双主模式(两个都是 Primary)需要配合集群文件系统(如 GFS2、OCFS2)使用!
单主 vs 双主模式 对比
| 维度 | 单主(Single-Primary) | 双主(Dual-Primary) |
|---|---|---|
| 同一时刻 Primary 数量 | 1 个 | 2 个(需显式启用) |
| 文件系统 | 任意(ext4、XFS 等) | 必须集群文件系统(GFS2、OCFS2) |
| 典型场景 | 故障转移、主备 HA | 双机同时读写、在线迁移等 |
| 生活例子 | 一个话筒,谁当主谁拿着 | 两人各拿一本账,由「集群文件系统」协调谁写哪一页 |
⚙️ DRBD 配置详解
配置文件结构
DRBD 的主配置文件是 /etc/drbd.conf,通常采用包含方式组织:
bash
# /etc/drbd.conf
include "drbd.d/*.conf";
资源配置示例
bash
# /etc/drbd.d/mysql.res
resource mysql {
protocol C; # 使用同步复制
on node1.magedu.com {
device /dev/drbd0; # DRBD 设备名
disk /dev/sdb1; # 本地物理磁盘
address 192.168.1.10:7789; # 监听地址
meta-disk internal; # 元数据存储方式
}
on node2.magedu.com {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.1.11:7789;
meta-disk internal;
}
disk {
on-io-error detach; # I/O 错误时的行为
fencing resource-only; # 资源级别隔离
}
net {
cram-hmac-alg sha1; # 数据认证算法
shared-secret "my-secret-key"; # 认证密钥
after-sb-0discard-zero-changes; # 脑裂恢复策略
}
syncer {
rate 100M; # 同步速率限制
al-extents 337; # 活动日志大小
}
}
配置参数解析
| 部分 | 参数 | 说明 | 生活类比 |
|---|---|---|---|
| resource | 资源名称 | 定义一个 DRBD 资源,如 mysql、web | 给同步任务起个名字 |
| protocol | 复制协议 | A/B/C 三种模式 | 同步方式约定 |
| device | DRBD 设备 | /dev/drbd0、/dev/drbd1 |
虚拟的"同步设备" |
| disk | 物理磁盘 | 本地实际磁盘分区 | 实际存储数据的"盘子" |
| address | 监听地址 | IP:端口,用于节点间通信 | 两台机器的"电话号码" |
| meta-disk | 元数据 | internal 或外部路径 | 记录同步状态的"笔记本" |
元数据说明
**元数据(Metadata)**是 DRBD 用来记录同步状态、数据位图等信息的数据。
📋 元数据内容
📝 活动日志 AL
🗺️ 位图 Bitmap
🏷️ 同步标记 Generation
记录最近写入
标记哪些块已同步
识别数据版本
元数据存储方式:
| 方式 | 说明 | 优点 | 缺点 |
|---|---|---|---|
| internal | 存储在数据磁盘末尾 | 简单,不需要额外分区 | 占用数据磁盘空间 |
| external | 单独的元数据分区 | 独立存储,数据分区完整 | 需要额外分区配置 |
internal vs external 对比
| 维度 | internal | external |
|---|---|---|
| 元数据位置 | 数据盘末尾一块区域 | 单独分区或指定设备 |
| 分区数量 | 只需一块数据分区 | 至少一块数据 + 一块元数据 |
| 数据区 | 略小于整盘(末尾给元数据) | 数据分区 100% 给数据 |
| 生活例子 | 书的最后一页当目录 | 另备一本「目录本」 |
| 适用 | 简单部署、省分区 | 要最大化数据空间或独立备份元数据时 |
生活类比:
- 元数据 = 你笔记本上记录的"哪页写了什么"
- internal = 笔记记在书的最后一页
- external = 另外拿一个小本子记录
🚀 DRBD 部署实战
环境准备
bash
# 两台服务器
# node1: 192.168.1.10
# node2: 192.168.1.11
# 1. 安装 DRBD 软件(两台都执行)
yum install drbd kmod-drbd drbd-utils -y
# 2. 准备磁盘分区(两台都执行)
# 假设使用 /dev/sdb 作为 DRBD 磁盘
fdisk /dev/sdb
# 创建一个主分区 sdb1
# 3. 加载 DRBD 模块(两台都执行)
modprobe drbd
lsmod | grep drbd
# 4. 设置开机自动加载
echo "modprobe drbd" >> /etc/rc.local
chmod +x /etc/rc.local
初始化 DRBD 资源
bash
# 1. 创建 DRBD 资源配置(两台都创建相同配置)
cat > /etc/drbd.d/mysql.res << 'EOF'
resource mysql {
protocol C;
on node1 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.1.10:7789;
meta-disk internal;
}
on node2 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.1.11:7789;
meta-disk internal;
}
}
EOF
# 2. 初始化元数据(两台都执行,只在第一次执行)
# 名词:create-md = 在底层磁盘上创建 DRBD 元数据,像「给新本子写扉页」
drbdadm create-md mysql
# 输出类似:
# Writing meta data...
# initializing activity log
# NOT initialized bitmap
# New drbd meta data block successfully created.
# 3. 启动 DRBD 服务(两台都执行)
drbdadm up mysql
# 或者
systemctl start drbd
systemctl enable drbd
# 4. 查看状态(两台都执行)
cat /proc/drbd
# 输出示例:
# version: 8.4.11-1
# srcver: 8AC9F04B8C41A9F4661FB0BE0992E6D1E8F2F236
# 0: cs:Connected ro:Secondary/Secondary ds:Diskless/Diskless C r-----
# ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:100
建立主从关系
bash
# 在 node1 上执行,将其设为主节点
# 名词:primary = 提升为主角色,只有主才能挂载文件系统并读写
drbdadm -- --overwrite-data-of-peer primary mysql
# 或者(若对端无数据或已协商好)
drbdadm primary mysql
# 查看状态(node1)
cat /proc/drbd
# 输出应该显示:
# ro:Primary/Secondary
# ns:4 nr:4 dw:4 dr:4 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
创建文件系统并挂载
bash
# 在主节点(node1)上执行
# 1. 创建文件系统
mkfs.ext4 /dev/drbd0
# 2. 挂载文件系统
mkdir /data
mount /dev/drbd0 /data
# 3. 写入测试数据
echo "Hello from DRBD" > /data/test.txt
# 4. 查看文件
cat /data/test.txt
# 5. 卸载文件系统
umount /data
切换主节点测试
bash
# 在 node1 上降级为从节点
drbdadm secondary mysql
# 在 node2 上升级为主节点
drbdadm primary mysql
# 在 node2 上挂载文件系统
mkdir /data
mount /dev/drbd0 /data
# 查看测试数据
cat /data/test.txt
# 应该能看到:Hello from DRBD
🔄 DRBD 与 Corosync 集成(高可用 MySQL)
集群架构
节点2
节点1
集群层
📤📥 数据同步
📡 Corosync 心跳传递
🎛️ Pacemaker 资源管理
🌐 VIP 192.168.1.100
🔄 DRBD Primary
🗄️ MySQL Running
🌐 VIP 备用
🔄 DRBD Secondary
🗄️ MySQL Stopped
配置 DRBD 资源(Pacemaker)
bash
# 1. 配置 DRBD 资源(在任一节点执行)
pcs resource create drbd_mysql ocf:linbit:drbd \
drbd_resource=mysql \
op monitor interval=15s role=Master \
op monitor interval=30s role=Slave
# 2. 配置主从资源
pcs resource master ms_drbd_mysql drbd_mysql \
master-max=1 master-node-max=1 \
clone-max=2 clone-node-max=1 \
notify=true
# 3. 配置文件系统资源
pcs resource create fs_mysql ocf:heartbeat:Filesystem \
device="/dev/drbd0" \
directory="/data" \
fstype="ext4" \
op monitor interval=20s
# 4. 配置 VIP 资源
pcs resource create vip_mysql ocf:heartbeat:IPaddr2 \
ip=192.168.1.100 cidr_netmask=24 \
op monitor interval=10s
# 5. 配置 MySQL 资源
pcs resource create mysql systemd:mysqld \
op monitor interval=20s timeout=30s
# 6. 配置资源组
pcs resource group add mysql-group vip_mysql fs_mysql mysql
# 7. 配置约束
# MySQL 组必须在 DRBD 主节点上运行
pcs constraint colocation add mysql-group with ms_drbd_mysql INFINITY
pcs constraint order promote ms_drbd_mysql then start mysql-group \
kind=Mandatory
# 8. 查看集群状态
pcs status
📊 DRBD 状态监控
常用监控命令
bash
# 查看 DRBD 详细状态
drbdadm status mysql
# 查看连接状态
drbdadm cstate mysql
# 查看角色状态
drbdadm role mysql
# 查看同步状态
drbdadm dstate mysql
# 查看详细信息
drbdadm show mysql
# 查看 /proc/drbd
cat /proc/drbd
状态字段解读
📊 cat /proc/drbd 输出
📡 cs 连接状态
👤 ro 角色状态
💾 ds 磁盘状态
Connected 已连接
SyncSource 正在同步
WFConnection 等待连接
Primary/Secondary 主/从
Secondary/Primary 从/主
Primary/Primary 主/主
UpToDate/UpToDate 双方一致
UpToDate/Inconsistent 从节点不一致
Diskless/Diskless 双方无盘
| 字段 | 含义 | 常见值 |
|---|---|---|
| cs | 连接状态 | Connected, SyncSource, SyncTarget, WFConnection |
| ro | 角色状态 | Primary/Secondary, Secondary/Primary |
| ds | 磁盘状态 | UpToDate, Inconsistent, Outdated, Diskless |
| ns | 网络发送字节数 | |
| nr | 网络接收字节数 | |
| dw | 磁盘写入字节数 | |
| dr | 磁盘读取字节数 | |
| al | 活动日志 | |
| bm | 位图 | |
| lo | 本地计数 |
连接状态详解
| 状态 | 说明 | 解决方案 | 生活例子 |
|---|---|---|---|
| Connected | 正常连接 | ✅ 无需操作 | 电话接通,正常通话 |
| WFConnection | 等待连接 | 检查网络、防火墙、对端是否启动 | 电话拨号中,对方还没接 |
| SyncSource | 正在同步数据(源) | 等待同步完成 | 你这头在传文件给对方 |
| SyncTarget | 正在同步数据(目标) | 等待同步完成 | 你这头在收对方传的文件 |
| StandAlone | 单机状态 | 检查配置文件,重启 DRBD | 电话挂了,单机模式 |
⚠️ 常见问题与故障排查
脑裂 (Split-Brain)
什么是脑裂?
📡 网络中断
⚠️ 两个节点都认为自己是主
✏️ 数据同时写入
❌ 数据不一致 脑裂
📡 网络恢复
🔍 两个主节点互相发现
🛑 DRBD 拒绝连接 需手动解决
生活例子 :像两个值班经理同时收到「对方今天请假」的误报,都以为只有自己在岗,都去改同一本账,结果两份修改对不上;网络恢复后两边一碰头发现都是「主」,DRBD 会拒绝自动连接,必须人工决定以哪边为准、丢弃哪边数据。
脑裂的原因:
- 网络中断但两个节点都存活
- 人为配置错误(两边都设为 Primary)
- Corosync/Pacemaker 配置不当
解决脑裂的步骤:
生活例子 :像两本账本写岔了,必须决定「以哪本为准」;选定的那一本保留,另一本按「准」的那本重抄(即丢弃本地数据、以对端为准同步)。
bash
# 1. 确定哪个节点的数据是最新的(最重要!)
# 检查最后修改时间、数据量等
# 2. 在"错误"的节点上丢弃本地数据(以对端为准)
drbdadm secondary mysql
drbdadm connect --discard-my-data mysql
# 3. 在"正确"的节点上接受连接
drbdadm connect mysql
# 4. 等待同步完成
# watch cat /proc/drbd
# 5. 验证数据一致性
预防脑裂的方法:
| 方法 | 说明 | 生活类比 |
|---|---|---|
| Fencing | STONITH 隔离 | 出问题时直接断电 |
| 仲裁设备 | 第三方投票 | 找第三个裁判来投票 |
| 双主模式 + 集群文件系统 | GFS2/OCFS2 | 两个人同时写,用文件系统协调 |
同步速度慢
bash
# 查看当前同步速率
cat /proc/drbd | grep sync
# 临时调整同步速率
drbdsetup /dev/drbd0 syncer -r 200M
# 永久调整(配置文件)
syncer {
rate 200M;
}
磁盘 I/O 错误
bash
# 查看错误日志
dmesg | grep drbd
tail -f /var/log/messages
# 常见错误:I/O error, detached
# 解决:检查磁盘健康状态
smartctl -a /dev/sdb
📈 DRBD 性能优化
同步速率调优
bash
# 配置示例
disk {
# 磁盘瓶颈时的行为
on-io-error detach;
# I/O 屏障算法
barrier none;
# 最大从节点数
max-bio-buffers 2048;
}
net {
# 网络缓冲区大小
sndbuf-size 1M;
rcvbuf-size 1M;
# 最大连接数
max-epoch-size 8000;
# 超时设置
timeout 100;
connect-int 10;
ping-timeout 9;
}
syncer {
# 同步速率
rate 100M;
# 活动日志大小
al-extents 337;
# 验证速率
verify-rate 50M;
}
性能对比
| 配置项 | 默认值 | 优化值 | 说明 |
|---|---|---|---|
| rate | 根据带宽 | 100M-1G | 网络好时可以调大 |
| al-extents | 123 | 337 | 活动日志越大,重同步越快 |
| sndbuf-size | 动态 | 1M | 固定大小减少协商 |
| rcvbuf-size | 动态 | 1M | 固定大小减少协商 |
💡 最佳实践
生产环境建议
- 使用 Protocol C:确保数据安全
- 配置 Fencing:防止脑裂
- 定期测试切换:确保 HA 正常工作
- 监控同步延迟:及时发现网络问题
- 备份重要数据:DRBD 不是备份的替代品
DRBD 不是备份!
🔄 DRBD
实时同步 镜像
💾 备份
定期快照 历史版本
🗑️ 误删文件
DRBD 两边都没了
备份 可以恢复
| 特性 | DRBD | 备份 |
|---|---|---|
| 实时性 | 实时同步 | 定期备份 |
| 目的 | 高可用 | 灾难恢复 |
| 历史版本 | 无 | 有 |
| 防误删 | ❌ 无效 | ✅ 有效 |
生活类比:
- DRBD = 两台电视同时播放同一个节目
- 备份 = 录制节目,可以回看之前的
📚 官方文档与参考
以下为 DRBD 的官方与常用文档,便于深入配置与排错。
| 项目 | 说明 | 链接 |
|---|---|---|
| LINBIT DRBD User Guide 9.0 | DRBD 9 官方用户指南(英文,含复制模式、资源、角色、Pacemaker 集成等) | linbit.com/drbd-user-guide |
| DRBD 8.4 User Guide | DRBD 8.4 用户指南(旧版,与本文配置语法接近) | linbit.com Users Guide 8.4 |
| LINBIT 文档中心 | 用户指南、快速参考、PDF 下载 | linbit.com/drbd-user-guide |
| Linux 内核 DRBD | 内核内 DRBD 说明(含 DRBD 9 数据结构与数据流) | kernel.org DRBD |
| LINBIT GitHub | 官方文档源码(含 8.4 / 9 版) | LINBIT/linbit-documentation |
🎯 总结
DRBD 是 Linux 平台上最成熟的块级数据复制解决方案,与 Corosync + Pacemaker 配合可以实现真正的高可用集群。
核心要点记忆口诀:
- DRBD 复制在块层,文件系统看不出来
- 主从角色要分清,只有主能挂载读写
- 三种协议选 C,数据安全最重要
- 脑裂预防用 Fencing,仲裁设备来投票
- DRBD 不是备份,定期备份不能忘
生活类比总结:
- DRBD = 实时复印机
- Primary = 正在用的打印机
- Secondary = 备用打印机
- Protocol C = 收到确认才算完成
- Split-Brain = 两个人同时修改同一份文件
最后提醒:DRBD 的双主模式需要配合集群文件系统(GFS2/OCFS2),不要在两个独立节点上同时挂载 ext4 文件系统写入数据!