使用DRBD
11.常见的管理任务
本章概述了日常操作中遇到的典型管理任务。它不包括故障排除任务,这些内容在“ 故障排除和错误恢复”中有详细介绍。
11.1。配置DRBD
11.1.1。准备下层存储
安装DRBD之后,必须在两个群集节点上留出一个大小大致相同的存储区域。这将成为您的DRBD资源的下层设备。为此,您可以使用系统上找到的任何类型的阻止设备。典型示例包括:
- 硬盘分区(或完整的物理硬盘),
- 软件RAID设备,
- LVM逻辑卷或由Linux设备映射器基础结构配置的任何其他块设备,
- 系统上找到的任何其他块设备类型。
您还可以使用资源堆栈,这意味着您可以将一个DRBD设备用作另一个的低层设备。一些特定的考虑因素适用于堆叠的资源;在创建堆叠的三节点设置中详细介绍了它们的配置。
尽管可以将环路设备用作DRBD的较低级设备,但由于死锁问题,不建议这样做。 |
这是不是必要的,你从它创建一个DRBD资源之前,该存储区域是空的。实际上,使用DRBD从以前的非冗余单服务器系统创建两节点群集是一个常见的用例(有一些注意事项,如果打算这样做,请参考 DRBD元数据)。
就本指南而言,我们假设设置非常简单:
- 两台主机都有一个名为的空闲(当前未使用)分区 /dev/sda7。
- 我们正在使用内部元数据。
11.1.2。准备网络配置
尽管不是严格要求,但建议您通过专用连接运行DRBD复制。在撰写本文时,最合理的选择是直接,背对背的千兆以太网连接。当DRBD在交换机上运行时,建议使用冗余组件和绑定驱动程序(在活动备份模式下)。
由于明显的性能缺陷(不利地影响吞吐量和延迟),通常不建议通过路由器运行DRBD复制。
就本地防火墙的考虑而言,重要的是要了解DRBD(按照惯例)使用7788以上的TCP端口,每个资源都侦听一个单独的端口。DRBD 为配置的每个资源使用两个 TCP连接。为了获得适当的DRBD功能,防火墙配置要求允许这些连接。
如果启用了强制访问控制(MAC)方案(例如SELinux或AppArmor),则除防火墙之外的其他安全注意事项也可能适用。您可能需要调整本地安全策略,以免DRBD无法正常运行。
当然,您还必须确保DRBD的TCP端口尚未被其他应用程序使用。
(尚未)无法配置DRBD资源以支持多个TCP连接对。如果要提供DRBD连接负载平衡或冗余,则可以在以太网级别轻松进行(同样,使用绑定驱动程序)。
就本指南而言,我们假设设置非常简单:
- 我们的两个DRBD主机每个都有一个当前未使用的网络接口 eth1,分别具有IP地址10.1.1.31和IP地址10.1.1.32。
- 在任何主机上,没有其他服务在使用TCP端口7788至7799。
- 本地防火墙配置允许主机之间通过这些端口进行入站和出站TCP连接。
11.1.3。配置您的资源
DRBD的所有方面都在其配置文件中进行控制 /etc/drbd.conf。通常,此配置文件只是具有以下内容的框架:
include "/etc/drbd.d/global_common.conf";
include "/etc/drbd.d/*.res";
按照约定,/etc/drbd.d/global_common.conf包含 DRBD配置的 global和common部分,而.res文件resource每个包含一个部分。
也可以drbd.conf用作完全不带任何include语句的平面配置文件。但是,这样的配置很快变得混乱并且难以管理,这就是为什么多文件方法是首选的原因。
无论采用哪种方法,都应始终确保drbd.conf,以及它包含的任何其他文件在所有参与的集群节点上都完全相同。
DRBD源压缩文件在scripts子目录中包含一个示例配置文件 。二进制安装软件包将直接在/etc或特定于软件包的文档目录(例如)中 安装此示例配置/usr/share/doc/packages/drbd。
本节仅描述了配置文件的这几个方面,这些方面对于使DRBD正常启动和运行绝对是必不可少的。配置文件的语法和内容在的手册页中有详细记录drbd.conf。
配置示例
出于本指南的目的,我们假定与上一节中给出的示例相符的最小设置:
清单7.简单的DRBD配置(/etc/drbd.d/global_common.conf)
global {
usage-count yes;
}
common {
net {
protocol C;
}
}
清单8.简单的DRBD资源配置(/etc/drbd.d/r0.res)
resource r0 {
on alice {
device /dev/drbd1;
disk /dev/sda7;
address 10.1.1.31:7789;
meta-disk internal;
}
on bob {
device /dev/drbd1;
disk /dev/sda7;
address 10.1.1.32:7789;
meta-disk internal;
}
}
本示例以以下方式配置DRBD:
- 您“选择加入”以包含在DRBD的使用情况统计信息中(请参阅参考资料 usage-count)。
- 除非另有明确指定,否则资源将配置为使用完全同步复制(协议C)。
- 我们的集群由两个节点“ alice”和“ bob”组成。
- 我们有一个任意命名的资源r0,它/dev/sda7用作下层设备,并配置有 内部元数据。
- 资源使用TCP端口7789进行网络连接,并分别绑定到IP地址10.1.1.31和10.1.1.32。(这隐式定义了所使用的网络连接。)
上面的配置在资源中隐式创建一个卷,编号为零(0)。对于一个资源中的多个卷,请如下修改语法(假设两个节点上都使用相同的低级存储块设备):
清单9.多卷DRBD资源配置(/etc/drbd.d/r0.res)
resource r0 {
volume 0 {
device /dev/drbd1;
disk /dev/sda7;
meta-disk internal;
}
volume 1 {
device /dev/drbd2;
disk /dev/sda8;
meta-disk internal;
}
on alice {
address 10.1.1.31:7789;
}
on bob {
address 10.1.1.32:7789;
}
}
卷也可以动态添加到现有资源中。有关示例,请参阅将新的DRBD卷添加到现有的卷组中。 |
本global节
在配置中,此部分仅允许一次。通常在/etc/drbd.d/global_common.conf文件中。在单文件配置中,它应该转到配置文件的最顶部。在本节中可用的几个选项中,只有一个与大多数用户相关:
usage-count
DRBD项目保留有关各种DRBD版本使用情况的统计信息。每次在系统上安装新的DRBD版本时,都要联系HTTP服务器来完成此操作。可以通过设置禁用 usage-count no;。默认值为usage-count ask;每次升级DRBD时都会提示您。
当然,DRBD的使用情况统计信息是公开可用的:请参阅 http://usage.drbd.org。
本common节
本节提供了一种简便的方法来定义每个资源继承的配置设置。通常在中找到 /etc/drbd.d/global_common.conf。您可以定义任何选项,也可以基于每个资源定义。
common并非严格要求包含一个部分,但是如果您使用多个资源,则强烈建议您包括在内。否则,配置会因重复使用的选项而迅速变得混乱。
在上面的示例中,我们已net { protocol C; }将该 common部分包括在内,因此,每个配置的资源(包括r0)都将继承此选项,除非它具有protocol明确配置的另一个选项。有关其他可用的同步协议,请参见复制模式。
该resource节
每个资源的配置文件通常命名为 。您定义的任何DRBD资源都必须通过在配置中指定资源名称来命名。约定仅使用字母,数字和下划线;尽管从技术上讲也可以使用其他字符,但是如果偶然发现需要更具体的语法,您将不会喜欢该结果。/etc/drbd.d/resource.respeer@resource/volume
每个资源配置还必须至少包含两个on host子节,每个子节一个。所有其他配置设置要么继承自该common部分(如果存在),要么继承自DRBD的默认设置。
此外,可以在该resource部分中直接指定所有主机上具有相等值的选项。因此,我们可以进一步浓缩示例配置,如下所示:
resource r0 {
device /dev/drbd1;
disk /dev/sda7;
meta-disk internal;
on alice {
address 10.1.1.31:7789;
}
on bob {
address 10.1.1.32:7789;
}
}
11.1.4。定义网络连接
当前,DRBD 9中的通信链接必须建立完整的网格,即。在每个资源中,每个节点都必须与每个其他节点(当然不包括自身)直接连接。
对于简单的情况,两台主机drbdadm将自己插入(单个)网络连接,以易于使用和向后兼容。
最终的结果是主机上的网络连接数量增加了两倍。对于“传统”两个节点,需要一个连接。对于三个主机,有三个节点对;四,六对;5个主机:10个连接,依此类推。对于(当前)最多16个节点,将有120个主机对可以连接。
图9. N个主机的连接数
三个主机的配置文件示例如下:
resource r0 {
device /dev/drbd1;
disk /dev/sda7;
meta-disk internal;
on alice {
address 10.1.1.31:7000;
node-id 0;
}
on bob {
address 10.1.1.32:7001;
node-id 1;
}
on charlie {
address 10.1.1.33:7002;
node-id 2;
}
connection {
host alice port 7010;
host bob port 7001;
}
connection {
host alice port 7020;
host charlie port 7002;
}
connection {
host bob port 7012;
host charlie port 7021;
}
}
这些on host部分中的address值的端口是可选的;但是您必须为每个连接指定不同的端口号。
对于此预发行版,必须定义整个连接网格。 在最终版本中,为每个节点提供一个端口就足够了,并且DRBD将在握手期间确定它正在与哪个对等节点进行通信。 |
或者,使用该connection-mesh选项,可以配置三个相同的节点:
resource r0 {
device /dev/drbd1;
disk /dev/sda7;
meta-disk internal;
on alice {
address 10.1.1.31:7000;
node-id 0;
}
on bob {
address 10.1.1.32:7001;
node-id 1;
}
on charlie {
address 10.1.1.33:7002;
node-id 2;
}
connection-mesh {
hosts alice bob charlie;
net {
use-rle no;
}
}
}
如果服务器中有足够的网卡,则可以在服务器对之间创建直接的交叉链接。单个四端口以太网卡允许具有单个管理接口,并连接其他3台服务器,从而获得4个群集节点的完整网格。
在这种情况下,您可以指定其他IP地址以使用直接链接:
resource r0 {
...
connection {
host alice address 10.1.2.1 port 7010;
host bob address 10.1.2.2 port 7001;
}
connection {
host alice address 10.1.3.1 port 7020;
host charlie address 10.1.3.2 port 7002;
}
connection {
host bob address 10.1.4.1 port 7021;
host charlie address 10.1.4.2 port 7012;
}
}
为了便于维护和调试,建议为每个端点使用不同的端口-查看tcpdump跟踪可以轻松地将数据包关联起来。
以下示例仍将仅使用两台服务器;请参阅 四节点示例配置示例。
11.1.5。配置传输实施
DRBD支持多种网络传输。可以为资源的每个连接配置传输实现。
TCP / IP
resource <resource> {
net {
transport "tcp";
}
...
}
tcp是默认传输方式。即,缺少传输选项的每个连接都使用tcp传输。
的tcp:运输可以用净选项进行配置sndbuf-size,rcvbuf-size, connect-int,sock-check-timeo,ping-timeo,timeout。
RDMA
resource <resource> {
net {
transport "rdma";
}
...
}
的rdma:运输可以用净选项进行配置sndbuf-size,rcvbuf-size, max_buffers,connect-int,sock-check-timeo,ping-timeo,timeout。
该rdma传输是零拷贝接收传输。这意味着max_buffers配置选项必须设置为足以容纳全部的值 rcvbuf-size。
rcvbuf-size以字节为单位配置,而max_buffers以页为单位配置。为了获得最佳性能max_buffers,其大小应足以容纳rcvbuf-size任何时间点可能要传输到后端设备的所有数据量。 |
如果您将InfiniBand HCA与rdma传输一起使用,则还需要配置IPoIB。IP地址不用于数据传输,但用于在建立连接时查找正确的适配器和端口。 |
配置选项sndbuf-size,rcvbuf-size只考虑在建立连接的时间。即,您可以在建立连接后更改它们。它们将在重新建立连接后生效。 |
RDMA的性能注意事项
通过查看伪文件/ sys / kernel / debug / drbd / <resource> / connections / <peer> / transport,可以监视可用接收描述符(rx_desc)和传输描述符(tx_desc)的计数。如果其中一种描述符耗尽,则应增加 sndbuf-size或rcvbuf-size。
11.1.6。首次启用您的资源
完成前面各节概述的初始资源配置后,可以启动资源。
必须在两个节点上完成以下每个步骤。
请注意,在我们的示例配置摘要(resource r0 { … })中,<resource>将为r0。
创建设备元数据
仅在初始设备创建时才必须完成此步骤。它初始化DRBD的元数据:
# drbdadm create-md <resource>
v09 Magic number not found
Writing meta data...
initialising activity log
NOT initializing bitmap
New drbd meta data block sucessfully created.
请注意,元数据中分配的位图插槽数量取决于此资源的主机数量;默认情况下,对资源配置中的主机进行计数。如果在创建元数据之前指定了所有主机,则这将“正常工作”;稍后可以为其他节点添加位图插槽,但需要一些手动工作。
启用资源
此步骤将资源与其支持设备关联(如果是多卷资源,则为多个设备),设置复制参数,并将资源连接到其对等方:
# drbdadm up <resource>
通过观察状态 drbdadm status
drbdsetup的状态输出现在应包含类似于以下内容的信息:
# drbdadm status r0
r0 role:Secondary
disk:Inconsistent
bob role:Secondary
disk:Inconsistent
此时,预计磁盘状态不一致/不一致。 |
到目前为止,DRBD已成功分配了磁盘和网络资源,并可以进行操作。还不知道应该使用哪个节点作为初始设备同步的源。
11.1.7。初始设备同步
DRBD要完全运行还需要执行两个步骤:
选择一个初始同步源
如果要处理新初始化的空磁盘,则此选择完全是任意的。但是,如果您的节点之一已经具有需要保留的有价值的数据,则选择该节点作为同步源至关重要。如果以错误的方向进行初始设备同步,则将丢失该数据。小心点。
开始初始完全同步
必须仅在一个节点上,仅在初始资源配置上并且仅在您选择作为同步源的节点上执行此步骤。要执行此步骤,请发出以下命令:
# drbdadm primary --force <resource>
发出此命令后,将开始初始完全同步。您将可以通过监视其进度 drbdadm status。可能需要一些时间,具体取决于设备的大小。
到目前为止,即使在初始同步完成之前(尽管性能有所降低),您的DRBD设备也可以完全运行。如果从空磁盘开始,现在可能已经在设备上创建了文件系统,将其用作原始块设备,将其挂载,并执行其他与可访问块设备相同的操作。
现在,您可能需要继续使用DRBD,它描述了在资源上执行的常见管理任务。
11.1.8。使用基于卡车的复制
为了使远程节点具有可以随后保持同步的数据,并跳过最初的完整设备同步,请遵循以下步骤。
这假定您的本地节点在主要角色中具有已配置但已断开连接的DRBD资源。也就是说,设备配置已完成,drbd.conf两个节点上存在相同的副本,并且您已在本地节点上发出了用于初始资源提升的命令 -但远程节点尚未连接。
- 在本地节点上,发出以下命令:
# drbdadm new-current-uuid --clear-bitmap <resource>/<volume>
要么
# drbdsetup new-current-uuid --clear-bitmap <minor>
- 创建资源数据及其元数据的一致的逐字副本。例如,您可以通过从RAID-1镜像中卸下可热插拔的驱动器来执行此操作。当然,您将用新驱动器替换它,并重建RAID集,以确保持续的冗余。但是,卸下的驱动器是逐字记录副本,现在可以从现场运出。如果您的本地块设备支持快照副本(例如,在LVM上使用DRBD时),则也可以使用创建快照的按位副本dd。
- 在本地节点上,发出:
# drbdadm new-current-uuid <resource>
或匹配的drbdsetup命令。
请注意,--clear-bitmap在第二次调用中没有该选项。
- 将副本物理传输到远程对等位置。
- 将副本添加到远程节点。再次可能是插入物理磁盘,或将出厂数据的按位复制移植到远程节点上的现有存储上。确保不仅还原或复制已复制的数据,而且还还原或复制关联的DRBD元数据。如果您不这样做,则磁盘传送过程无济于事。
- 在新节点上,我们需要在元数据中修复节点ID,并交换两个节点的对等节点信息。请参见以下几行,以将资源r0卷上的节点ID从2更改为1的示例0。
必须在不使用卷的情况下执行此操作。
V=r0/0
NODE_FROM=2
NODE_TO=1
drbdadm -- --force dump-md $V > /tmp/md_orig.txt
sed -e "s/node-id $NODE_FROM/node-id $NODE_TO/" \
-e "s/^peer.$NODE_FROM. /peer-NEW /" \
-e "s/^peer.$NODE_TO. /peer[$NODE_FROM] /" \
-e "s/^peer-NEW /peer[$NODE_TO] /" \
< /tmp/md_orig.txt > /tmp/md.txt
drbdmeta --force $(drbdadm sh-minor $V) v09 $(drbdadm sh-ll-dev $V) internal restore-md /tmp/md.txt
注意
drbdmeta8.9.7之前的版本无法处理乱序peer部分;您需要通过编辑器交换块。
- 在远程节点上调出资源:
# drbdadm up <resource>
两个对等体连接后,它们将不会启动完整的设备同步。相反,现在开始的自动同步仅覆盖自调用以来已更改的那些块drbdadm --clear-bitmap new-current-uuid。
即使此后没有任何更改,由于活动日志所覆盖的区域会在新的辅助服务器上回滚,因此仍然可能会有一个短暂的同步期 。这可以通过使用基于校验和的同步来减轻 。
无论资源是常规DRBD资源还是堆叠资源,都可以使用相同的过程。对于堆叠的资源,只需将-S或--stacked选项添加到drbdadm。
11.1.9。四个节点的示例配置
这是一个四节点群集的示例。
请注意,connection对于DRBD 9.0.0发行版,这些部分(和不同的端口)将不是必需的。我们会找到一些不错的速记语法。
resource r0 {
device /dev/drbd0;
disk /dev/vg/r0;
meta-disk internal;
on store1 {
address 10.1.10.1:7100;
node-id 1;
}
on store2 {
address 10.1.10.2:7100;
node-id 2;
}
on store3 {
address 10.1.10.3:7100;
node-id 3;
}
on store4 {
address 10.1.10.4:7100;
node-id 4;
}
# All connections involving store1
connection {
host store1 port 7012;
host store2 port 7021;
}
connection {
host store1 port 7013;
host store3 port 7031;
}
connection {
host store1 port 7014;
host store4 port 7041;
}
# All remaining connections involving store2
connection {
host store2 port 7023;
host store3 port 7032;
}
connection {
host store2 port 7024;
host store4 port 7042;
}
# All remaining connections involving store3
connection {
host store3 port 7034;
host store4 port 7043;
}
# store4 already done.
}
相反,相同的配置将如下所示:
resource r0 {
device /dev/drbd0;
disk /dev/vg/r0;
meta-disk internal;
on store1 {
address 10.1.10.1:7100;
node-id 1;
}
on store2 {
address 10.1.10.2:7100;
node-id 2;
}
on store3 {
address 10.1.10.3:7100;
node-id 3;
}
on store4 {
address 10.1.10.4:7100;
node-id 4;
}
connection-mesh {
hosts store1 store2 store3 store4;
}
}
如果您想查看connection-mesh扩展的配置,请尝试。drbdadm dump <resource> -v
再举一个例子,如果四个节点具有足够的接口以通过直接链接[ 6 ]提供完整的网格,则可以指定接口的IP地址:
resource r0 {
...
# store1 has crossover links like 10.99.1x.y
connection {
host store1 address 10.99.12.1 port 7012;
host store2 address 10.99.12.2 port 7021;
}
connection {
host store1 address 10.99.13.1 port 7013;
host store3 address 10.99.13.3 port 7031;
}
connection {
host store1 address 10.99.14.1 port 7014;
host store4 address 10.99.14.4 port 7041;
}
# store2 has crossover links like 10.99.2x.y
connection {
host store2 address 10.99.23.2 port 7023;
host store3 address 10.99.23.3 port 7032;
}
connection {
host store2 address 10.99.24.2 port 7024;
host store4 address 10.99.24.4 port 7042;
}
# store3 has crossover links like 10.99.3x.y
connection {
host store3 address 10.99.34.3 port 7034;
host store4 address 10.99.34.4 port 7043;
}
}
请注意用于IP地址和端口的编号方案。另一个资源可以使用相同的IP地址,但是port ,下一个 等等。71xy72xy