Что произойдет в NFS, если 2 или более серверов попытаются одновременно записать один и тот же файл?

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

Единственное, что меня беспокоит, это то, что вообще происходит с NFS, если 2 или более серверов в кластере пытаются одновременно создать один и тот же файл кэша изображения?

Существует довольно большая вероятность того, что при очистке кеша для обновлений контента они могут столкнуться таким образом, но у меня нет отличного способа протестировать этот сценарий в разработке, потому что я работаю только над одной коробкой.

У кого есть опыт в этом?


person user126715    schedule 30.09.2010    source источник
comment
Лучше спросить на serverfault.com.   -  person tplaner    schedule 30.09.2010
comment
Я не сталкивался с serverfault.com, поэтому спасибо, что указали на это. Это выглядит как отличный ресурс, который я буду использовать в будущем, но я думаю, что steven_desu все равно позаботился обо мне ниже.   -  person user126715    schedule 30.09.2010


Ответы (1)


Это зависит от того, как вы открываете файл. Если вы откроете файл в режиме «добавления», тогда Unix/Linux фактически запишет содержимое в кеш, пока вы не создадите символ новой строки, а затем вставит новую строку в конец файла (перезаписывая « шаблон байта "конец файла") и записывает новый "конец файла". В этом случае, если два человека попытаются записать в один и тот же файл одновременно, обе строки записи будут выполнены, присоединяя себя по одной строке за раз в том порядке, в котором они были получены. Таким образом, вы можете ожидать что-то вроде:

This was the old contents
of the file
The first script added
The second script added
this line (script 1)
this line (script 2)

В редких случаях, когда две команды «записи» поступают ТОЧНО в одно и то же время (с точностью до наносекунды), операционная система фактически создает состояние прерывания. Это зависит от ОС, как она справляется с этим, но большинство просто генерирует два случайных числа, чтобы решить, кто ходит первым.

Если вы открываете файл в режиме «записи» (скажем, вы хотите добавить содержимое в середину), вам действительно нужно заблокировать файл, чтобы сделать это. Второй PHP-скрипт выдаст ошибку о том, что не удалось открыть файл.

person stevendesu    schedule 30.09.2010
comment
Спасибо за информацию. Изображение сохраняется с помощью функции PHP imagejpeg(), в которой говорится, что он создаст или перезапишет данный файл, что кажется идентичным fopen() с 'w', где он усекает файл, если и пишет, если он существует, или создает его, если это отсутствует. - person user126715; 30.09.2010
comment
поэтому я думаю, что в худшем случае сервер 1 пытается это сделать ... это делается, но сервер 2 начал создавать свою собственную версию до того, как сервер 1 закончил (таким образом, 2 не видел готовый файл), поэтому, когда это будет сделано , он заменяет то, что только что сделал сервер 1, идентичной копией. Кажется, что это сработает просто отлично, и на самом деле это случай, который, вероятно, все равно не будет случаться так часто. Я мог бы даже добавить проверку файла прямо перед сохранением изображения, если бы хотел еще больше уменьшить коллизии. Еще раз спасибо за вашу помощь! - person user126715; 30.09.2010