假设我有一个 glusterfs 挂载,它在多个服务器之间共享,由应用程序访问,并且日志被写入通常位于该挂载点的目录树中的目录。(假设 /foo 是我们挂载的共享存储,而 /foo/bar 是写入日志的目录)为了防止所有服务器尝试写入同一个日志文件,我想将 /foo/bar 设为另一个本地目录 /var/bar 的符号链接。是否可以在共享存储挂载上创建本地符号链接?这些符号链接是否可以映射到访问该存储的其他服务器上?或者如果不行,还有其他方法可以解决这个问题,比如循环设备?假设无法更改写入日志的目录。
答案1
如果文件系统支持符号链接,则符号链接(根据 POSIX 标准)将在客户端而不是服务器上进行解释。因此,您应该能够在任何 Unix 或类 Unix 系统(如 Linux)上可靠地符号链接到其他文件系统。
例如:
/foo A gluster remote file system
/var A local file system
如果/foo/bar
是符号链接,/var/log/myhost
则每台写入 /foo/bar 的机器都会写入该机器上的本地 /var/log/myhost。
但是如果/var/log
不存在,写入将失败,并出现一条令您惊讶的错误消息。(试一试)因此,请确保/var/log
存在。这不是问题,因为/var/log
大多数系统在安装时都会创建它。但是,如果链接到的链接/var/log/dirname/filename.txt
很可能/var/log/dirname
还不存在,该怎么办。我以前遇到过这个问题。
(我认为《系统和网络管理实践》第 28 章中有这样的例子,其中建议从网络文件系统链接到 /etc/。)
因此,是的,您可以使用符号链接来做到这一点。但是,这可能会让同事感到困惑。是否可以告诉软件只写入/var/log/foo
?这样会减少混乱,并且更可持续。您的同事会感谢您。
答案2
这取决于共享文件系统。但一般来说,如果远程文件系统支持符号链接,它就会起作用。我可以在 gluster 卷上进行符号链接,而且没问题(已测试)。
答案3
也许您想像这样设置符号链接?
/foo - Gluster mountpoint
/var/log - local filesystem mountpoint
本地服务器上的服务配置为记录到/foo/log/app.log
。并且该/foo/log
目录应是每个服务器的,但也位于 Gluster 卷上,以便其他人可以在需要时检查日志。
为此,我建议创建两个符号链接。在每个服务器上:
# mkdir /foo/logs/$(hostname)
# ln -s /foo/logs/$(hostname) /var/log/app
在 Gluster 卷上(仅需要一次):
# ln -s /var/log/app /foo/log
当应用程序写入 时/foo/log/app.log
,符号链接/foo/log
解析为/var/log/app
。现在,/var/log/app
是每个服务器本地文件系统上的符号链接,每个服务器都指向 Gluster 卷上的不同目录。因此,在一个服务器上/var/log/app
指向/foo/logs/server1.example.com
,/foo/logs/server2.example.com
在另一个服务器上指向 。
/foo/log/app.log -> /var/log/app/app.log -> /foo/logs/server1.example.com/app.log