Безопасно ли использовать flock в AWS EFS для эмуляции критического раздела? - PullRequest
0 голосов
/ 06 ноября 2018

Согласно документации, AWS EFS (файловая система Amazon Elastic) поддерживает блокировку файлов:

Amazon EFS предоставляет интерфейс файловой системы и семантику доступа к файловой системе (например, строгую согласованность данных и блокировку файлов).

В локальной файловой системе (например, ext4) flock может использоваться в сценариях оболочки для создания критической секции . Например, этот ответ описывает шаблон, который я использовал в прошлом:

#!/bin/bash
(
  # Wait for lock on /var/lock/.myscript.exclusivelock (fd 200) for 10 seconds
  flock -x -w 10 200 || exit 1

  # Do stuff

) 200>/var/lock/.myscript.exclusivelock

Можно ли применить тот же шаблон к EFS? Amazon упоминает, что они используют протокол NFSv4, но предоставляет ли он те же гарантии, что и flock на ext4?

Если нет, как вы можете обеспечить выполнение операции исключительно для всех экземпляров EC2, подключенных к одному и тому же тому EFS? Достаточно, если это работает для процессов, так как я не планирую запускать несколько потоков.

Или я неправильно понял поддержку блокировки, предоставляемую в NFSv4? К сожалению, я не знаю деталей протокола, но обеспечение атомарности в распределенной системе является гораздо более сложной проблемой, чем на локальной машине.

Обновление: небольшой эксперимент

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

1 Ответ

0 голосов
/ 01 декабря 2018

Должно работать.

Команда flock, используемая в шаблоне, о котором идет речь, должна работать во всех файловых системах NFS. Это означает, что он также будет работать с EFS, которая реализует протокол NFSv4. На практике я также не сталкивался с какими-либо проблемами при использовании его для синхронизации сценариев оболочки в разных экземплярах EC2.


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

Во время чтения я столкнулся со старыми проблемами. В ядрах до 2.6.12, казалось, были проблемы с NFS и системным вызовом flock (например, см. flock vs lockf в Linux ).

Это не должно применяться здесь, поскольку оно было улучшено в более новых ядрах. Посмотрев исходный код команды flock, вы можете убедиться, что она по-прежнему использует системный вызов flock, но потенциально она может быть реализована безопасным системным вызовом fcntl:

while (flock(fd, type | block)) {
  ...
  case EBADF:       /* since Linux 3.4 (commit 55725513) */
        /* Probably NFSv4 where flock() is emulated by fcntl().
         * Let's try to reopen in read-write mode.
         */

Примечание: обходной путь относится к , этот коммит в ядре Linux можно найти:

Поскольку мы можем моделировать блокировки flock (), используя блокировки диапазона байтов NFS, мы не можем полагаться на то, что VFS проверила для нас режим открытия файлов.

...