Эластичное избыточное S3-совместимое хранилище за 15 минут

  • Tutorial
S3 сегодня не удивишь наверное никого. Его используют и как бэкенд хранилище под веб сервисы, и как хранилище файлов в медиа индустрии, так и как архив для бэкапов.



Рассмотрим небольшой пример развертывания S3-совместимого хранилища на основе объектного хранилища Ceph

Краткая справка

Ceph — это open source разработка эластичного легко масштабируемого петабайтного хранилища. В основе лежит объединение дисковых пространств нескольких десятков серверов в объектное хранилище, что позволяет реализовать гибкую многократную псевдослучайную избыточность данных. Разработчики Ceph дополняют такое объектное хранилище еще тремя проектами:

  • RADOS Gateway — S3- и Swift-совместимый RESTful интерфейс
  • RBD — блочное устройство с поддержкой тонкого роста и снапшотами
  • Ceph FS — распределенная POSIX-совместимая файловая система

Описание примера

В моем примере я продолжаю использовать 3 сервера по 3 SATA диска в каждом: /dev/sda как системный и /dev/sdb и /dev/sdc под данные объектного хранилища. В качестве клиента могут выступать различные программы, модули, фреймворки для работы с S3 совместимым хранилищем. Я успешно протестировал DragonDisk, CrossFTP и S3Browser.
Также в этом примере я использую всего один RADOS Gateway на ноде node01. S3 интерфейс будет доступен по адресу s3.ceph.labspace.studiogrizzly.com.
Стоит отметить что на данный момент Ceph поддерживает такие S3 операции http://ceph.com/docs/master/radosgw/s3/.

Приступим


Шаг 0. Подготовка Ceph

Так как я продолжаю использовать уже развернутый кластер Ceph, мне необходимо только немного поправить конфигурацию /etc/ceph/ceph.conf — дописать определение для RADOS Gateway

[client.radosgw.gateway]
        host = node01
        keyring = /etc/ceph/keyring.radosgw.gateway
        rgw socket path = /tmp/radosgw.sock
        log file = /var/log/ceph/radosgw.log
        rgw dns name = s3.ceph.labspace.studiogrizzly.com
        rgw print continue = false

и обновить ее на других нодах

scp /etc/ceph/ceph.conf node02:/etc/ceph/ceph.conf
scp /etc/ceph/ceph.conf node03:/etc/ceph/ceph.conf

Шаг 1. Инсталлируем Apache2, FastCGI и RADOS Gateway

aptitude install apache2 libapache2-mod-fastcgi radosgw

Шаг 2. Конфигурация Apache

Включаем необходимы модули

a2enmod rewrite
a2enmod fastcgi

Создаем VirtualHost для RADOS Gateway /etc/apache2/sites-available/rgw.conf

FastCgiExternalServer /var/www/s3gw.fcgi -socket /tmp/radosgw.sock

<VirtualHost *:80>
        ServerName s3.ceph.labspace.studiogrizzly.com
        ServerAdmin tweet@studiogrizzly.com
        DocumentRoot /var/www

        RewriteEngine On
        RewriteRule ^/([a-zA-Z0-9-_.]*)([/]?.*) /s3gw.fcgi?page=$1¶ms=$2&%{QUERY_STRING} [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]

        <IfModule mod_fastcgi.c>
                <Directory /var/www>
                        Options +ExecCGI
                        AllowOverride All
                        SetHandler fastcgi-script
                        Order allow,deny
                        Allow from all
                        AuthBasicAuthoritative Off
                </Directory>
        </IfModule>


        AllowEncodedSlashes On
        ErrorLog /var/log/apache2/error.log
        CustomLog /var/log/apache2/access.log combined
        ServerSignature Off
</VirtualHost>

Включаем созданный VirtualHost и выключаем дефолтный

a2ensite rgw.conf
a2dissite default

Создаем FastCGI скрипт /var/www/s3gw.fcgi:

#!/bin/sh
exec /usr/bin/radosgw -c /etc/ceph/ceph.conf -n client.radosgw.gateway

и делаем его исполняемым

chmod +x /var/www/s3gw.fcgi

Шаг 3. Подготавливаем RADOS Gateway

