21 DRBD #
通过分布式复制块设备 (DRBD*),您可以为位于 IP 网络上两个不同站点的两个块设备创建镜像。和 Corosync 一起使用时,DRBD 支持分布式高可用性 Linux 群集。本章说明如何安装和设置 DRBD。
21.1 概念概述 #
DRBD 以确保数据的两个副本保持相同的方式将主设备上的数据复制到次设备上。将其视为联网的 RAID 1。它实时对数据进行镜像,以便连续复制。应用程序不需要知道实际上它们的数据储存在不同的磁盘上。
DRBD 是 Linux 内核模块,位于下端的 I/O 调度程序与上端的文件系统之间,请参见图 21.1 “DRBD 在 Linux 中的位置”。要与 DRBD 通讯,用户需使用高级别命令 drbdadm
。为了提供最大的灵活性,DRBD 附带了低级别工具 drbdsetup
。
镜像之间的数据通讯是不加密的。为实现安全数据交换,您应为连接部署虚拟专用网 (VPN) 解决方案。
DRBD 允许使用 Linux 支持的任何块设备,通常包括:
硬盘分区或完整硬盘
软件 RAID
逻辑卷管理器 (LVM)
企业卷管理系统 (EVMS)
默认情况下,DRBD 使用 TCP 端口 7788
及更高端口进行 DRBD 节点间的通讯。请确保您的防火墙不会阻止所用端口上的通讯。
在 DRBD 设备上创建文件系统之前,必须先设置 DRBD 设备。与用户数据相关的所有操作都应通过 /dev/drbdN
设备单独执行,而不是在原始设备上执行,因为 DRBD 会将原始设备的最后一个部分用于元数据。使用原始设备会导致数据不一致。
借助 udev 集成,您还可以获取 /dev/drbd/by-res/RESOURCES
格式的符号链接,这种链接更易于使用,而且还能防范在记错设备次要编号的情况下出现安全问题。
例如,如果原始设备大小为 1024 MB,则 DRBD 设备仅有 1023 MB 可用于数据存储,而大约保留 70 KB 的隐藏容量用于存储元数据。通过原始磁盘访问剩余 KB 的任何尝试都会失败,因为这些 KB 不可用于储存用户数据。
21.2 安装 DRBD 服务 #
按第 I 部分 “安装、设置和升级”中所述在联网群集中的两台 SUSE Linux Enterprise Server 计算机上安装 High Availability Extension。安装 High Availability Extension 时还安装 DRBD 程序文件。
如果不需要完整群集堆栈而只需使用 DRBD,请安装软件包 drbd、 drbd-kmp-FLAVOR、 drbd-utils和 yast2-drbd。
要简化 drbdadm
的处理,可使用 Bash 补全支持。如果要在当前外壳会话中启用它,请插入以下命令:
root #
source
/etc/bash_completion.d/drbdadm.sh
要将其永久用于 root
,请创建或扩展文件 /root/.bashrc
并插入上一行。
21.3 设置 DRBD 服务 #
以下过程使用服务器名称 alice 和 bob,以及群集资源名称 r0
。它将 alice 设置为主节点,并使用 /dev/sda1
储存数据。确保修改这些说明,以使用您自己的节点和文件名。
以下几节假定您有两个节点 alice 和 bob,它们应使用 TCP 端口 7788
。确保此端口在防火墙中处于打开状态。
准备系统:
确保 Linux 节点中的块设备已就绪且已分区(如果需要)。
如果磁盘包含您已不再需要的文件系统,请使用以下命令销毁文件系统结构:
root #
dd
if=/dev/zero of=YOUR_DEVICE count=16 bs=1M如果有多个文件系统需要销毁,请在您希望包含到 DRBD 设置中的所有设备上重复此步骤。
如果群集已在使用 DRBD,请将群集置于维护模式:
root #
crm
configure property maintenance-mode=true当群集已使用 DRBD 时,如果您跳过此步骤,当前配置中的语法错误会导致服务关闭。
或者,也可以使用
drbdadm
-c 文件
来测试配置文件。
选择相应的方法来配置 DRBD:
如果您已配置 Csync2(这应该是默认设置),则 DRBD 配置文件已包含在需要同步的文件列表中。要同步文件,请使用以下命令:
root #
csync2
-xv /etc/drbd.d/如果您不具有 Csync2(或不想使用它),请将 DRBD 配置文件手动复制到其他节点:
root #
scp
/etc/drbd.conf bob:/etc/root #
scp
/etc/drbd.d/* bob:/etc/drbd.d/执行初始同步(请参见第 21.3.3 节 “初始化和格式化 DRBD 资源”)。
重设置群集的维护模式标志:
root #
crm
configure property maintenance-mode=false
21.3.1 手动配置 DRBD #
DRBD9 的“自动升级”功能可以使用克隆和文件系统资源,而非主/从连接。如果使用此功能时正在挂载某个文件系统,DRBD 会自动变为主要模式。
目前,自动升级功能仅具有受限支持。使用 DRBD 9 时,SUSE 支持的用例与使用 DRBD 8 时相同。除此以外的用例(例如所包含节点超过两个的设置)不受支持。
要手动设置 DRBD,请按如下操作:
从 DRBD 版本 8.3 开始,以前的配置文件将拆分成几个独立的文件,位于目录 /etc/drbd.d/
下。
打开文件
/etc/drbd.d/global_common.conf
。它已包含一些全局预定义值。转到startup
部分并插入以下行:startup { # wfc-timeout degr-wfc-timeout outdated-wfc-timeout # wait-after-sb; wfc-timeout 100; degr-wfc-timeout 120; }
这些选项用于在引导时减少超时,有关更多细节,请参见 https://docs.linbit.com/docs/users-guide-9.0/#ch-configure。
创建
/etc/drbd.d/r0.res
文件。根据具体情况更改相应的行并保存文件:resource r0 { 1 device /dev/drbd0; 2 disk /dev/sda1; 3 meta-disk internal; 4 on alice { 5 address 192.168.1.10:7788; 6 node-id 0; 7 } on bob { 5 address 192.168.1.11:7788; 6 node-id 1; 7 } disk { resync-rate 10M; 8 } connection-mesh { 9 hosts alice bob; } }
方便与需要资源的服务建立某种关联的 DRBD 资源名称。例如
nfs
、http
、mysql_0
、postgres_wal
等。本文中使用更一般的名称r0
。DRBD 的设备名及其次要编号。
在以上示例中,为 DRBD 使用了次要编号 0。udev 集成脚本将提供符号链接
/dev/drbd/by-res/nfs/0
。也可以在配置中忽略设备节点名称,改为使用以下行:drbd0 minor 0
(/dev/
是可选的)或/dev/drbd0
在节点间复制的原始设备。请注意,在本例中,两个节点上的设备相同。如果需要不同的设备,请将
disk
参数移到on
主机中。元磁盘参数通常包含值
internal
,但可以明确指定一个设备来保存元数据。有关更多信息,请参见https://docs.linbit.com/docs/users-guide-9.0/#s-metadata。on
部分指定了此配置语句要应用到的主机。各个节点的 IP 地址和端口号。每个资源都需要单独的端口,通常从
7788
开始。DRBD 资源的两个端口必须相同。配置两个以上的节点时,需要节点 ID。该 ID 是用于区分不同节点的唯一非负整数。
同步率。将其设置为磁盘和网络带宽中较小者的三分之一。它仅限制重新同步,而不限制复制。
定义网格的所有节点。
hosts
参数包含共享相同 DRBD 设置的所有主机名。检查配置文件的语法。如果以下命令返回错误,请校验文件:
root #
drbdadm
dump all
21.3.2 使用 YaST 配置 DRBD #
可以使用 YaST 来启动 DRBD 的初始设置。创建 DRBD 设置后,可以手动调整生成的文件。
但是,一旦更改了配置文件,请不要再使用 YaST DRBD 模块。DRBD 模块仅支持有限的一组基本配置。如果您再次使用该模块,它很有可能不会显示您所做的更改。
要使用 YaST 设置 DRBD,请执行以下操作:
启动 YaST 并选择配置模块
› 。如果您已有 DRBD 配置,YaST 会向您发出警告。YaST 会更改您的配置,并将旧的 DRBD 配置文件另存为*.YaSTsave
文件。将
› 中的引导标志保留原样(默认情况下为off
);请不要更改此项设置,因为 Pacemaker 会管理此服务。如果正在运行防火墙,请启用
。转到图 21.2 “资源配置”)。
项。按 创建新资源(请参见图 21.2︰ 资源配置 #需要设置以下参数:
DRBD 资源的名称(必填)
相关节点的主机名
相应节点的 IP 地址和端口号(默认值
7788
)用于访问复制数据的块设备路径。如果设备包含次要编号,则关联的块设备通常命名为
/dev/drbdX
,其中的 X 是设备次要编号。如果设备不包含次要编号,请务必在设备名称后面添加minor 0
。在两个节点之间复制的原始设备。如果您使用 LVM,请插入 LVM 设备名称。
可将
的值设为internal
,或明确指定一个由索引扩展的设备来保存 DRBD 所需的元数据。一个实际设备也可用于多个 DRBD 资源。例如,如果第一个资源的
为/dev/sda6[0]
,则可以将/dev/sda6[1]
用于第二个资源。但是,必须为此磁盘上的每个资源保留至少 128 MB 空间。固定的元数据大小会限制可复制的最大数据大小。
所有这些选项在
/usr/share/doc/packages/drbd/drbd.conf
文件的示例和drbd.conf(5)
的手册页中均有说明。单击
。单击
输入第二个 DRBD 资源,然后单击 完成。单击
和 关闭资源配置。如果您对 DRBD 使用 LVM,则需要在 LVM 配置文件中更改一些选项(请参见
项)。YaST DRBD 模块可自动完成此项更改。LVM 过滤器中将会拒绝 DRBD 资源的 localhost 磁盘名称和默认过滤器。只能在
/dev/drbd
中扫描 LVM 设备。例如,如果将
/dev/sda1
用作 DRBD 磁盘,系统会插入设备名称作为 LVM 过滤器中的第一项。要手动更改过滤器,请单击 复选框。单击
以保存更改。
21.3.3 初始化和格式化 DRBD 资源 #
准备好系统并配置好 DRBD 后,请执行磁盘的首次初始化:
在 alice 和 bob 这两个节点上,初始化元数据储存:
root #
drbdadm
create-md r0root #
drbdadm
up r0要想缩短 DRBD 资源的初始重新同步时间,请检查以下项:
如果所有节点上的 DRBD 设备都具有相同数据(例如,通过使用第 21.3 节 “设置 DRBD 服务”中所述的
dd
命令销毁文件系统结构),则请在这两个节点上使用以下命令跳过初始重新同步步骤:root #
drbdadm
new-current-uuid --clear-bitmap r0/0状态将为
Secondary/Secondary UpToDate/UpToDate
否则,请继续下一步。
在主节点 alice 上,启动重新同步过程:
root #
drbdadm
primary --force r0使用以下命令检查状态:
root #
drbdadm
status r0 r0 role:Primary disk:UpToDate bob role:Secondary peer-disk:UpToDate在 DRBD 设备上创建文件系统,例如:
root #
mkfs.ext3
/dev/drbd0挂载文件系统并使用它:
root #
mount
/dev/drbd0 /mnt/
21.4 从 DRBD 8 迁移到 DRBD 9 #
从 DRBD 8(随附于 SUSE Linux Enterprise High Availability Extension 12 SP1 中)到 DRBD 9(随附于 SUSE Linux Enterprise High Availability Extension 12 SP2 中),元数据格式已发生变化。DRBD 9 不会将之前的元数据文件自动转换到新格式。
迁移到 12 SP2 之后,在启动 DRBD 之前,请先将 DRBD 元数据手动转换为版本 9 格式。请使用 drbdadm
create-md
执行此操作。不需要更改任何配置。
使用 DRBD 9 时,SUSE 支持的用例与使用 DRBD 8 时相同。除此以外的用例(例如所包含节点超过两个的设置)不受支持。
DRBD 9 将会回退到与版本 8 兼容的状态。如果有三个或更多节点,您需要重新创建元数据才能使用 DRBD 版本 9 特定选项。
如果具有堆叠式 DRBD 资源,另请参见第 21.5 节 “创建堆叠式 DRBD 设备”了解详细信息。
要保留数据并允许在无需重新创建新资源的情况下添加新节点,请执行以下操作:
将一个节点设置为待机模式。
更新所有节点上的所有 DRBD 软件包,请参见第 21.2 节 “安装 DRBD 服务”。
将新节点信息添加到资源配置中:
node-id (针对每个
on
部分)。connection-mesh 部分在 hosts 参数中包含所有主机名。
请参见过程 21.1 “手动配置 DRBD”中的示例配置。
在使用
internal
作为meta-disk
键时扩大 DRBD 磁盘的空间。使用支持扩大空间的设备,例如 LVM。或者,更换为用于元数据的外部磁盘,并使用meta-disk 设备;
。根据新配置重新创建元数据:
root #
drbdadm
create-md RESOURCE取消待机模式。
21.5 创建堆叠式 DRBD 设备 #
堆叠式 DRBD 设备包含两个其他设备,其中至少有一个设备也是 DRBD 资源。也就是说,DRBD 在一个现有 DRBD 资源的基础上又添加了一个节点(请参见图 21.3 “资源堆叠”)。此类复制设置可用于备份和灾难恢复用途。
三向复制运用了异步(DRBD 协议 A)和同步复制(DRBD 协议 C)。异步部分用于堆叠的资源,同步部分用于备用资源。
您的生产环境使用堆叠设备。例如,如果您有一个 DRBD 设备 /dev/drbd0
和一个堆叠在其上的设备 /dev/drbd10
,则将会在 /dev/drbd10
上创建文件系统(请参见例 21.1 “三节点堆叠式 DRBD 资源的配置”了解更多细节)。
# /etc/drbd.d/r0.res resource r0 { protocol C; device /dev/drbd0; disk /dev/sda1; meta-disk internal; on amsterdam-alice { address 192.168.1.1:7900; } on amsterdam-bob { address 192.168.1.2:7900; } } resource r0-U { protocol A; device /dev/drbd10; stacked-on-top-of r0 { address 192.168.2.1:7910; } on berlin-charlie { disk /dev/sda10; address 192.168.2.2:7910; # Public IP of the backup node meta-disk internal; } }
21.6 使用资源级别屏蔽 #
当 DRBD 复制链路中断时,Pacemaker 会尝试将 DRBD 资源升级到另一个节点。为防止 Pacemaker 使用过时的数据启动服务,请按例 21.2 “使用群集信息库 (CIB) 启用资源级别屏蔽的 DRBD 配置”中所示,在 DRBD 配置文件中启用资源级屏蔽。
resource RESOURCE { net { fencing resource-only; # ... } handlers { fence-peer "/usr/lib/drbd/crm-fence-peer.9.sh"; after-resync-target "/usr/lib/drbd/crm-unfence-peer.9.sh"; # ... } ... }
如果 DRBD 复制链路断开,DRBD 将执行以下操作:
DRBD 调用
crm-fence-peer.9.sh
脚本。该脚本会联系群集管理器。
该脚本会确定与此 DRBD 资源关联的 Pacemaker 资源。
该脚本会确保 DRBD 资源不再升级到其他任何节点。DRBD 资源将保留在当前活动的节点上。
如果复制链路再次连通并且 DRBD 完成了其同步过程,则去除该约束。现在,群集管理器可以任意升级资源。
21.7 测试 DRBD 服务 #
如果安装和配置过程和预期一样,则您就准备好运行 DRBD 功能的基本测试了。此测试还有助于了解该软件的工作原理。
在 alice 上测试 DRBD 服务。
打开终端控制台,然后以
root
用户身份登录。在 alice 上创建一个挂载点,如
/srv/r0
:root #
mkdir
-p /srv/r0挂载
drbd
设备:root #
mount
-o rw /dev/drbd0 /srv/r0从主节点创建文件:
root #
touch
/srv/r0/from_alice卸载 alice 上的磁盘:
root #
umount
/srv/r0通过在 alice 上键入以下命令,降级 alice 上的 DRBD 服务:
root #
drbdadm
secondary r0
在 bob 上测试 DRBD 服务。
在 bob 上打开终端控制台,然后以
root
身份登录。在 bob 上,将 DRBD 服务升级为主服务:
root #
drbdadm
primary r0在 bob 上,检查 bob 是否为主节点:
root #
drbdadm
status r0在 bob 上,创建一个挂载点,如
/srv/r0
:root #
mkdir
/srv/r0在 bob 上,挂载 DRBD 设备:
root #
mount
-o rw /dev/drbd0 /srv/r0校验在 alice 上创建的文件是否存在:
root #
ls
/srv/r0/from_alice/srv/r0/from_alice
文件应该会列出。
如果该服务在两个节点上都运行正常,则 DRBD 安装即已完成。
再次将 alice 设置为主节点。
通过在 bob 上键入以下命令,卸下 bob 上的磁盘:
root #
umount
/srv/r0通过在 bob 上键入以下命令,降级 bob 上的 DRBD 服务:
root #
drbdadm
secondary r0在 alice 上,将 DRBD 服务升级为主服务:
root #
drbdadm
primary r0在 alice 上,检查 alice 是否为主节点:
root #
drbdadm
status r0
要使服务在服务器出问题时自动启动并进行故障转移,可以使用 Pacemaker/Corosync 将 DRBD 设置为高可用性服务。有关针对 SUSE Linux Enterprise 15 SP3 进行安装和配置的信息,请参见第 II 部分 “配置和管理”。
21.8 监视 DRBD 设备 #
DRBD 随附了可提供实时监视的实用程序 drbdmon
。该实用程序会显示所有已配置的资源及其问题。
drbdmon
显示了一个正常的连接 #如果出现了问题,drbdadm
会显示错误消息:
drbdmon
显示了一个错误的连接 #21.9 调整 DRBD #
可使用几种方式调整 DRBD:
对元数据使用外部磁盘。这可能会有所帮助,不过会降低维护便捷性。
通过
sysctl
更改接收和发送缓冲区设置,以优化网络连接。在 DRBD 配置中更改
max-buffers
和/或max-epoch-size
。根据 IO 模式增大
al-extents
值。如果您有一个配备了 BBU(电池备份单元)的硬件 RAID 控制器,设置
no-disk-flushes
、no-disk-barrier
和/或no-md-flushes
可能会有所帮助。根据工作负载启用读平衡。有关详细信息,请参见https://www.linbit.com/en/read-balancing/。
21.10 DRBD 查错 #
DRBD 设置涉及很多组件,因此导致问题发生的原因多种多样。以下各部分包括多个常用方案和多种建议解决方案。
21.10.1 配置 #
如果初始 DRBD 设置不符合预期,说明配置中可能有错误。
获取关于配置的信息:
打开终端控制台,然后以
root
用户身份登录。通过运行
drbdadm
(带-d
选项),测试配置文件。输入下面的命令:root #
drbdadm
-d adjust r0在
adjust
选项的干运行中,drbdadm
将 DRBD 资源的实际配置与您的 DRBD 配置文件进行比较,但它不会执行这些调用。检查输出以确保您了解任何错误的根源。如果
/etc/drbd.d/*
和drbd.conf
文件中存在错误,请先更正,然后再继续。如果分区和设置正确,请在不使用
-d
的情况下再次运行drbdadm
。root #
drbdadm
adjust r0这会将配置文件应用到 DRBD 资源。
21.10.2 主机名 #
对于 DRBD,主机名区分大小写(Node0
和 node0
是不同的主机),并将与内核中储存的主机名进行比较(参见 uname -n
输出)。
如果有多个网络设备,且想要使用专用网络设备,可能不会将主机名解析为所用的 IP 地址。在这种情况下,可使用参数 disable-ip-verification
。
21.10.3 TCP 端口 7788 #
如果系统无法连接到对等体,说明本地防火墙可能有问题。默认情况下,DRBD 使用 TCP 端口 7788
访问另一个节点。确保在两个节点上该端口均可访问。
21.10.4 DRBD 设备在重引导后中断连接 #
如果 DRBD 不知道哪个实际设备保管了最新数据,它就会变为节点分裂状态。在这种情况下,DRBD 子系统将分别成为次系统,并且互不相连。在这种情况下,可以在日志记录数据中找到以下消息:
Split-Brain detected, dropping connection!
要解决此问题,请在要丢弃其数据的节点上输入以下命令:
root #
drbdadm
secondary r0
如果状态为 WFconnection
,则请先断开连接:
root #
drbdadm
disconnect r0
在具有最新数据的节点上输入以下命令:
root #
drbdadm
connect --discard-my-data r0
通过使用对等体的数据重写一个节点的数据,以此确保两个节点上的视图保持一致,该问题可得到解决。
21.11 更多信息 #
以下开放源代码资源可用于 DRBD:
项目主页:http://www.drbd.org。
Linux Pacemaker 群集堆栈项目的 http://clusterlabs.org/wiki/DRBD_HowTo_1.0。
发行套件中提供了 DRBD 的以下手册页:
drbd(8)
、drbdmeta(8)
、drbdsetup(8)
、drbdadm(8)
、drbd.conf(5)
。/usr/share/doc/packages/drbd-utils/drbd.conf.example
中提供了被注释的 DRBD 示例配置。此外,为了更方便地在整个群集中进行储存管理,请参见 https://www.linbit.com/en/drbd-manager/ 上有关 DRBD-Manager 的最新声明。