开头语:$ sudo apt install happiness —— 执行成功!有效期:丙午马年全年。给各位云原生战友拜年了!

写作背景:之前有用到rsync和lsync,但是只有同步,没有高可用,于是用到DRBD。可以实现高可用。DRBD、rsync、lsyncd 这三个工具完全可以组合使用,形成一个“实时同步 + 定时备份 + 高可用”的完整数据安全体系。

一、DRBD是什么?

DRBD(Distributed Replicated Block Device)是一个基于Linux内核的分布式块设备复制系统,简单说就是在两台服务器之间实时同步数据,像一面“网络镜子”。

1.1 核心定位

把它想象成网络版的RAID1——RAID1是把数据同时写到两块本地硬盘,DRBD则是把数据同时写到本地和远程服务器上。它在系统中的位置处于文件系统和物理磁盘之间:

应用程序 → 文件系统 → DRBD → 本地磁盘
                   ↓
                网络传输 → 对端DRBD → 对端磁盘

1.2 工作机制

DRBD采用主从模式运行:

  • 主节点(Primary):可以读写数据,应用程序直接操作DRBD设备

  • 从节点(Secondary):只能接收主节点同步的数据,不能直接读写

当主节点有数据写入时,DRBD会截获这个写操作,同时写入本地磁盘并通过网络发送给从节点,从节点收到后再写入自己的磁盘。

1.3 三种复制协议

DRBD提供三种复制模式,在性能和安全性之间取舍:

协议 名称 工作原理 风险 适用场景
A 异步 本地写完就返回,不管对方 主节点故障可能丢数据 对性能要求极高、可容忍少量丢数据
B 半同步 本地写完且数据发到对方内存就返回 双机同时断电可能丢数据 介于A和C之间
C 同步 本地和对方都写完才返回 最安全,几乎不丢数据 生产环境首选

企业生产环境一般都用协议C,虽然网络延迟会影响一点写性能,但能保证数据一致性。

二、什么时候用DRBD?

2.1 典型应用场景

  1. 高可用数据库:MySQL、PostgreSQL等关键数据库,主库宕机后备库能直接拉起服务

  2. 高可用文件服务器:NFS、Samba等文件共享服务

  3. 虚拟化存储:KVM、Proxmox等虚拟化平台的共享存储

  4. 容器持久化:与K8s结合,为有状态应用提供高可用存储

2.2 真实案例

某电商公司用两台服务器跑MySQL,之前靠主从复制做高可用,但主库磁盘坏了还是丢数据。上了DRBD后,数据实时同步到备机,主库宕机直接切备机,数据一条不丢。


三、为什么要用DRBD,不用共享存储?

3.1 DRBD vs 共享存储对比

对比项 传统共享存储(SAN/NAS) DRBD
成本 贵,一套下来几十上百万 免费,用服务器本地硬盘即可
架构 需要专用存储网络 普通IP网络即可
单点故障 存储控制器可能成瓶颈 无单点,数据分散在两台服务器
扩展性 纵向扩展,成本高 横向扩展,加服务器就行
运维复杂度 需要专业存储管理员 Linux运维就能搞定

3.2 DRBD的核心优势

  1. 省钱:不需要昂贵的共享存储柜,普通服务器+本地硬盘就能实现高可用

  2. 透明:应用程序完全感知不到底层是网络复制,操作/dev/drbd0就像操作本地盘

  3. 实时:数据同步是实时发生的,不是定期备份

  4. 成熟:在Linux内核中已经存在十几年,稳定性经过大量生产环境验证

四、从零开始搭建DRBD(Ubuntu 22.04/24.04版)

下面用两台Ubuntu服务器演示,假设:

  • 节点A:drbd01,IP 192.168.1.10

  • 节点B:drbd02,IP 192.168.1.11

  • 数据盘:/dev/sdb(每台都有,大小相同)

4.1 环境准备(两台都执行)

# 1. 配置主机名解析
cat >> /etc/hosts << EOF
192.168.1.10 drbd01
192.168.1.11 drbd02
EOF

# 2. 安装DRBD软件包
apt update
apt install -y drbd-utils

# 3. 加载内核模块
modprobe drbd
echo "drbd" >> /etc/modules

# 4. 确认数据盘存在(/dev/sdb)
lsblk | grep sdb

4.2 配置DRBD

步骤1:编辑配置文件 /etc/drbd.d/global_common.conf

cat > /etc/drbd.d/global_common.conf << EOF
global {
    usage-count no;
}
common {
    net {
        protocol C;  # 使用同步协议
    }
}
EOF

步骤2:创建资源配置文件 /etc/drbd.d/r0.res

cat > /etc/drbd.d/r0.res << EOF
resource r0 {
    device /dev/drbd0;
    disk /dev/sdb;
    meta-disk internal;
    
    on drbd01 {
        address 192.168.1.10:7788;
    }
    on drbd02 {
        address 192.168.1.11:7788;
    }
}
EOF

