символические ссылки на общее хранилище

символические ссылки на общее хранилище

Допустим, у меня есть монтирование 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

Связанный контент