Назад | Перейти на главную страницу

Безопасно обновить файл конфигурации, хранящийся на монтировании NFSv3

У меня есть файл конфигурации config_file который хранится на сетевом монтировании NFSv3, и я хотел бы безопасно обновить этот файл.

Вот условия и ограничения, в которых я работаю:

  1. Всегда должен быть config_file доступен для клиентов, которые хотят его прочитать
  2. Клиенты никогда не должны читать поврежденные данные из частично перезаписанного файла.
  3. Клиенты делают не необходимость config_file обновлен немедленно. Подождите минуту или две, пока обновятся кеши, это нормально, если соблюдаются ограничения №1 и №2.

Реализации NFSv3 на обоих концах - RHEL (Red Hat Enterprise Linux).

Вот что я до сих пор придумал:

Клиентские приложения читают из /mount/path/config_file, что на самом деле является символической ссылкой на /mount/path/config_file_current

Позволять:

NEW = Path to the new configuration file that I'm try to install ( /path/to/my/workspace/config_file )
SYM = The path to the symlink ( /mount/path/config_file )
CURRENT = The path to the current version of config_file ( /mount/path/config_file_current )
TMP = The path to a temporary version of config_file ( /mount/path/config_file_tmp )
cp ${NEW} ${TMP}       # Initial copy of the new configuration file over the temporary file
ln -f ${TMP} ${SYM}    # Point the symlink to the temporary file [1]
rm ${CURRENT}          # To prevent torn reads, delete the previous file so that the file handle is "stale"
cp ${TMP} ${CURRENT}   # Copy the newest version of config_file back to ${CURRENT}
ln -f ${CURENT} ${SYM} # Point the symlink back to ${CURRENT}

[1] Symlink создание - одна из двух операций NFSv3, которые определены как атомарные в RFC 1813 (файл спецификации NFSv3)

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

Мой вопрос к сообществу Server Fault таков: безопасна ли эта процедура для реализации NFSv3, когда и клиент, и сервер работают с RHEL?

Я основываю это на двух статьях:

https://utcc.utoronto.ca/~cks/space/blog/sysadmin/SafelyUpdatingUnixFiles

https://utcc.utoronto.ca/~cks/space/blog/sysadmin/SafelyUpdatingNFSFiles

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

В частности, это было бы проще:

ConfigDir=/some/path/for/new/and/old/config_files
NewFile=${ConfigDir}/<file_basename>.yyyymmddhhmmss # Tracking, here by timestamp
cp ${NEW} ${NewFile}    # Save the new config file where you're going to link to it
ln -f ${NewFile} ${SYM} # Point the symlink to the new configuration file
# The following is only necessary if you need to hurry along finding the new config
rm ${CURRENT}           # To prevent torn reads, delete the previous file so that the file handle is "stale"
CURRENT=${NewFile}

Я не знаю, используете ли вы это в циклической структуре или что-то в этом роде, поэтому, возможно, вам нужно установить CURRENT и / или NewFile по-другому, но я думаю, вы уловите идею. ... Старая поговорка - это мудрость: «ПОЦЕЛУЙ! - Будь простым, глупый!» Это почти никогда не бывает плохим советом.