drbd通过配置主从式复制资源实现块级实时数据同步,工作在文件系统与磁盘之间,需两节点裸分区一致、禁用selinux和防火墙、使用protocol c保障强一致性,并配合keepalived完成高可用切换。

DRBD 实现块级主备数据同步,核心在于配置一个主从式复制资源,并确保主节点可读写、从节点仅接收同步数据。它不依赖上层应用,而是工作在文件系统与磁盘之间,做到底层数据实时镜像。配置本身不复杂,但关键步骤必须严格按顺序执行,否则容易出现脑裂或挂载失败。
准备相同规格的后端存储
两台服务器需各自准备一块大小一致、未挂载的裸分区(如 /dev/sdb1),建议使用独立磁盘而非系统盘。格式化不是必须步骤(DRBD 自己管理底层块),但要确保分区已创建并可用:
- 用 fdisk 或 parted 创建主分区,执行 partprobe 刷新内核分区表
- 确认两节点设备路径完全一致(例如都是 /dev/sdb1),否则 DRBD 资源无法对齐
- 关闭 SELinux(setenforce 0)和防火墙(或放行 DRBD 默认端口 7788–7799)
定义 DRBD 资源并启用协议 C
DRBD 配置以“资源”为单位,推荐使用分离式配置(/etc/drbd.d/r0.res),避免直接修改 /etc/drbd.conf。关键项包括:
- protocol C:表示主节点写入完成需等待从节点落盘成功才返回,保障强一致性
- disk { on-io-error detach; }:IO 错误时主动断开连接,防止脏数据传播
- net { allow-two-primaries no; }:禁用双主,强制主从模式
- 每个节点的 host 名称、IP 地址、设备路径必须一一对应,且能通过 hostname -f 正确解析
初始化并启动主从状态
配置完成后,依次执行以下命令(先在主节点,再在从节点):
- drbdadm create-md r0:在两节点分别初始化元数据(只执行一次)
- systemctl enable drbd && systemctl start drbd:启动服务
- drbdadm up r0:激活资源(两节点都执行)
- drbdadm primary --force r0:仅在计划作为主的节点执行,强制设为主(首次必需加 --force)
- drbdadm status r0:检查状态,应显示 Primary/Secondary 及同步进度(UpToDate/UpToDate 表示已完成)
挂载使用并配合 Keepalived 完成主备切换
DRBD 设备(如 /dev/drbd0)需在主节点上格式化并挂载,从节点不能挂载。实际业务(如 Neo4j、GitLab、HDFS NameNode)必须部署在该挂载点下:
- 主节点执行:mkfs.xfs /dev/drbd0 && mkdir -p /data/neo4j && mount /dev/drbd0 /data/neo4j
- Keepalived 监控 DRBD 状态(通过 drbdadm role r0 检查是否为 Primary),一旦主宕机,自动将 VIP 漂移到备用节点
- 切换脚本中必须包含:drbdadm secondary r0(原主)、drbdadm primary r0(新主)、再挂载文件系统、最后拉起应用服务










