通过分布式复制块设备 (DRBD*),您可以为位于 IP 网络上两个不同站点的两个块设备创建镜像。和 Corosync 一起使用时,DRBD 支持分布式高可用性 Linux 群集。本章说明如何安装和设置 DRBD。
DRBD 以确保数据的两个副本保持相同的方式将主设备上的数据复制到次设备上。将其视为联网的 RAID 1。它实时对数据进行镜像,以便连续复制。应用程序不需要知道实际上它们的数据储存在不同的磁盘上。
镜像之间的数据通讯是不加密的。为实现安全数据交换,您应为连接部署虚拟专用网 (VPN) 解决方案。
DRBD 是 Linux 内核模块,位于下端的 I/O 调度程序与上端的文件系统之间,请参见图 15.1 “DRBD 在 Linux 中的位置”。要与 DRBD 通讯,用户需使用高级别命令 drbdadm。为了提供最大的灵活性,DRBD 附带了低级别工具 drbdsetup。
DRBD 允许使用 Linux 支持的任何块设备,通常包括:
硬盘分区或完整硬盘
软件 RAID
逻辑卷管理器 (LVM)
企业卷管理系统 (EVMS)
默认情况下,DRBD 使用 TCP 端口 7788 及更高端口进行 DRBD 节点间的通讯。请确保您的防火墙不会阻止所用端口上的通讯。
在 DRBD 设备上创建文件系统之前,必须先设置 DRBD 设备。与用户数据相关的所有操作都应通过 /dev/drbd_N 设备单独执行而不是在原始设备上执行,因为 DRBD 会将原始设备的最后一个部分用于存储元数据。使用原始设备会导致数据不一致。
借助 udev 集成,您还可以获取 /dev/drbd/by-res/RESOURCES 格式的符号链接,这种链接更易于使用,而且还能防范在记错设备次要编号的情况下出现安全问题。
例如,如果原始设备大小为 1024 MB,则 DRBD 设备仅有 1023 MB 可用于数据存储,而大约保留 70 KB 的隐藏容量用于存储元数据。通过 /dev/drbdN 访问剩余 KB 的任何尝试都会失败,因为这些 KB 不可用于存储用户数据。
按第 I 部分 “安装和设置”中所述在联网群集中的两台 SUSE Linux Enterprise Server 计算机上安装 High Availability Extension 外接式附件。安装 High Availability Extension 时还安装 DRBD 程序文件。
如果不需要完整群集堆栈而只需使用 DRBD,请安装 drbd 包。
要简化 drbdadm(drbd 包的一个组成部分)的处理,可使用 Bash 补全支持。如果要在当前外壳会话中启用它,请插入以下命令:
root #source/etc/bash_completion.d/drbdadm.sh
要将其永久用于 root,请创建或扩展文件 /root/.bashrc 并插入上一行。
以下过程使用服务器名 jupiter 和 venus,以及群集资源名称 r0。它将 jupiter 设置为主节点,将 /dev/sda1 设置为用于储存。确保修改这些说明,以使用您自己的节点和文件名。
开始配置 DRBD 之前,确保 Linux 节点中的块设备已就绪且已分区(如果需要)。以下过程假定您有两个节点 jupiter 和 venus,它们应使用 TCP 端口 7788。确保此端口在防火墙中处于打开状态。
要手动设置 DRBD,请按如下操作:
如果群集已在使用 DRBD,请将群集置于维护模式:
root #crmconfigure edit node alice attributes maintenance="true"
当群集已使用 DRBD 时,如果您跳过此步骤,当前配置中的语法错误会导致服务关闭。
以 root 用户身份登录。
更改 DRBD 的配置文件:
打开文件 /etc/drbd.conf 并插入以下行(如果尚不存在):
include "drbd.d/global_common.conf"; include "drbd.d/*.res";
从 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;
}这些选项用于在引导时减少超时,有关更多细节,请参见 http://www.drbd.org/users-guide-emb/re-drbdconf.html。
创建文件 /etc/drbd.d/r0.res,根据具体情况更改行,然后保存:
resource r0 { 1
device /dev/drbd0; 2
disk /dev/sda1; 3
meta-disk internal; 4
on jupiter { 5
address 192.168.1.10:7788; 6
}
on venus { 5
address 192.168.1.11:7788; 6
}
syncer {
rate 7M; 7
}
}
方便与需要这些资源的服务建立某种关联的名称。例如 | |
DRBD 的设备名及其次要编号。
在以上示例中,为 DRBD 使用了次要编号 0。udev 集成脚本将提供符号链接
| |
在节点间复制的原始设备。请注意,在本例中,两个节点上的设备相同。如果需要不同的设备,请将 | |
元磁盘参数通常包含值 | |
| |
各个节点的 IP 地址和端口号。每个资源都需要单独的端口,通常从 | |
同步率。将其设置为磁盘和网络带宽中较小者的三分之一。它仅限制重新同步,而不限制复制。 |
检查配置文件的语法。如果以下命令返回错误,请校验文件:
root #drbdadmdump all
如果您已配置 Csync2(这应该是默认设置),则 DRBD 配置文件已包含在需要同步的文件的列表中。要同步文件,请使用以下命令:
root #csync2-xv /etc/drbd.d/
如果您不具有 Csync2(或不想使用它),请将 DRBD 配置文件手动复制到其他节点:
root #scp/etc/drbd.conf venus:/etc/ scp /etc/drbd.d/* venus:/etc/drbd.d/
通过在每个节点上输入以下命令,初始化两个系统上的元数据:
root #drbdadmcreate-md r0root #systemctlstart drbd.service
如果磁盘已包含不再需要的文件系统,请使用以下命令清空文件系统结构,然后重复此步骤:
root #ddif=/dev/zero of=/dev/sda1 count=16 bs=1M
通过在每个节点上输入以下命令,监视 DRBD 状态:
root #systemctlstatus drbd.service
应得到类似以下内容的输出:
[... version string omitted ...] m:res cs ro ds p mounted fstype 0:r0 Connected Secondary/Secondary Inconsistent/Inconsistent C
在所需的主节点(本例中为 jupiter)上启动重新同步过程:
root #drbdadm-- --overwrite-data-of-peer primary r0
再次使用 systemctl status drbd.service 检查状态,重新同步后,您将得到:
... m:res cs ro ds p mounted fstype 0:r0 Connected Primary/Secondary UpToDate/UpToDate C
ds 行中的状态(磁盘状态)在两个节点上都必须为 UpToDate。
在 DRBD 设备上创建文件系统,例如:
root #mkfs.ext3/dev/drbd/by-res/r0/0
装入文件系统并使用它:
root #mount/dev/drbd /mnt/
重设置群集的维护模式标志:
root #crmconfigure edit node alice attributes maintenance="false"
或者,要使用 YaST 配置 DRBD,请按照以下操作继续:
启动 YaST 并选择配置模块 › 。如果您已有 DRBD 配置,YaST 会向您发出警告。YaST 会更改您的配置,并将旧的 DRBD 配置文件另存为 *.YaSTsave 文件。
将 › 中的引导标志保留原样(默认情况下为 off);请不要更改此项设置,因为 Pacemaker 会管理此服务。
资源的实际配置可在中完成(请参见图 15.2 “资源配置”)。
按可创建新资源。需要设置以下参数两次:
|
|
资源的名称(必需) |
|
|
相关节点的主机名 |
|
|
相应节点的 IP 地址和端口号(默认值 7788) |
|
|
用于访问复制数据的块设备路径。 |
|
|
在两个节点之间进行复制的设备。 |
|
|
可将的值设为
实际设备也可用于多个 drbd 资源。例如,如果第一个资源的为 |
所有这些选项在 /usr/share/doc/packages/drbd/drbd.conf 文件的示例和 drbd.conf(5) 的手册页中均有说明。
如果您已配置 Csync2(这应该是默认设置),则 DRBD 配置文件已包含在需要同步的文件的列表中。要同步文件,请使用以下命令:
root #csync2-xv /etc/drbd.d/
如果您不具有 Csync2(或不想使用它),请将 DRBD 配置文件手动复制到其他节点(此处是名为 venus 的另一个节点):
root #scp/etc/drbd.conf venus:/etc/ scp /etc/drbd.d/* venus:/etc/drbd.d/
通过在每个节点上输入以下命令,初始化并启动两个系统上的 DRBD 服务:
root #drbdadmcreate-md r0root #systemctlstart drbd.service
通过在 alice 上输入以下命令,将 alice 配置为主节点:
root #drbdsetup/dev/drbd0 primary --overwrite-data-of-peer
通过在每个节点上输入以下命令,检查 DRBD 服务状态:
root #systemctlstatus drbd.service
继续之前,等待两个节点上的块设备完全同步。重复 systemctl status drbd.service 命令以跟踪同步进度。
两个节点上的块设备都完全同步之后,使用首选文件系统格式化主节点上的 DRBD 设备。可以使用任何 Linux 文件系统。建议使用 /dev/drbd/by-res/RESOURCE 名称。
如果安装和配置过程和预期一样,则您就准备好运行 DRBD 功能的基本测试了。此测试还有助于了解该软件的工作原理。
在 jupiter 上测试 DRBD 服务。
打开终端控制台,然后以 root 用户身份登录。
在 jupiter 上创建一个安装点,如 /srv/r0
root #mkdir-p /srv/r0
装入 drbd 设备:
root #mount-o rw /dev/drbd0 /srv/r0
从主节点创建文件:
root #touch/srv/r0/from_jupiter
卸载 jupiter 上的磁盘:
root #umount/srv/r0
通过在 jupiter 上输入以下命令,降级 jupiter 上的 DRBD 服务:
root #drbdadmsecondary
在 venus 上测试 DRBD 服务。
在 venus 上打开终端控制台,然后以 root 用户身份登录。
在 venus 上,将 DRBD 服务升级为主服务:
root #drbdadmprimary
在 venus 上,检查 venus 是否为主节点:
root #systemctlstatus drbd.service
在 venus 上,创建一个安装点,如 /srv/r0mount:
root #mkdir/srv/r0mount
在 venus 上,装入 DRBD 设备:
root #mount-o rw /dev/drbd_r0 /srv/r0mount
校验在 jupiter 上创建的文件是否存在:
root #ls/srv/r0
应列出 /srv/r0mount/from_jupiter 文件。
如果该服务在两个节点上都运行正常,则 DRBD 安装即已完成。
再次将 jupiter 设置为主节点。
通过在 venus 上输入以下命令,卸下 venus 上的磁盘:
root #umount/srv/r0
通过在 venus 上输入以下命令,降级 venus 上的 DRBD 服务:
root #drbdadmsecondary
在 jupiter 上,将 DRBD 服务升级为主服务:
root #drbdadmprimary
在 jupiter 上,检查 jupiter 是否为主节点:
root #systemctlstatus drbd.service
要使服务在服务器出问题时自动启动并进行故障转移,可以使用 Pacemaker/Corosync 将 DRBD 设置为高可用性服务。有关针对 SUSE Linux Enterprise 12 进行安装和配置的信息,请参见第 II 部分 “配置和管理”。
可使用几种方式调整 DRBD:
对元数据使用外部磁盘。这可能会有所帮助,不过会降低维护便捷性。
创建 udev 规则以更改 DRBD 设备的预读。将以下行保存在文件 /etc/udev/rules.d/82-dm-ra.rules 中,并将 read_ahead_kb 值更改为工作负载:
ACTION=="add", KERNEL=="dm-*", ATTR{bdi/read_ahead_kb}="4100"此行只有在使用 LVM 时才生效。
通过 sysctl 更改接收和发送缓冲区设置,以优化网络连接。
在 DRBD 配置中更改 max-buffers 和/或 max-epoch-size。
根据 IO 模式增大 al-extents 值。
如果您有一个配备了 BBU(电池备份单元)的硬件 RAID 控制器,设置 no-disk-flushes、no-disk-barrier 和/或 no-md-flushes 可能会有所帮助。
根据工作负载启用读平衡。有关详细信息,请参见http://blogs.linbit.com/p/256/read-balancing/。
DRBD 设置涉及很多不同的组件,因此产生问题的来源可能多种多样。以下各部分包括多个常用方案和多种建议解决方案。
如果初始 DRBD 设置不符合预期,说明配置中可能有错误。
获取关于配置的信息:
打开终端控制台,然后以 root 用户身份登录。
通过运行 drbdadm(带 -d 选项),测试配置文件。输入以下命令:
root #drbdadm-d adjust r0
在 adjust 选项的干运行中,drbdadm 将 DRBD 资源的实际配置与您的 DRBD 配置文件进行比较,但它不会执行这些调用。检查输出以确保您了解任何错误的根源。
如果 /etc/drbd.d/* 和 drbd.conf 文件中存在错误,请先更正,然后再继续。
如果分区和设置正确,请在不使用 -d 的情况下再次运行 drbdadm。
root #drbdadmadjust r0
这会将配置文件应用到 DRBD 资源。
对于 DRBD,主机名区分大小写(Node0 和 node0 是不同的主机),并将与内核中储存的主机名进行比较(参见 uname -n 输出)。
如果有多个网络设备,且想要使用专用网络设备,可能不会将主机名解析为所用的 IP 地址。在这种情况下,可使用参数 disable-ip-verification。
如果系统无法连接到对等体,说明本地防火墙可能有问题。默认情况下,DRBD 使用 TCP 端口 7788 访问另一个节点。确保在两个节点上该端口均可访问。
如果 DRBD 不知道哪个实际设备保管了最新数据,它就会变为节点分裂状态。在这种情况下,DRBD 子系统将分别成为次系统,并且互不相连。在这种情况下,可以在日志记录数据中找到以下讯息:
Split-Brain detected, dropping connection!
要解决此问题,请在要丢弃其数据的节点上输入以下命令:
root #drbdadm secondary r0root #drbdadm-- --discard-my-data connect r0
在具有最新数据的节点上输入以下命令:
root #drbdadmconnect r0
通过使用对等体的数据重写一个节点的数据,以此确保两个节点上的视图保持一致,该问题可得到解决。
以下开放源代码资源可用于 DRBD:
项目主页:http://www.drbd.org。
请参见 Highly Available NFS Storage with DRBD and Pacemaker。
Linux Pacemaker 群集堆栈项目的 http://clusterlabs.org/wiki/DRBD_HowTo_1.0。
DRBD 的以下手册页可用于分发:drbd(8)、drbddisk(8)、drbdsetup(8)、drbdsetup(8)、drbdadm(8) 和 drbd.conf(5)。
可在 /usr/share/doc/packages/drbd/drbd.conf 中查找注释过的 DRBD 示例配置。
此外,为了更方便地在整个群集中进行储存管理,请参见 http://blogs.linbit.com/p/666/drbd-manager 上有关 DRBD-Manager 的最新声明。