Создаем необходимую директорию

mkdir -p /var/lib/ceph/radosgw/ceph-radosgw.gateway

Генерируем ключ для нового сервиса RADOS Gateway

ceph-authtool --create-keyring /etc/ceph/keyring.radosgw.gateway
chmod +r /etc/ceph/keyring.radosgw.gateway
ceph-authtool /etc/ceph/keyring.radosgw.gateway -n client.radosgw.gateway --gen-key
ceph-authtool -n client.radosgw.gateway --cap osd 'allow rwx' --cap mon 'allow r' /etc/ceph/keyring.radosgw.gateway

и добавляем его в кластер

ceph -k /etc/ceph/ceph.keyring auth add client.radosgw.gateway -i /etc/ceph/keyring.radosgw.gateway

Шаг 4. Запуск

Рестартуем Apache2 и RADOS Gateway

service apache2 restart
/etc/init.d/radosgw restart

Шаг 5. Создаем первого пользователя

Что бы использовать S3 клиент нам необходимо получить ключи access_key и secret_key для нового пользователя

radosgw-admin user create --uid=i --display-name="Igor" --email=tweet@studiogrizzly.com

смотрите вывод команды и скопируйте ключи в ваш клиент

Шаг 6. DNS

Для того что бы заработали buckets нам необходимо что бы DNS сервер при запросе любого субдомена для s3.ceph.labspace.studiogrizzly.com указывал на IP адрес хоста где запущен RADOS Gateway.
Например, при создании bucket с названием mybackups — домен mybackups.s3.ceph.labspace.studiogrizzly.com. должен указывать на IP адрес node01, что есть — 192.168.2.31.
В моем случае я просто добавлю CNAME запись

*     IN     CNAME     node01.ceph.labspace.studiogrizzly.com.

Послесловие

За 15 минут мы успели развернуть S3-совместимое хранилище. Теперь попробуйте подключить ваш любимый S3 клиент.



Бонусная часть


Я попросил sn00p рассказать о его опыте использовании RADOS Gateway в продакшн в компании 2GIS. Ниже его отзыв:

Общее описание

У нас стоит варниш, варнишу бекендами подцеплены 4 апача радосгейтвеев. Приложение сначала лезет в варниш, если там облом, то раундробином ломится напрямую в апачи. Эта штука жмет 20000 рпс без проблем по синтетическим тестам jmeter c access логом за месяц. Внутри полмиллиона фоточек, рабочая нагрузка на фронтенд около 300 рпс.



Ceph пока что на 5 машинах, там отдельный диск под osd и для журнала отдельный ssd. Репликация дефолтная, ^2. Система без проблем переживает падение двух нод одновременно и там дальше с вариациями. За полгода ни одной ошибки еще клиенту не показали.

Нет проблем с гибкостью — размер хранилища, иноды, раскладка по каталогам — это все в прошлом осталось.

