Демоны умирают с ошибкой шины, когда их двоичные файлы живут по NFS

У нас есть несколько демонов, работающих на нескольких хостах.

Исполняемые образы демона - это очень большие двоичные файлы, размещенные в NFS.

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

Мы попытались переместить новые двоичные файлы вместо cp, но, похоже, это не исправило.

Я подумываю просто mlock() использовать бинарный файл в скрипте запуска демона, но наверняка есть волшебные опции или семантика NFS, которыми мы должны злоупотреблять. Есть ли лучший способ исправить это?

2 ответа

Решение

Лучшее решение, которое мы нашли, - это всегда устанавливать двоичный файл со строкой версии в конце его имени и поддерживать символическую ссылку, всегда указывающую на последнюю версию.

/mnt/foo/bar -> bar-20111201000000
/mnt/foo/bar-20111201000000
/mnt/foo/bar-20111115000000

Когда вы устанавливаете новую версию, вы атомарно перемещаете новую символическую ссылку поверх старой.

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

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

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

Другие вопросы по тегам