Производительность GridFS

В этой заметке я хочу разместить свой перевод замечательной статьи про GridFS. Задача хранения и раздачи файлов в кластерной среде сегодня с развитием облачных вычислений приобретает всё большую актуальность.

Задача

Хранить и раздавать статические файлы (картинки, стили и скрипты) на кластере из нескольких серверов.

Возможные решения

NFS, Lustre, SMB (Samba), Hadoop, DRBD (сетевой RAID). Из всего множества решений раньше мне больше всего импонировал Hadoop, однако попробовать его руки так и не дошли. А тут на глаза недавно попался бенчмарк про GridFS, о котором я рассказывал в предыдущем посте.

Что такое GridFS?

GridFS – это GridFS это маленькая но очень полезная возможность в MongoDB, которая позволяет хранить файлы любых видов и размеров в самой БД, используя при этом преимущества шардинга и репликации. Однако, раз файлы в БД, а не в ФС, как же получить доступ к ним, как раздавать файлы клиентам? Есть несколько вариантов и ниже мы их рассмотрим.

На данный момент есть 3 возможности:

  • Использовать “низкоуровневый” скрипт-обработчик, как Rack скрипт или Rails Metal handler для раздачи файлов из БД.
  • Подмонтировать файлы из БД к ФС с помощью, например,  gridfs-fuse, и читать файлы из ФС напрямую.
  • Использовать модуль для веб-сервера, например nginx-gridfs, который при получении запроса будет обращаться напрямую к MongoDB.

Второй вариант я рассмотрел в предыдущей статье, теперь займёмся третьим 🙂

ФС через Apache

Довольно быстро, как мы и ожидали. Теперь попробуем с nginx.

ФС через nginx

Nginx рулит, 6500 запросов в секунду.

GridFS через nginx-gridfs

Определённо ниже, однако всё ещё внушающие. 1051 запросов в секунду это более чем достаточно для большинства целей, особенно, с фасадом в виде CDN 🙂

Rails Metal handler

Основное преимущество Rails metal handler в том, что о простой. Не надо ничего перекомпилировать, просто добавьте его в свой проект. Вот его результаты:

К сожалению 53 запроса в секунду – не самый привлекательный результат.

Сравнение решений

Решение Requests/second % Apache FS % Nginx FS % Nginx GridFS % Apache Ruby
Filesystem через Apache 2625.37 40.03% 242.22% 4,878.96%
Filesystem через Nginx 6559.31 249.84% 605.17% 12,189.76%
GridFS через nginx module 1083.88 41.28% 16.52% 2014.27%
Rails metal handler через Passenger 53.81

Если вы хотите перейти от хранения файлов в локальной ФС, то GridFS это приемлемое решение. Причина использования GridFS состоит в том, что вы получаете потрясающую гибкость и масштабируемость из коробки в авто-реплицируемой шардируемой отказоустойчивой (сколько прилагательных 🙂 ) среде. Но естественно расплачиваетесь производительностью на отдельно-взятом узле, при этом однако есть возможность довольно просто увеличивать производительность всего кластера.

Ссылки

http://www.coffeepowered.net/2010/02/17/serving-files-out-of-gridfs/

http://www.slideshare.net/chrisjpowers/grid-fs

3 Comments

  1. Мне больше всего оказалась полезным информация про apache benchmark tool 🙂 Сам по себе ab не дает нагрузку на сервер? Можете поделиться способами тестирования производительности веб-приложений? С достоинствами/недостатками было бы вообще замечательно.

    1. Ну если он запускается с другого сервера то точно нет 🙂
      Да, думаю отдельным постом сделаю. А в общем скажу так, есть siege и ab. Мне нравится ab, т.к. он очень простой с одной стороны, а с другой – очень гибкий. Можно на баше или руби написать скрипт, который будет вызывать ab с разными параметрами и эмулировать таким образом целевую аудиторию с необходимыми действиями.

Leave a Comment