Особенности решения

  • Пять серверов HP Proliant Gen8 DL360e. Под задачи Ceph на каждом сервере выделены по одному 300 Гб SAS 15krpm. Для существенного повышения производительности журналы демонов osd вынесены на ssd диски Hitachi Ultrastar 400M.
  • Две виртуальные машины kvm с apache2 и radosgw внутри. Как nginx работает с FastCGI мне лично не понравилось. Nginx при аплоаде использует буферизацию перед тем, как отдать контент бэкенду. Теоретически, могут возникнуть проблемы при больших файлах или потоках. Но, дело вкуса и ситуации, nginx тоже работает.
  • Apache2 используем модифицированный, который позволяет обрабатывать 100-continue HTTP response. Готовые пакеты можно взять здесь.
  • Приложение с varnish смотрит на обе ноды с radosgw. Здесь может быть любой кэш или балансер. Если он падает, приложение умеет опрашивать radosgw напрямую:
    раскрыть
    backend radosgw1 {
      .host = "radosgw1";
      .port = "8080";
      .probe = {
          .url = "/";
          .interval = 2s;
          .timeout = 1s;
          .window = 5;
          .threshold = 3;
      }
    }
    backend radosgw2 {
      .host = "radosgw2";
      .port = "8080";
      .probe = {
          .url = "/";
          .interval = 2s;
          .timeout = 1s;
          .window = 5;
          .threshold = 3;
      }
    }
    director cephgw round-robin {
      {
          .backend = radosgw1;
      }
      {
          .backend = radosgw2;
      }
    }
    
  • Каждому приложению выделен свой bucket. Поддерживаются различные acl, можно гибко регулировать права доступа для bucket и для каждого объекта в нем.
  • Для работы со всей кухней мы используем python-boto. Вот пример скрипта на python (осторожно, отступы), который умеет с файловой системы залить все в bucket. Данный способ удобен для пакетной обработки кучи файлов в автоматическом режиме. Если не нравится python — не проблема, можно использовать другие популярные языки.
    раскрыть
    #!/usr/bin/env python
    import fnmatch
    import os, sys
    import boto
    import boto.s3.connection
    access_key = 'insert_access_key'
    secret_key = 'insert_secret_key'
    
    pidfile = "/tmp/copytoceph.pid"
    def check_pid(pid):
          try:
                  os.kill(pid, 0)
          except OSError:
                  return False
          else:
                  return True
    
    if os.path.isfile(pidfile):
          pid = long(open(pidfile, 'r').read())
          if check_pid(pid):
                  print "%s already exists, doing natting" % pidfile
                  sys.exit()
    
    pid = str(os.getpid())
    file(pidfile, 'w').write(pid)
    
    conn = boto.connect_s3(
          aws_access_key_id = access_key,
          aws_secret_access_key = secret_key,
          host = 'cephgw1',
          port = 8080,
          is_secure=False,
          calling_format = boto.s3.connection.OrdinaryCallingFormat(),
          )
    
    mybucket = conn.get_bucket('test')
    mylist = mybucket.list()
    i = 0
    for root, dirnames, filenames in os.walk('/var/storage/photoes', followlinks=True):
      for filename in fnmatch.filter(filenames, '*'):
          myfile = os.path.join(root,filename)
          key = mybucket.get_key(filename)
          i += 1
          if not key:
              key = mybucket.new_key(filename)
              key.set_contents_from_filename(myfile)
              key.set_canned_acl('public-read')
              print key
              print i
    os.unlink(pidfile)
    
  • Из коробки radosgw сильно разговорчивый и при нормальной нагрузке генерит большие файлы с логами. При наших нагрузках обязательно снизили уровень логирования:
    раскрыть
    [client.radosgw.gateway]

    debug rgw = 2
    rgw enable ops log = false
    log to stderr = false
    rgw enable usage log = false
    ...
  • Для мониторинга используем шаблон для Zabbix, исходники можно забрать тут.

Все это работает у нас уже полгода и вообще не требует вмешательства администратора ))

Планы на будущее

Сейчас я пробую использовать Ceph для хранения и отдачи уже 15 миллионов файлов по ~4-200кб. С S3 это весьма не удобно — там нет операций bulk-copy, нельзя удалить bucket с данными, чтобы первоначально хранилище наполнить — это медленно ппц. Исследуем как это подкрутить.

Но главная задача — геокластер, мы сами в Сибири и хотим отдавать данные из географически близкой точки клиенту. До Москвы у нас контент летит с задержкой уже — до 100мс плюсом, это не годится. Ну у разработчиков Ceph вроде все в планах такое.
Поделиться публикацией

