Убедитесь, что состояние файла на клиенте синхронизировано с сервером NFS - PullRequest
10 голосов
/ 08 июля 2010

Я пытаюсь найти правильный способ обработки устаревших данных на клиенте NFS.Рассмотрим следующий сценарий:

  • Два сервера монтируют одно и то же общее хранилище NFS с количеством файлов
  • Клиентское приложение на 1 сервере удаляет некоторые файлы
  • Клиентское приложение на 2 попытках сервераполучить доступ к удаленным файлам и не удается с помощью: Устаревшего дескриптора файла NFS (ничего странного, ожидается ошибка)

(Также может быть полезно знать, что параметры монтирования кэша на обоих серверах довольно высоки для производительностипричины).

Что я пытаюсь понять, это:

  • Есть ли надежный способ проверить, присутствует ли файл?В приведенном выше сценарии lstat для файла возвращает успех, а приложение завершается ошибкой только после попытки перемещения файла.
  • Как вручную синхронизировать содержимое каталога на клиенте с сервером?
  • Некоторые общие рекомендациио том, как написать надежный код управления файлами в случае NFS?

Спасибо.

Ответы [ 3 ]

12 голосов
/ 08 июля 2010
  • Есть ли надежный способ проверить наличие файла?В приведенном выше сценарии lstat для файла возвращает успех, а приложение завершается ошибкой только после попытки перемещения файла.

Вот и все нормальное поведение NFS.

  • Как я могу вручную синхронизировать содержимое каталога на клиенте с сервером?

Это невозможно сделать вручную, поскольку NFS притворяется нормальной файловой системой, совместимой с POSIX.

Я однажды пытался закодировать код close () / open (), пытаясь как-то смягчить эффекты кэширования на стороне клиента NFS.В моем случае мне нужно было прочитать информацию, записанную в файл на другом сервере.Но даже повторный трюк имел эффект, близкий к нулю.И я не могу добавить fdatasync () к стороне записи, так как это замедляет работу всего приложения.

Мой опыт работы с NFS на сегодняшний день таков, что вы ничего не можете сделать.В критических путях кода я просто закодировал, чтобы повторить файловые операции, которые возвращают ESTALE.

  • Некоторые общие советы о том, как написать надежный код управления файлами в случае NFS?

Модифицируйте все, что вы хотите, но если ваши клиенты хотят надежности, им не следует использовать NFS.

Например, моя компания рекламирует использование надлежащей распределенной файловой системы (я намеренно опускаю бренд) если клиент хочет надежности.Наше основное программное обеспечение не гарантированно работает на NFS, и мы не поддерживаем такие конфигурации.Но в нашем случае нам действительно нужны гарантии того, что как только данные будут записаны в FS, они станут доступны на всех других узлах.

Может быть достигнута согласованность в NFS, но за счет производительности, что делает NFS едва лигодные к употреблению.(Проверьте параметры монтирования.) NFS кеширует как сумасшедший, чтобы скрыть тот факт, что это файловая система сервера.Чтобы сделать все операции согласованными, клиент NFS должен был бы синхронно переходить на сервер NFS для каждой маленькой операции, минуя локальный кэш.И это никогда не будет быстрым.

Но так как мы говорим о Linux здесь, можно посоветовать клиентам программного обеспечения для оценки доступных кластерных файловых систем.Например, RedHat теперь официально поддерживает GFS .Я слышал о людях, использующих CodaFS, но не имею точной информации об этом.

4 голосов
/ 08 июля 2010

Вы можете попробовать опцию монтирования '' noac ''

от man nfs:

В дополнение к тому, что клиент не может кэшировать атрибуты файла, опция noac заставляет приложение писатьстать синхронным, чтобы локальные изменения в файле сразу стали видны на сервере.Таким образом, другие клиенты могут быстро обнаруживать недавние записи, когда они проверяют атрибуты файла.

Использование опции noac обеспечивает большую согласованность кэша среди клиентов NFS, обращающихся к тем же файлам, но извлекает значительное снижение производительности.Таким образом, вместо этого рекомендуется разумное использование блокировки файлов.

У вас может быть два монтирования, одно для критических быстро меняющихся данных, которые необходимо синхронизировать, и другое - для других данных.

Кроме того, обратите внимание на блокировку NFS и ее ограничения .

Что касается общего совета:

Один из способов обрезать файл, который одновременно читается с нескольких хостов, - записатьсодержимое во временный файл, а затем rename этот файл в конечное местоположение.

В той же файловой системе эта операция должна быть атомарной.

2 голосов
/ 20 ноября 2014

Я успешно выполнил ls -l в каталоге, в котором находится файл.

...