什么是 DRBD?
DRBD (分布式复制块设备)是基于 Linux 系统的软件包。 它用于通过网络将存储设备从一个节点复制到另一个节点。
它可以为处理灾难恢复和故障转移提供帮助。 DRBD 可以理解为对硬件的高可用,也可以看作是网络共享存储的替代品。
DRBD 是如何工作的?
假设我们想在两个 CentOS 系统上集群一个存储分区,我们在两个系统上都需要一个块设备(如 /dev/sdb1)。 这些系统被定义为主节点和辅助节点(可以切换主节点和辅助节点)。
DRBD 使用虚拟块设备(如 drbd0)来共享两个系统的 /dev/sdb1 块设备。 主节点是安装虚拟驱动器 drbd0 以进行读/写目的的节点。
首先我们需要安装用于创建虚拟磁盘 drbd0 的 DRBD 包。 我们可以将其格式化为 xfs 或 ext3 文件系统以使用 /dev/drbd0 设备。 drbd0 设备配置为在两个系统上使用 /dev/sdb1 块设备。 我们现在只在 drbd0 设备上工作。
由于 drbd0 只能挂载在主节点上,因此一次只能从主节点访问内容。 无论如何,如果主系统崩溃,我们可能会丢失系统文件,但虚拟设备 drbd0 将可用。 我们可以将最初的辅助节点切换为主节点,并且可以再次访问其内容。
在 CentOS 上使用 DRBD
本教程是在 CentOS 7 上执行的,但它也应该适用于其他 CentOS 版本。 阅读此内容以了解如何检查 CentOS 版本。
要求
- 两个 CentOS 安装系统
- 两个系统上都有一个像 /dev/sdb1 这样的空闲块设备(最好是相同的大小)
- Selinux 允许或禁用
- 防火墙允许端口 7788
- 节点必须在同一网络内。
安装
在这里,我们通过添加 epel 存储库来跟踪安装,因为 drbd 软件包在 CentOS 发行版中不可用。
$ rpm -ivh https://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
还要在两个节点上添加 GPG-key。 GPG-key 是用于加密节点之间通信的公钥。
$ rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-elrepo.org
现在我们可以使用 yum 来安装 drbd 包了。 我们必须确定我们的内核支持的 drbd 版本。 检查内核可用的 drbd 版本:
$ yum info *drbd* | grep Name
输出如下:
现在安装所需版本的 drbd 以及必要的内核模块。
$ yum -y install drbd84-utils kmod-drbd84
验证内核模块是否已加载。
$ lsmod | grep -i drbd
如果上述命令的响应给出了空输出,则内核模块没有被加载。 您需要重新启动系统并尝试:
$ modprobe drbd
modprobe 是一个从 Linux 内核中智能地添加或删除模块的命令。 要在每次启动时加载模块, 系统模块加载 使用服务。 因此,在 /etc/modulesload.d 中创建一个名为 drbd.conf 的文件。
$ echo drbd > /etc/modules-load.d/drbd.conf
配置 DRBD
DRBD 配置文件位于 /etc/drbd.d/
默认情况下,/etc/drbd.d/global_common.conf 是全局可用的,其中包含全局或主要配置。 其他配置文件称为资源文件,扩展名为 *.res。
现在我们在两个节点上创建资源配置文件,为我们指定的块设备使用 drbd。
让我们创建名为 linuxhandbook.res 的资源文件
$ vi /etc/drbd.d/linuxhandbook.res
将以下内容复制并粘贴到资源文件中
resource linuxhandbook {
protocol C;
on node1 {
device /dev/drbd0;
disk /dev/sdb1;
address 10.20.222.14:7788;
meta-disk internal;
}
on node2 {
device /dev/drbd0;
disk /dev/sdb1;
address 10.20.222.15:7788;
meta-disk internal;
}
}
这里,
- linuxhandbook 是资源名称。 资源名称必须始终是唯一的。
- 协议 C 用于同步通信。 它是完全同步的复制协议。 其他可用的协议是协议 A 和协议 B。
- 协议 A:异步复制协议。 通常首选用于长距离网络中的节点。
- 协议 B:半同步复制协议。 也称为内存同步协议。
- 协议 C:首选用于短距离网络中的节点。
- node 1 和 node2 是各个节点的主机名。 仅用于识别块。
- device /dev/drbd0 是创建用作设备的逻辑设备。
- disk /dev/sdb1 是 drbd0 将占用的物理块设备。
- 地址 10.20.222.14:7788 和地址 10.20.222.15:7788 分别是打开 tcp 端口 7788 的两个节点的 IP 地址。
- meta-internal disk 用于定义使用磁盘的内部元数据。
两个节点上的配置必须相同。
现在,我们需要初始化每个节点上的元数据存储:
$ drbdadm create-md linuxhandbook
如果这给出了错误消息,那么您必须手动创建一个虚拟数据文件,然后再执行上述命令。
$ dd if=/dev/zero of=/dev/sdb1 bs=1024k count=1024
dd 命令用于创建指定内存的随机文件。 之后 create-md 命令必须成功。
逻辑设备可用后,将 drbd0 设备附加到两个节点上的 sdb1 磁盘。 查看 lsblk 的输出
$ lsblk
输出应该是这样的