Комментарии 26

    +8
    У нас стоит варниш, варнишу бекендами подцеплены 4 апача радосгейтвеев. Приложение сначала лезет в варниш, если там облом, то раундробином ломится напрямую в апачи. Эта штука жмет 20000 рпс без проблем по синтетическим тестам jmeter c access логом за месяц. Внутри полмиллиона фоточек, рабочая нагрузка на фронтенд около 300 рпс.

    Мне ничего не понятно, но когда читаешь, а тем более произносишь — звучит круто :)
      0
      Спасибо, интересно.
      У меня вопрос по тестированию: есть ли цифры нагрузочного тестирования по IO?
        +1
        Вот хорошая статья про бенчи. Наблюдаем у себя подобные цифры.
        Другой вопрос, что тут на разных этапах много разного I\O и надо разобраться сначала, что именно интересует. Также все надо настраивать конкретно под задачу.
          0
          Если говорить конкретно про radosgw, то тут правильнее говорить о RPS, то есть сколько запросов в секунду способна эта система прожевать.
          Я брал лог-файл с фронтенда за месяц, загружал его в jmeter и получал цифры до 20000 запросов в секунду на чтение на реальные объекты.
          Это синтетический тест, зависит от настроек apache2, сетевого стека, количества памяти и камней для компонентов.
          Тут все кэшами подперто, все очень быстро.

          На запись все очень сильно печально, открывается коннект к фронтенду и делается upload пост-запросом для каждого объекта со всеми вытекающими.
            0
            Я читал эту статью, спасибо. К сожалению в моём проекте таких показателей тестов недостаточно, чтобы работать с данными.
              0
              В общем, вариантов построения ceph множество. Типы и способы подключения дисков, файловые системы, кеширование, вынесение журналов и многое другое. Тут необходимо думать, выбирать и тестировать.
              Но, на днях видел инициативу в сообществе о создании некоего калькулятора основанного на замерах конкретных конфигураций — www.spinics.net/lists/ceph-users/msg01738.html
        +1
        Nginx при аплоаде использует буферизацию перед тем, как отдать контент бэкенду. Теоретически, могут возникнуть проблемы при больших файлах или потоках. Но, дело вкуса и ситуации, nginx тоже работает.
        Ну так не надо так делать: php-fpm.org/wiki/Features#Accelerated_upload_support
          0
          Честно, особо не разбирался ) Спасибо за ссылку.
          Есть вопросы про multipart upload и про то, где nginx этот временный файл положит )))
            +1
            Вот сюда: nginx.org/en/docs/http/ngx_http_core_module.html#client_body_temp_path
            Multipart одним куском в реальности-то приходит. Думаю, так одним куском и кладётся.
              0
              Путь к нему будет находиться в переменной $request_body_file, как её передать на бэкенд — уже решать вам. Можете передать в теле запроса, можете передать в теле в формате json, а можете как переменную окружения, как в примере по ссылке.
                0
                А можно и не передавать никуда, а писать в лог, в отдельный файл, который использовать как очередь заданий на обработку.
            0
            Кстати как по надежности ceph? Я гдето квартал назад поставил на сервера для тестирования последнюю версию, даже без особой нагрузки одна из нод выпала через месяц. Что не есть гуд.
              0
              Надо понимать, что в такой системе recovery — это постоянный и обычный процесс, в том и фишка. Она так и придумывалось и проектировалась. Самое главное, чтобы это не сказывалось на производительности системы и сохранности данных, тут этого добились. Особенность ceph в том, что оно само узнает о проблеме, само восстанавливается в автоматическом режиме, что никак не сказывается на работе всего кластера. Если и требуется вмешательство админа, то это в пределах одной-двух утилит в консоли.

              В разумных пределах и без фанатизма, конечно же. Например, при степени репликации n^2, дисков делать больше пяти, мониторы резервировать, собирать все на нормальном железе, обеспечить нормальную сеть, мониторить все точки.

              При такой степени активности разработчиков можно понадеяться на выпуск совсем стабильной версии очень скоро. Пока вот прям «стабильности» не наблюдается, если оценивать с точки зрения enterprise. Нет, оно работает, но, например биллинг или финансовое что-то складывать — я бы не стал, честно. Ну и альтернатив нет с таким же функционалом, с такой же простотой настройки и надежностью.
                0
                Elliptics смотрели?
                  0
                  Было дело ))
                  — непонятный черный ящик,
                  — документации ноль на тот момент,
                  — своеобразное чувство юмора у программистов,

                  Оно как-то проработало несколько месяцев, потом стало ломаться. Из-за чего ломаться, как чинить — непонятно. Я даже не осилил, как проверить его консистентность, допустим. Ну или вообще понять, где там что с нагрузкой и балансировкой. Вроде какие-то логи и утилиты есть, но сплошная белиберда ) Спросить не у кого. У самих разработчиков — нда-паранойя, максимум, что можно добиться: «используйте эту крутую штуку, мы используем и все круто». Например, вот.

                  Вообще продукты от самизнаетекого очень неряшливо и непонятно написаны. Есть ощущение, что опенсорсят они базовый функционал и какие-то проблемные огрызки для тестирования и патчей, на остальное забивают. Ну и для всех этих продуктов есть аналоги. Более удобные и приятные, зачастую.
                    0
                    Вот, кстати видео. Там на седьмой минуте ржака. Вот у них все так и работает. «Требует некоторой оптимизации или давайте перепишем rsync».
                      0
                      они запустили отдельную компанию под elliptics: reverbrain.com
                      может кто-то имел с ними дело?
                  +3
                  У всех крупных проектов, вылет нод, дисков, рекавери режим — это ежедневная реальность и лично мной воспринимается как нормальная работа. Просто надо тщательно мониторить — в том числе и сам мониторинг ( это важно ) и резервировать.
                  0
                  В сценарии с rados узкое место в виде единственного mds имеет место быть?
                    0
                    Нет, mds используется только в случае cephfs. Если файлуху не надо, этот компонент можно не ставить.
                      0
                      Если будешь поднимать кластер через mkcephfs как в предыдущем топике, убери из /etc/ceph/ceph.conf секцию о mds.a. Просто не будет реализации cephfs.
                    0
                    Пообщался в привате с автором — я бы честно говоря убрал бы из названия статьи кусочек «за 15 минут») Конечно есть новые технологии, есть инноваторы, но никто не отменял стандартные штатные методы. Ну не катит это всё для хай-лоада — как не крути. Не катит. Мы тут посчитали — у меня получается 800Мб в сек запись, уже не вариант — пытались тестировать pNFS — тоже не вариант. Только параллелить и сваливать на разные бэки — и + 10Гбсек. Вот так.
                      0
                      Честно говоря, никак не пойму, откуда у вас такие скорости. 800 мегабайт в секунду на запись. И уж тем более 10 гигабайт в секунду.
                      SSD диск ентерпрайз класса жмет мегабайт 500 при линейной записи. R0 из двух ентерпрайз SAS 15К — теоретически может раскочегариться до 700-800, опять же линейной записи. Практически — ну нет. Другие рейды — до 400 мегабайт линейной записи.
                      А есть еще файловая система, файлы и блоки разного размера, фрагментация. Запись почти всегда нелинейная. На выходе имеем на запись 250-300 мегабайт в секунду в среднем, на дорогом оборудовании. Это еще надо подключить и раздать потом, нужна распределенная файловая система. Что в среднем на 10-30% медленнее работает, чем традиционные файлухи.
                      Что вы пишите, как и куда? В кэш?)

                      Highload тут при чем? 20000 обработанных запросов в секунду — вполне себе highload.

                        0
                        Спросите топикстартера — я с ним общался — скорости релаьные и постоянные. tns-counter.ru — ж
                      0
                      Так, давай по порядку. Цель топика, как не сложно догадаться из названия, быстро поднять RADOS Gateway. Как я уже написал чуть выше, возможных конфигураций ceph множество и за один топик ну не описать все, тем более в режиме гайда. Ну а как ты хотел?

                      Теперь по твоему варианту, давай более предметно. Допустим у тебя есть 100 серверов, которые дампят файлы на хранилище раз в 15 минут. Ожидаемый объем одного такого файла 1ГБ. Грубый просчет тогда такой: 1ГБ за 15 минут это 1,3 МБ/c c одного сервера или 130 МБ/c со 100. Допустим ты хочешь иметь три реплики — умножаем на три получаем 390 МБ/c.
                      Вот тут есть грамотные тесты с правильным кешированием ceph.com/community/ceph-performance-part-1-disk-controller-write-throughput/. То есть контроллер с пробросом 6-и 7200RPM SATA дисков + журналы osd на ssd выдают что-то около 100 МБ/c на диск при XFS, который рекомендуют в продакшн.
                      Я не знаю что у тебя хранилище сейчас, но если интересны плюшки Сeph, то есть смысл попробовать собрать 3 сервера с 6-12 шпинделями и одним ssd на каждом + правильный контроллер.

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                    Самое читаемое