DRBD 的全称为:Distributed Replicated Block Device 分布式块设备复制,DRBD 是由内核模块和相关脚本而构成,用以构建高可用性 (HA) 的集群。其实现方式是通过网络来镜像 (mirror) 整个设备。它允许用户在远程机器上建立一个本地块设备的实时镜像。与心跳连接结合使用,也可以把它看作是一种网络 RAID
# DRBD 两个重要的功能:replication 和 synchronization
# DRBD 负责接收数据,把数据写到本地磁盘,然后发送给另一个主机,另一个主机再将数据存到自己的磁盘中。 目前,DRBD 每次只允许对一个节点进行读写访问,这对于通常的故障切换高可用性集群来讲已经足够用了。以后的版本将支持两个节点进行读写存取。
# 一个 DRBD 系统由两个以上节点构成,与 HA 集群类似,也有主用节点和备用节点之分,在带有主要设备的节点上,应用程序和操作系统可以运行和访问 DRBD 设备。
# 在主节点写入的数据通过 drbd 设备存储到主节点的磁盘设备中,同时,这个数据也会自动发送到备用节点相应的 drbd 设备,最终写入备用节点的磁盘设备中,在备用节点上,drbd 只是将数据从 drbd 设备写入到备用节点的磁盘设备中。
#大部分现行高可用性集群都会使用共享存储,而 DRBD 也可以作为一个共享存储设备,使用 DRBD 不需要任何硬件的投资。因为它在IP网络中运行(IP SAN),因此,利用 DRBD 作为共享存储设备,要节约很多成本,因为在价格上IP网络要比专用的存储网络经济的多。
# 在 DRBD 设备上创建文件系统之前,必须先设置 DRBD 设备。只能通过 /dev/drbd 设备(而非原始设备)操纵用户数据,因为 DRBD 使用原始设备的最后 128 MB 储存元数据。确保仅在 /dev/drbd 设备上创建文件系统,而不在原始设备上创建。主机上的 DRBD 设备挂载到一个目录上进行使用.备机的 DRBD 设备无法被挂载,因为它是用来接收主机数据的,由 DRBD 负责操作。
# DRBD 是 linux 的内核的存储层中的一个分布式存储系统,可用使用 DRBD 在两台 linux 服务器之间共享块设备,共享文件系统和数据。类似于一个网络 RAID1 的功能
拓扑如下:
1.配置解析文件

2.配置 drbd 内核模块
通过命令查看到内核中并没有内置 drbd 相关的模块,可以在 https://pkg.linbit.com/ 网站下载对应模块





# 由于下载的是最新版的内核驱动,所以如果编译安装失败大概率是因为内核版本问题,因此需要将内核版本升级为最新版
内核版本升级步骤:
添加 backports 源,echo "deb https://mirrors.ustc.edu.cn/debian/ $(lsb_release -cs)-backports main contrib non-free" >>/etc/apt/sources.list
查找 apt 源官方支持的内核版本,apt search linux-image
升级,apt install -t $(lsb_release -cs)-backports linux-image-$(dpkg --print-architecture) linux-headers-$(dpkg --print-architecture) --install-recommends -y
更新配置并重启,update-grup && reboot -f
update-grup 执行后 reboot -f 命令大概率会卡死,因此可通过强制重启跳过正常的 shutdown 过程。强制重启命令:echo 1 >/proc/sys/kernel/sysrq ; echo b >/proc/sysrq-trigger
将内核升级为官方支持的最新版本后重新编译安装后并加载该模块

# 通过 modprobe 加载的模块是临时的,重启后内核将不会加载该模块,因此需要将该模块加入开机自动载入的配置文件中
执行命令:echo drbd >/etc/modules-load.d/drbd.conf
3.安装并配置 drbd
apt -y install drbd*
# auto-promote yes 表示允许自动切换主从,protocol C 表示 drbd 使用C协议。drbd 有三种协议,A协议表示异步,B协议表示半同步半异步,C协议表示同步,A->C 所需要的带宽依次增加
sed -i -e'/options/a\auto-promote yes;' -e '/net/a\protocol C;' /etc/drbd.d/global_common.conf
# drbd1 和 drbd2 节点分别创建 drbd 存储使用的 lvm
pvcreate /dev/sdb
vgcreate vg-drbd /dev/sdb
lvcreate -n lv-drbd -l 100%free vg-drbd
由上图可知 drbd 的子配置文件
# 配置 resource 子配置文件
cat > /etc/drbd.d/drbd-data.res <<END
resource drbd-data {
meta-disk internal;
device /dev/drbd1;
net {
verify-alg sha256;
}
on drbd1 {
address 172.16.201.21:7788;
disk /dev/vg-drbd/lv-drbd;
}
on drbd2 {
address 172.16.201.22:7788;
disk /dev/vg-drbd/lv-drbd;
}
}
END
# 创建 drbd 资源,create-md 后面的参数要和 drbd-data.res 文件中 resource 后面的参数保持一致
drbdadm create-md drbd-data
drbdadm up drbd-data
drbdadm primary drbd-data --force (仅 primary 节点操作)
# 格式化 drbd1 ,在 drbd 首次部署完成后格式化虚拟硬盘 drbd1 可以加快主从节点的同步速度
mkfs.ext4 /dev/drbd1
# 在同步的过程中可使用 drbdadm status -v 命令查看进度

同步完成后如下所示


DRBD 分布式高可用集群有两个缺点:
1.节点重启后需要手动 up drbd resource,可自定义 systemd 的 service 文件使其开机启动后自动 up

2.主节点宕机后,从节点需要手动 mount drbd resource,可通过 pacemaker + corosync 做高可用和心跳配合使用