配置说明:

  • device:DRBD虚拟设备路径

  • disk:实际使用的物理磁盘

  • meta-disk internal:元数据存在磁盘末尾

  • address:监听IP和端口(默认7788)

步骤3:复制配置到另一台节点

# 在drbd01上执行
scp /etc/drbd.d/* root@drbd02:/etc/drbd.d/

4.3 初始化DRBD

步骤1:初始化元数据(两台都执行)

drbdadm create-md r0
# 出现"New drbd meta data block successfully created"表示成功

步骤2:启动DRBD服务(两台都执行)

systemctl start drbd
systemctl enable drbd

步骤3:设置主节点(只在drbd01执行)

drbdadm -- --overwrite-data-of-peer primary r0

步骤4:查看同步状态

watch -n 1 cat /proc/drbd
# 等待状态变为 UpToDate/UpToDate

输出示例:

version: 8.4.11 (api:1/proto:86-101)
GIT-hash: ...
 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
    ns:1024 nr:0 dw:0 dr:1064 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:1048388
        [>....................] sync'ed:  0.2% (1024/1024)M

4.4 创建文件系统并使用

步骤1:在主节点创建文件系统

# 在drbd01上执行
mkfs.ext4 /dev/drbd0

步骤2:挂载使用

mkdir /data
mount /dev/drbd0 /data
df -h /data

步骤3:测试写入

echo "DRBD test" > /data/test.txt
cat /data/test.txt

4.5 测试故障切换

场景:模拟主节点drbd01宕机,将服务切换到drbd02

步骤1:在drbd01上卸载并降级(模拟维护)

umount /data
drbdadm secondary r0

步骤2:在drbd02上升级为主节点

drbdadm primary r0
mkdir /data
mount /dev/drbd0 /data
ls /data   # 应该能看到test.txt

步骤3:切换回原主节点

# drbd02上
umount /data
drbdadm secondary r0

# drbd01上
drbdadm primary r0
mount /dev/drbd0 /data

五、与Pacemaker集成实现自动故障转移

手动切换太麻烦,可以用Pacemaker实现自动化。这里给个简要框架:

# 安装Pacemaker
apt install -y pacemaker corosync pcs

# 配置Pacemaker集群(在两台执行)
passwd hacluster  # 设置统一密码
pcs host auth drbd01 drbd02 -u hacluster
pcs cluster setup mycluster drbd01 drbd02
pcs cluster start --all

# 配置DRBD资源在Pacemaker中
pcs resource create drbd_r0 ocf:linbit:drbd \
  drbd_resource=r0 \
  op monitor interval=60s

# 配置为主从克隆资源
pcs resource promotable drbd_r0 \
  promoted-max=1 promoted-node-max=1 \
  clone-max=2 clone-node-max=1 notify=true

# 配置文件系统资源
pcs resource create fs_data Filesystem \
  device=/dev/drbd0 directory=/data fstype=ext4 \
  op monitor interval=40s

# 配置资源约束
pcs constraint colocation add fs_data with drbd_r0-clone INFINITY \
  with-rsc-role=Promoted
pcs constraint order promote drbd_r0-clone then start fs_data

这样配置后,主节点宕机时Pacemaker会自动把DRBD提升、挂载文件系统,业务无感切换。


六、常见问题与注意事项

6.1 Split-brain(脑裂)

当网络中断导致两台都以为自己是主节点时,数据会不一致。

恢复方法

# 查看脑裂状态
drbdadm status

# 在确认数据最新的节点上执行
drbdadm primary --force r0

# 在另一节点丢弃数据并重新同步
drbdadm secondary r0
drbdadm -- --discard-my-data connect r0

6.2 防火墙配置

DRBD默认使用TCP端口77887789,需要放行:

ufw allow 7788/tcp
ufw allow 7789/tcp

6.3 重要提醒

  1. DRBD不是备份:如果主节点误删文件,删除操作会同步到备机,数据就真没了。所以DRBD要和传统备份(rsync、备份软件)配合使用。

  2. 磁盘大小必须一致:两节点的数据盘容量要一样,否则无法同步。

  3. 网络质量很重要:同步协议C对网络延迟敏感,建议用专线或独立网卡跑DRBD流量。

七、总结

问题 答案
DRBD是什么 网络版RAID1,两台服务器之间实时同步块设备
什么时候用 需要高可用数据存储的场景:数据库、文件服务、虚拟化
为什么用 省钱(不用买共享存储)、实时同步、对应用透明
怎么搭建 两台服务器 + drbd-utils + 配置文件 + 初始化 + 挂载

DRBD是企业级高可用架构的基石之一,搭配Pacemaker、Corosync等集群软件,可以构建出不输商业存储的HA方案。

结束语:本人写一些笔记记录,以及工作中遇到的一些问题,方便之后重复阅读,每个人的搭建和操作都不一样,但是可以参考一下,感谢您的点击和阅读。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