В IT-инфраструктуре Discourse при резервном копирования сайта один GIF-файл скопировался 246 173 раза

от автора

Технический блогер Discourse Джейк Голдсборо рассказал, что при резервном копирования сайта один GIF-файл, который весит 1,6 МБ, был продублирован 246 173 раза, что добавило 377 ГБ к квоте резервного копирования веб-сайта, повредив файловую систему Linux и вызвав сбой самого процесса. 

Речь идёт о гифке с героиней Рейчел из сериала «Друзья» и её танцем радости, который часто используется в чатах Discourse. Проблема, вероятно, была вызвана, чрезмерным использованием этого файла, а также внедрением политики безопасности файлов. 

Discourse — это компания и проект с открытым исходным кодом, создающий одну из самых широко используемых современных платформ для обсуждений в сообществах, которая в настоящее время поддерживает более 22 тысяч форумов. Платформа для чата в реальном времени позволяет пользователям вставлять эмодзи и GIF-файлы в свои обсуждения, чтобы оживить дискуссии. Но функция «безопасной загрузки» платформы означает, что «когда файл перемещается между контекстами безопасности (например, из личного сообщения в публичную публикацию), система создаёт новую копию со случайным SHA1», объясняет Голдсборо. Таким образом, исходное содержимое идентично, но Discourse рассматривает его как новый файл. В итоге популярное изображение или GIF-реакция распространяется по постам, репостам и личным сообщениям, и каждый контекст создаёт ещё одну копию файла.

Первая попытка Discourse решить проблему перегрузки системы дубликатами заключалась в отслеживании оригинального контента по его хешу. Затем, во время резервного копирования, загрузки группировались по хешу, и загружался только первый файл в каждой группе. Для всех дубликатов создавались жёсткие ссылки. Это казалось решением, пока один из крупных клиентов Discourse не обратил всеобщее внимание на ограничение ext4, составляющее примерно 65 тысяч жёстких ссылок на один inode. В главном случае резервное копирование сработало с этим первым решением, но «вместо одной загрузки для всех 246 173 дубликатов мы получили одну загрузку плюс ~181 000 резервных загрузок после достижения лимита», объясняется в блоге компании. 

В Discourse удалось найти решение для проблемы. По сути, новый процесс тоже начинается с создания жёстких ссылок. Но, когда файловая система выдаёт сообщение об ошибке EMLINK (слишком много ссылок), она копирует файл локально и рассматривает новый как «основной», пока снова не будет достигнут лимит. Эта мера «работает на любой файловой системе, никакой настройки не требуется», заявляют в Discourse.

Платформа подчёркивает, что извлекла уроки: «Теперь мы знаем, что Дженнифер Энистон может проводить стресс-тестирование инфраструктуры».

ссылка на оригинал статьи https://habr.com/ru/articles/1023172/