Служите статическим файлам с помощью nginx через NFS?

9

У меня есть веб-сайт, который получает около 7 тыс. Запросов в секунду на сервере nginx. Этот сервер обрабатывает перезаписи на сервер Apache, а также напрямую обслуживает статические файлы, изображения и т. Д. Статические файлы - самая большая часть там с около 5 000 запросов.

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

NFS достаточно быстр для этого? Существует ли ограничение на количество запросов NFS? Есть ли какие-то обязательные опции при этом?

Бонус: есть ли другие варианты для этой настройки, кроме NFS?

Спасибо!

j0nes
источник
Нет доступа на чтение или «только» на чтение?
Пауска
Спасибо! Только доступ для чтения, нет доступа для записи.
j0nes
2
7k запросов в секунду - это ~ 6 048 000 000 запросов в день, если вы выполняете это на одном сервере NGINX, мы (и компании, которые используют кластеры серверов для половины этой нагрузки) хотели бы узнать ваши настройки.
Пятно

Ответы:

2

Установив центральный сервер NFS, вы привносите единственную точку отказа в свой проект. Это само по себе должно быть решающим фактором. Если нет, NFS может быть достаточно быстрым для такой нагрузки. Критическими факторами будут наличие достаточного объема ОЗУ для кэширования файлов, межсоединений с низкой задержкой (Gig-E или лучше) и настройки (меньше, чем в предыдущем).

Вам также следует рассмотреть возможность использования rsync или аналогичного инструмента для хранения локальных копий обновлений статических файлов на каждом отдельном веб-сервере. Другим вариантом может быть решение SAN или резервный сервер NFS (оба варианта будут намного сложнее и дороже, чем идея rsync).

Крис С
источник
2
NFS не должна быть SPoF
gWaldo
@gWaldo Как именно вы можете настроить «центральный сервер NFS» и не быть SPoF?
Крис С
Вы делаете это, осознавая, что, как вы сказали, центральный сервер NFS является SPoF, и вместо этого выбираете реализацию кластера NFS. Я на самом деле не согласен с тобой ....
gWaldo
Спасибо - принимаю это решение, потому что я думаю, что пойду по пути rsync, избегая единственной точки отказа (что должно быть моей главной заботой).
j0nes
Довольно просто реализовать сервер NFS с двойной репликацией высокой доступности, используя GlusterFS и CTDB. С точки зрения производительности, мой кластер получал около 10 тыс. Запросов в секунду, и он неплохо работает. Единственная проблема заключается в том, что серверам NFS потребуется много оперативной памяти.
Alpha01
2

Я использую cachefilesd (и последнее ядро ​​linux с cachefs) для кеширования файлов NFS на локальный жесткий диск. Таким образом, каждое чтение в nfs копирует файл в каталог / var / cache / fs, и оттуда будут доставляться следующие чтения, а ядро ​​проверяет в nfs, является ли содержимое все еще действительным.

Таким образом, вы можете иметь центральную NFS, но без потери производительности локальных файлов

Cachefilesd позаботится об очистке старых файлов, когда свободный размер / inode достигнет настроенного уровня, так что вы сможете обслуживать необычные данные из NFS и общие запросы с HD

Конечно, также используйте лак для кеширования наиболее распространенных запросов и затем сохраните nginx / NFS.

Вот небольшая инструкция

Игиты
источник
1

Скорость зависит от многих факторов:

  • Как ваши серверы будут связаны с целью NFS? Один двухпортовый диск SAS может использовать скорость передачи 6 Гбит / с. Имейте это в виду, если вы планируете использовать 1 гигабайт Ethernet (из которого можно вычесть 20% накладных расходов TCP).
  • Какой тип кэша собирается получить сервер NFS? Используете ли вы контроллер массива уровня предприятия с большим количеством кеша? Кеш чтения является ключевым в этой настройке
  • Сколько серверов будет одновременно обращаться к одному и тому же файлу? Блокировка NFS может повредить - плохо

Ограничение открытых файлов через NFS является ограничением операционной системы хоста. FreeBSD имеет, например, множество различных опций настройки для поддержки большого количества открытых файлов, но это зависит от объема оперативной памяти на вашем сервере.

Альтернативой центральному файловому серверу является использование синхронизации / репликации между вашими веб-серверами (как предлагает Крис С.). rsync или DRBD могут быть отличным и экономически эффективным выбором.

pauska
источник
1

Я бы посоветовал против NFS, если вы не поместите туда некоторое кэширование. Кеш nginx лучше, чем ничего, но Varnish лучше.

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

Если вы включили NFS, убедитесь, что у вас есть резервирование.

gWaldo
источник
Это может потребовать небольшого изменения архитектуры. В дополнение к использованию слоя кэширования, такого как Varnish, также хорошей идеей является использование настройки CDN origin pull для всех статических файлов, которые будут находиться на общем ресурсе NFS. Это снизит нагрузку на серверную часть NFS.
Alpha01