
Допустим, у меня есть монтирование glusterfs, которое совместно используется несколькими серверами, к которому обращается приложение, и журналы записываются в каталог, который обычно находится в дереве каталогов этой точки монтирования. (допустим, /foo — это наше смонтированное общее хранилище, а /foo/bar — это каталог, в который записываются журналы). Чтобы предотвратить попытки всех серверов записывать в один и тот же файл журнала, я хочу сделать /foo/bar символической ссылкой на другой, локальный каталог, /var/bar. Возможно ли создать локальные символические ссылки на монтировании общего хранилища? И можно ли будет сопоставить эти символические ссылки на других серверах, которые получают доступ к этому хранилищу? Или, если нет, есть ли другой способ обойти это, например, устройства loop? Предположим, что изменение каталога, в который записываются журналы, невозможно.
решение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