我已经在两台服务器上配置了 gluserfs,并且能够将其安装到我的客户端计算机上。我还希望能够在启动时将两台计算机脱机并从头开始启动时在两台 glusterfs 服务器上安装 glusterfs 文件系统。
这些服务器使用 pacemaker 设置为集群。除了共享数据库之外,pacemaker 还提供虚拟 IP 地址来挂载 gluster 文件系统。
两台服务器启动后,我可以使用以下命令手动挂载每个服务器上的文件系统:
mount -t glusterfs nodea:/gv0 /data
这很棒。但我希望这在启动时自动发生。
因此我尝试在 fstab 中添加一个条目:
nodea:/gv0 /data glusterfs _netdev 0 0
当我在集群启动并运行后运行“mount -a”命令时,该命令有效。但是,它在启动时不起作用。(这是客户端计算机在启动时安装 glusterfs 的方式,但集群已启动并运行。因此,它当然在启动时有效。)
我还尝试创建一个 systemd 单元文件来处理启动时 glusterfs 的安装。我的单元文件位于 /etc/systemd/system 中,名为“data.mount”,如下所示:
# Mounting gluster fs at /data
[Unit]
Description = Automount gluster filesystem
After=pcsd.service
[Mount]
What=nodea:/gv0
Where=/data
Type=glusterfs
[Install]
WantedBy = pcsd.service
同样,当两台服务器都启动并运行时,通过运行命令“systemctl start data.mount”,此方法有效。如果我只重新启动集群中的一台机器,它也会起作用。但如果两台服务器都重新启动,它就不起作用了。
如果集群中的两个节点都发生故障,或者我出于某种原因想要同时重新启动两个节点,我希望确保当两台机器重新启动时,glusterfs 已安装在 /data 上。
作为一种解决方法,我在两台机器的 root crontab 中添加了以下几行:
@reboot sleep 60 && mount -t glusterfs nodea:/gv0 /data
@reboot sleep 300 && mount -t glusterfs nodea:/gv0 /data
如果我从头开始启动两个服务器,这种方法是可行的。但我担心的是,如果 Pacemaker 服务启动时间超过 5 分钟,那么我仍然没有在服务器上的 /data 上安装 gluster 文件系统。
有没有办法让 systemd 单元文件检查它是否真正安装了文件系统,如果没有,则重试直到安装为止?
还有其他方法可以让 glusterfs 在启动时挂载并检查它是否真的已挂载吗?
答案1
您应该能够在需要时让 systemd 自动挂载。我在启动时也遇到了 Ubuntu 16.04 挂载问题。基于这条信息我noauto,x-systemd.automount
在我的fstab
行中添加了以下内容:
gluster1:/volume1 /storage-pool glusterfs defaults,_netdev,noauto,x-systemd.automount 0 0
我已经重启了应用服务器几次,它们都成功安装。希望这对你也有帮助!
答案2
鉴于 LP 的态度,我一直在研究这个问题:
文件:/etc/systemd/system/glusterfsmounts.service
:
[Unit]
Description=Glustermounting
Requires=glusterfs-server.service
[Service]
Type=simple
RemainAfterExit=true
ExecStartPre=/usr/sbin/gluster volume list
ExecStart=/bin/mount -a -t glusterfs
Restart=on-failure
RestartSec=3
[Install]
WantedBy=multi-user.target
那么你会:
systemctl 守护进程重新加载
systemctl 启用 glusterfsmounts
然后重启...对我来说是迄今为止最好/最稳定的
答案3
您可以使用脚本来保持 systemd 的 glusterfs 服务的“已启动”状态,直到卷实际准备就绪。
systemctl edit glusterd.service
[Service]
ExecStartPost=/usr/local/sbin/glusterfs-wait
/usr/local/sbin/glusterfs-wait
使用以下内容创建文件:
#!/bin/bash
FAIL=1
until [ $FAIL -eq 0 ]; do
gluster volume status all
FAIL=$?
test $FAIL -ne 0 && sleep 1
done
exit 0
确保此文件是可执行的。
然后创建挂载覆盖,例如/mnt/storage
,mnt-storage.mount
斜杠变成连字符。
systemctl edit mnt-storage.mount
如果这不起作用并且您刚刚添加了 fstab 条目,请重新加载 systemd 以让其看到更新(systemctl daemon-reload
)。
[Unit]
After=glusterd.service
Wants=glusterd.service