我在两个 Debian Stretch 服务器上拥有一个运行良好的 DRBD 版本,它是我按照这个很棒的指南创建的: https://www.howtoforge.com/setting-up-network-raid1-with-drbd-on-debian-squeeze-p2/
但每次重启后我都必须重新做一些事情才能让它再次进入工作状态。
这是我在重新启动之前运行时看到的内容:
root@server1:~# cat /proc/drbd version: 8.4.7 (api:1/proto:86-101) srcversion: AC50E9301653907249B740E 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----- ns:8 nr:0 dw:4 dr:1209 al:1 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
在服务器2上:
root@server2:~# cat /proc/drbd version: 8.4.7 (api:1/proto:86-101) srcversion: AC50E9301653907249B740E 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r----- ns:0 nr:8 dw:8 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
在服务器 1 上:
root@server1:~# mount ... /dev/drbd0 on /var/www type ext3 (rw,relatime,data=ordered)
这是我重启后看到的内容。一切正常,但安装、服务启动和主/次配置丢失。我尝试drbd
通过以下方式添加到启动中:
update-rc.d drbd defaults
在两台服务器上这似乎都不起作用。DRBD 根本无法启动,但/etc/init.d/drdb start
在两台服务器上手动执行都可以正常工作。
另外,我不确定我是否可以将 DRBD 卷添加到,fstab
因为如果 DRBD 服务甚至没有启动,它肯定不会工作?我已经阅读了有关使用的信息,_netdev
但fstab
各种条目组合fstab
都没有奏效。
最后,每次重新启动时,我还必须设置 DRBD 的主状态和辅助状态,然后手动重新挂载卷。
这是我在重启后让它工作的方法:
在服务器 1 上:
root@server1:/etc# /etc/init.d/drbd status ● drbd.service - LSB: Control DRBD resources. Loaded: loaded (/etc/init.d/drbd; generated; vendor preset: enabled) Active: inactive (dead) Docs: man:systemd-sysv-generator(8)
root@server1:/etc# /etc/init.d/drbd start [ ok ] Starting drbd (via systemctl): drbd.service. root@jmtest1:/etc# cat /proc/drbd version: 8.4.7 (api:1/proto:86-101) srcversion: AC50E9301653907249B740E 0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r----- ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
root@server1:/etc# drbdadm primary r0
root@server1:/etc# cat /proc/drbd version: 8.4.7 (api:1/proto:86-101) srcversion: AC50E9301653907249B740E 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----- ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
在服务器2上:
root@server2:~# /etc/init.d/drbd status ● drbd.service - LSB: Control DRBD resources. Loaded: loaded (/etc/init.d/drbd; generated; vendor preset: enabled) Active: inactive (dead) Docs: man:systemd-sysv-generator(8)
root@server2:~# /etc/init.d/drbd start [ ok ] Starting drbd (via systemctl): drbd.service.
root@server2:~# cat /proc/drbd version: 8.4.7 (api:1/proto:86-101) srcversion: AC50E9301653907249B740E 0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r----- ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
root@server2:~# drbdadm secondary r0
root@server2:~# cat /proc/drbd version: 8.4.7 (api:1/proto:86-101) srcversion: AC50E9301653907249B740E 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r----- ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
fstab
我尝试过的一些条目:
/dev/drbd0 /var/www ext3 _netdev 0 2 UUID=042cc2e395b2b32 /var/www ext3 none,noauto 0 0
不确定你是否应该使用 UUID,或者只是/dev/drbd0
我对它无法启动的原因有以下疑问:
- 那里应该有哪些 FSTAB 条目?
- 为什么
update-rc.d drbd defaults
不工作? - 为什么每次重启后都必须重置两台服务器上的主服务器和辅助服务器?
答案1
您绝对应该考虑使用专门解决此类问题的产品。
我在本篇文章中描述了[Nagios/Icinga:不要在备用节点上显示 DRBD 分区的 CRITICAL] 我如何设法使用 opensvc 完成您所期望的事情,并且它多年来运行良好。
不需要 fstab 条目,因为安装已在 opensvc 服务配置文件中描述,该文件会在 opensvc 集群节点之间自动同步
无需设置,
update-rc.d drbd defaults
因为当 opensvc 堆栈发现您在某些服务中拥有 drbd 资源时,它会对 drbd 模块进行 modprobe,然后在主/次状态下启动 drbd要在启动时达到主/次,只需在opensvc 服务配置文件的部分
nodes
中设置参数。DEFAULT
如果你想
server1
作为主从server2
,只需nodes=server1 server2
使用命令设置svcmgr -s mydrbdsvc set --kw DEFAULT.nodes="server1 server2"
如果你只希望服务在启动时启动
server1
,请orchestrate=start
使用以下命令设置参数svcmgr -s mydrbdsvc set --kw DEFAULT.orchestrate=start
如果你只希望服务以高可用性模式(即节点之间的自动故障转移)进行编排,请
orchestrate=ha
使用以下命令设置参数svcmgr -s mydrbdsvc set --kw DEFAULT.orchestrate=ha
要将服务从一个节点迁移到另一个节点,可以使用
svcmgr -s mydrbdsvc switch
命令
答案2
这里有很多问题需要解决,但我首先要说的是:那个 DRBD 版本太旧了!您应该将其升级到 8.4.11(截至撰写本文时,2018 年 12 月),或者移至 9 分支。但您提出的问题可以通过您使用的版本解决。
让我们来看看您在帖子底部提出的三个简洁的问题:
- 那里应该有哪些 FSTAB 条目?
理想情况下,没有。DRBD 设备必须先升级才能使用。即使对于可以自动升级的 DRBD-9 块设备,fstab 也不是最佳选择,因为在大多数情况下,如果一切不顺利,它会破坏启动过程。但从技术上讲,它可以工作,但有很多注意事项。
- 为什么 update-rc.d drbd 默认值不起作用?
不要那样做。Debian 使用 systemd,而 DRBD 有一个 systemd 单元文件。除非您使用集群管理器,否则您应该使用它,我强烈推荐集群管理器。因此,在没有 Pacemaker 集群资源管理器的情况下,您应该发出一些命令,例如# systemctl enable drbd
让它在启动时启动。或者# systemctl start drbd
在服务停止后启动它。最常见的命令是启动、停止、重新启动、启用和禁用。
- 为什么每次重启后都必须重置两台服务器上的主服务器和辅助服务器?
因为 DRBD 没有领导者选举的概念。外部系统必须将 DRBD 资源提升为主节点,并且一次只能有一个主节点。有很多方法可以做到这一点。
你可以“手动”推广资源# drbdadm primary <resource>
然后从那里挂载东西——但这是您想要避免的。DRBD 可以在版本 9 中“自动提升”,它将在尝试打开其块设备进行访问时自动提升资源(例如使用文件系统挂载或卷组激活)——但您正在运行的版本无法做到这一点(升级?这可能对您来说就足够了)。或者您可以使用有限状态领导者选举系统来控制晋升行动并确保 DRBD 及其支持的应用程序堆栈的状态。这就是 Pacemaker。
你想我保证,Pacemaker 不会太难,但非常庞大。你不需要学习太多就可以实现你想要的功能。你可以花费大量时间和精力来打造一个“完美”的集群,它可以抵御任何故障,而且这种努力会得到回报。这是一个很好的系统。
Corosync/Pacemaker、DRBD-9.x 或 DRBD-8.4.x 最新版本以及您在此基础上拥有的任何软件的组合都应该可以自动完成您想要的操作。有很多文档详细说明了如何执行此操作。以下是最新的一个:
如果您有时间,我建议您阅读整本指南。DRBD 在过去几年中经历了一些重大的演变。
答案3
扩展@Spooler的答案:参见drbd8 手册为了成为主要指令。虽然上述章节是关于双主模式的,成为主要对于主动-被动设置也有效。