如果没有,则通过资源文件将 drbd0 设备附加到 sdb1 磁盘。
$ drbdadm attach linuxhandbook
or
$ drbdadm up linuxhandbook
Once again try,
$ lsblk
在两个节点上启动并启用 drbd 服务。
$ systemctl start drbd
$ systemctl enable drbd
如果一个节点的 drbd 启动可能很快,而另一个节点则需要一些时间。
设置主节点和辅助节点
DRDB 一次只使用一个节点作为可以进行读写的主节点。
我们首先将节点 1 指定为主节点。
$ drbdadm primary linuxhandbook --force
检查drbd进程的状态:
$ cat /proc/drbd
or
$ drbd-overview
输出如下所示:

在这里,我们可以获得的信息是:
- 目前哪个节点是主要的,哪个是次要的。
- 数据同步过程。
- drbd 设备状态,例如:不一致、更新、无盘。
另一个节点node2 自动设置为辅助节点。 查看 drbd 概览进程状态。
我们尚未执行的主要步骤是格式化 drbd0 设备。 这只能在其中一个节点上完成。
在这里,我们使用 mkfs 命令将 drbd0 格式化为 ext3。 xfs 文件系统也可以工作。 我们最好使用与 /dev/sdb1 相同的磁盘类型。
$ mkfs -t ext3 /dev/drbd0
现在,再次在主节点(例如,本教程中的 node1)我们必须挂载 drbd0 设备才能在其上工作。
$ mount /dev/drbd0 /mnt
you can select your required mount point instead of /mnt. for example, I can mount the /dev/drbd0 device to /var/lib/mysql to use it for mysql database drbd.
笔记: 永远记住过程。 首先,您应该将该节点作为 DRBD 的主要节点。 然后将 drbd0 设备安装到您的系统,您就可以在设备上执行操作。 如果不将节点设置为主节点,则无法挂载 drb0 设备,也无法使用该设备的内容。
测试 DRBD 进程
在两个节点上都设置了 drbd 并且一个节点成为主节点之后。 我们将设备安装到 /mnt 位置。 现在创建一个文件来测试drbd节点的同步。
$ touch /mnt/drbdtest.txt
$ ll /mnt/
之后,我们将 node1 设置为辅助节点,将 node2 设置为主节点。 该过程类似地反映。 在节点 1(在实例主节点),卸载 /dev/drbd0 设备,使其成为辅助节点。 在 node2(在实例辅助节点),使其成为主节点,并安装到所需位置。
在节点 1:
$ umount /mnt
$ drbdadm secondary linuxhandbook
在节点 2:
$ drbdadm primary linuxhandbook
$ mount /dev/drbd0 /mnt
在 node2 上成功挂载后,检查 /mnt 文件夹中的文件。 您必须看到 drbdtest.txt 文件(在 node1 创建)。
$ ll /mnt/
如果你想有 GUI 界面来管理和可视化 drbd 集群节点,你可以使用 LCMC (Linux 集群管理控制台)。
就是这样! 您已在系统中成功实施 DRBD。 如果还有任何疑问,您可以在下面的评论部分发表评论。
作者: Rishi Raj Gautam 是 Linux 爱好者和开源活动家。