共享存储上的符号链接

共享存储上的符号链接

假设我有一个 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

相关内容