SlideShare a Scribd company logo
1 of 50
Опыт эксплуатации большого
       Ruby-проекта

           Александр Чистяков
                 КупиКупон
      http://alexclear.livejournal.com
Докладчик?

•   PHP-программист
•   Администратор баз данных
•   Эксплуатационщик
•   Архитектор серверных приложений
      ^ WTF?
• Добрый землянин
• Занимает место в профессии
Аудитория?

•   Ruby-программисты
•   Администраторы баз данных?
•   Эксплуатационщики?
•   Архитекторы серверных приложений
•   Добрые земляне?
Цели

•   Разрушить мифы
•   Столкнуть с парохода современности
•   Я никого не хочу победить
•   «Не едь за мной – ты там не проедешь»
    (ворона птица сильная и на голову наглухо
    ушибленная)
Disclaimer
• Все мертвые проекты мертвы одинаково, все
  живые проекты живы по-разному
• «Кто не умеет работать – учит»
  – «Кодекс это набор рекомендаций»
• Самое важное – верно определить граничные
  условия
  – А нужно ли вам именно это? А зачем?
  – А, может, ну его этот веб и в Тибет?
Большой проект
• Купонный сервис, входит в top 3 в России
• Что он должен уметь технически?
  – Рассылать много почты
  – Предоставлять пользователям возможность
    регистрироваться и покупать
  – Предоставлять продавцам возможность
    регистрироваться и управлять акциями
  – Предоставлять менеджерам возможность
    создавать аналитические отчеты
Моя роль в проекте
• Системный администратор
• Мне больше нравится слово
  «эксплуатационщик», но мне его не
  произнести
• В свое время был привлечен для
  консультаций, да так и прижился
Исходное состояние
• Проект на LAMP
  – MySQL 5.0.95
  – Drupal
• Хостинг:
  – OpenVZ контейнер большого размера
  – Доступа к хост-машине нет
  – Установлена Cpanel
• ~20 RPS к бэкенду
Проблемы 1
• Необходима новая функциональность, но
  – См. картинку
  – По моему опыту, это верно
    для многих PHP CMS
  – Тем не менее, стоит
    вопрос о расширении
    команды

  картинка взята с http://habrahabr.ru/post/144857
Проблемы 2
• Drupal не справлялся с нагрузкой, так как
  – MySQL не справлялся с нагрузкой
  – Apache/PHP не справлялся с нагрузкой
• Включение кэша Drupal не спасло
  – Отвалился геотаргетинг (все незалогиненные
    видят одно и то же)
  – Совсем отвалился геотаргетинг (выбор города
    вручную в меню не помогает)
Решение проблем с разработкой
• Вне зоны моей ответственности, я занимался
  только эксплуатацией проекта
• Если вкратце, три слова: Ruby on Rails
• Если вам интересно мое мнение
  – Лучше сразу писать проект на RoR, чем сначала написать
    RoR на PHP/Drupal, а на этом уже – проект
  – И не забудьте про гемы, их все тоже придется написать на
    PHP
  – Переход выглядит более чем оправданным
Решение текущих проблем с
         эксплуатацией 1
• Apache/PHP
  – Выкинули suPHP - избавились от форков
  – (Почти) выкинули cPanel (инвазивнейший монстр,
    протачивающий свои ходы по всей системе)
• MySQL
  – Убрали MyISAM – перестали блокировать базу в
    момент дампа
  – Размер буфера, размер бинлога,
    flush_log_at_trx_commit – см. доклад Андрея
    Аксенова
Решение текущих проблем с
         эксплуатацией 2
• MySQL
  – Включили query cache (меньшее зло)
  – Настроили slow log и mk-log-parser
  – Построили индексы там, где было необходимо
• Платформа
  – etckeeper (спасал нас впоследствии)
  – Приведение в порядок cron-файлов и других
    конфигов
  – Не имея доступа к хост-машине много не
    натюнишь
Последствия
• Кэш Drupal удалось отключить
• Нагрузка на машину существенно снизилась
• Когда через пару месяцев трафик возрос в
  два раза, это не вызвало никаких проблем
Ruby-версия: платформа
•   RHEL 5.5
•   Ruby 1.8.7 (REE), Rails 3
•   PostgreSQL вместо MySQL
•   (Единственное, на мой взгляд, преимущество
    PostgreSQL для таких проектов – наличие
    online alter прямо в поставке)
    – Это если вы не добавляете столбец с дефолтным
      значением
Ruby-версия: железо
• Dell R710, 24 или 48 Gb, SAS-диски
• RAID контроллеры с BBU
• Production конфигурация:
  –   Один сервер для базы данных
  –   Один сервер для RoR
  –   Сервер для бэкапа
  –   Сервера для отдачи статики, телефонии,
      разработки – гораздо более скромные параметры
Ruby-версия: компоненты
•   RVM
•   Unicorn
•   god для управления Unicorn’ами
•   Периодические задачи – cron+rake
•   Обработчики очередей
•   Resque как сервер очередей
•   Изначально – god для управления
    обработчиками
Тем временем, PHP-версия
• Менеджеры хотят считать статистику – вынос
  тяжелых запросов на R/O реплику, отдельное
  приложение (потом для Ruby-версии будет то
  же самое)
• (Кстати, эта реплика постоянно
  отваливалась)
• Трафик продолжает расти
• Внезапно, DDoS
DDoS 1
• Быстро выделили шаблон и собрали список
  «плохих» IP (~6000 адресов за первый час)
• Доступа к хост-машине нет – ipset установить
  невозможно
• Передали список «плохих» IP хостеру с
  просьбой сделать блокировку на их
  оборудовании
• Поставили mod_evasive
DDoS 2
• С утра передали еще один список ~8000
  адресов
• Поддержка хостера заблокировала все
  адреса на нашем же iptables
• %$^#!
• Арендовали сервер в другом месте,
  установили на нем ipset, сделали его
  фронтэндом к старому
Это еще не все с PHP-версией
• Легитимный трафик со временем все больше
• PHP-версия не справляется, разработчики
  вынуждены опять включить кэш Drupal’а
• Не помогает, база время от времени
  «выносит» диск
• Аренда еще одного сервера у того же хостера
  (сервер стоит дороже, лучше дисковая –
  выносим базу на него)
Запуск Ruby-версии
• Запуск поэтапный, по странам
• В России больше всего клиентов – ее
  запускали в последнюю очередь
• Процедура запуска: остановка платежей,
  домиграция пользователей, проксирование
  сайта со старого места на новое, смена
  записей в DNS
Проблемы 1
• Миграции с первого раза не проходят – не
  сходятся балансы, приходится править код и
  перезапускать миграцию
• Миграции идут через Resque
• Один пользователь – одно сообщение в
  очереди
• Одно сообщение в очереди – один fork()
• Fork rate ~80 forks/s
Проблемы 2
• Приложение для России запустили в пятницу
  вечером (thank God), в субботу днем оно
  начало втыкать
• Все это время мы бились за живучесть
• Не забыли ли мы о нагрузочном
  тестировании?
• Не забыли, но где-то ошиблись с оценкой
Битва за живучесть 1
• Сразу было видно, что проблемы не на базе
  данных
• Выкинули GlusterFS – не помогло
• Переехали с KVM-based виртуалки на хост –
  не помогло
• Увеличили количество воркеров – не помогло
• Поставка нового сервера – 10 дней
Битва за живучесть 2
• А как вообще понять, где втыкает
  приложение?
• Сделать профайлинг?
• Ограничение – профайлить надо прямо под
  нагрузкой
• Я PHP-программист  и не имел опыта
  профайлинга Ruby-проектов под нагрузкой
  при помощи профайлера для Ruby
• Но ясно, что нужно что-то неинвазивное
Битва за живучесть 3
• А как бы я профайлил Java-приложение?
• Очевидно: сделал бы сэмплинг стектрейсов
• А что останавливает в случае Ruby?
• Ничего не останавливает:
   – PMP, http://poormansprofiler.org
• При помощи тривиального sh-скрипта gdb
  превращается в средство записи сэмплов с заданным
  интервалом
• Я писал раз в секунду, 50-600 сэмплов за один запуск
  скрипта
PMP
• Что хорошо – RVM собирает Ruby с debug info
• Что плохо – стектрейсы приходится
  анализировать и классифицировать вручную
• Сейчас я пытаюсь написать
  полуавтоматический классификатор, но даже
  до альфа-версии дело пока не дошло
Битва за живучесть - 4
• Сэмплирование показало, что втыкает GC
• Попытки настроить GC через переменные
  окружения провалились
• Срочный переход REE 1.8.7 – MRI 1.9.3
• После перехода GC заработал как надо
• Тем временем, разработчики приделали
  фрагментарный кэш
• Ура, белый господин разрешил нам немного
  поспать!
А сколько нужно воркеров?
• Автор Unicorn рекомендует от 4 до 8
  воркеров на ядро
• Double facepalm
• На самом деле, воркеров нужно столько,
  чтобы они могли держать нагрузку
• Что же такое «держать нагрузку»?
• 50-70% сэмплов должны быть «сижу на
  select(), жду запроса»
• - Почему 50-70%? – А почему было 4-8 на ядро?
Когда в руках сэмплирующий
               профайлер
• Все вокруг выглядит программным
  обеспечением
• В норме воркеры Unicorn стоят на select() и
  ждут запрос от апстрима
• Не в норме:
  –   На вызовах GC
  –   На записи в лог
  –   На select() внутри EventMachine (вопросы не ко мне)
  –   На обмене с БД
Помните, я говорил о рассылке
              почты?
• Рассылкой почты занимается внешний
  провайдер, но запускает ее rake task
• При миграции Ruby с 1.8.7 до 1.9.3 возникли
  проблемы с производительностью
• Сэмплер показал что уперлись в старый
  добрый GC
• В этот раз удалось настроить GC при помощи
  переменных окружения
Что еще было хорошего?
• Запрос для построения аналитической таблицы:
  UPDATE purchases SET user_created_at =
   us.created_at FROM purchases p
    INNER JOIN users us ON us.id = p.user_id
    AND p.user_id >= 2000000 AND p.user_id < 2100000;
• Как вы думаете, что он делает?
• По уму, ему нужно сделать один full scan и
  успокоиться
• Есть fork bomb и archive bomb, а это – SQL bomb
Sinatra
• Что занесло ее в проект сейчас не узнать –
  иных уж нет, а те далече
• Может, кому-то не хватало строк в резюме?
• Sinatra при ошибке приложения читает
  модели, для чего переопрашивает БД на
  предмет структуры базы
• Это очень эффективный способ поставить
  базу на колени
Пруф или не было
• На графике погода в Сахаре, но можно сделать
  оценочное суждение о том, что базе плохо




• Мы в эту ловушку попадали дважды с большим
  промежутком, и во второй раз никто уже не помнил
  суть вопроса
Байки из склепа
• Однажды мы забыли на продакшне mc с
  поиском по большому файлу, и он занял 16
  гигабайт
• Я знал, что этим кончится, поэтому не
  пользуюсь mc последние лет семь
• Кстати, для расследования подобных
  инцидентов у нас запущен atop
Немного про настройку БД
• Ежедневные отчеты pgfouine
• Если где-то нет индекса, и он может помочь - строим
• Настройка конфигурации движка:
   – А чего хотим?
   – Включаем log_checkpoints и следим, чтобы причиной
     выполнения checkpoint’а было истечение таймаута, а не
     переполнение лога
   – Таймаут, кстати, поднимаем
   – А также ставим checkpoint_completion_target поближе к 1
   – Много сегментов хорошо для массовой записи и плохо для
     аварийного рестарта (адаптируйте под ситуацию)
Еще немного про настройку БД
• Пробовали встроенную в 9.X hot standby
  репликацию
  – Все хорошо до того момента, пока данные в
    реплике не окажутся не такими, как в мастере
• Пробовали Slony-I
  – DDL statements в миграциях нужно оборачивать в
    вызов команды, что очень неудобно
• Вернулись к hot standby, ведем наблюдение
И про бэкап БД
• Сначала делали pg_dumpall прямо с
  продакшна
  – Это быстро закончилось
• Потом – pg_dumpall с реплики
  – Это тоже перестало работать
• Теперь WAL archiving при помощи pg_rman
• Хотим попробовать Amanda
Эволюция деплоймента
• Вручную из git
• Caplite (не спрашивайте в киосках города,
  это внутренний набор скриптов)
• Capistrano
• Я раньше не думал, что приложение на
  динамическом языке может деплоиться так
  долго (thank SASS, etc)
Эволюция процесса
• Креативный хаос (очень быстро, но очень
  грязно)
• Peer reviews
• Unit tests
• CI:
  – Bigtuna
  – <s>Bigtuna</s> Jenkins
Управление конфигурацией
• Вручную
• Chef
• Каждому разработчику – свою виртуальную
  машину
  – Збс!
Мониторинг
• NAGIOS
• http://host-tracker.com
• Airbrake
• NewRelic
• Smokeping
• Мониторинг от хостера (много лишних
  срабатываний)
• В большом проекте всегда кто-нибудь не спит
Человеческий фактор 1
• Вам может показаться, что ваши коллеги не
  умеют работать
• Не надо волноваться, так оно и есть
• Google, Yandex, Островок, калифорнийские
  стартапы, …, … - все нанимают лучших
• Если все нанимают лучших, кому же
  достаются худшие?
• Кстати, а с чего вы взяли, что умеете
  работать?
Человеческий фактор 2
• Лучшие, худшие, дайте хоть каких-нибудь!
• ~15 Skype-собеседований, чтобы найти
  одного человека в команду эксплуатации
• Люди из Yandex, Mail.Ru, Scalaxy…
• Наняли того, кто хотя бы умеет пользоваться
  поисковиком (делайте выводы о качестве
  остальных)
• И не ошиблись в выборе
Человеческий фактор 3
• Что мешает простым людям в команде:
  – Микроменеджмент
  – Соревнования на пустом месте (поэтому не
    нанимайте в команду одних только «звезд»)
  – Поиск виноватых в те моменты, когда надо чинить
    упавшее
  – Истерики в эти же моменты
• К счастью, все эти вопросы можно решить
Планы на будущее

• Стандартизация, унификация
  – Больше Chef’а
  – Консолидация серверов
  – Больше мониторинга и графиков
• Автоматизация
  – Автоматический failover
  – Раннее обнаружение отказов, построение трендов
• Уменьшение количества SPOF
Выводы

• Who dares wins
• Большой проект это <s>сложно</s> тяжело,
  но интересно
• Ruby on Rails продукт эволюции, а не
  революции – стандартные практики все те же
• Понимание происходящего в системе все так
  же важно, как и 10 лет назад
Вопросы?
•
•
•
•
•
•
Спасибо за внимание!
•   С вами был Александр Чистяков
•   http://alexclear.livejournal.com
•   alexclear@gmail.com
•   http://github.com/alexclear

More Related Content

What's hot

Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
 Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo) Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)Ontico
 
Akka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный кодAkka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный кодRoman Grebennikov
 
Введение в Akka
Введение в AkkaВведение в Akka
Введение в AkkaZheka Kozlov
 
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)Ontico
 
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)Ontico
 
Андрей Акиньшин
Андрей АкиньшинАндрей Акиньшин
Андрей АкиньшинCodeFest
 
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Ontico
 
Алексей Федоров
Алексей ФедоровАлексей Федоров
Алексей ФедоровCodeFest
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Ontico
 
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)
RTB DSP на языке Go укрощение buzzwords /  Даниил Подольский (Qmobi.Com)RTB DSP на языке Go укрощение buzzwords /  Даниил Подольский (Qmobi.Com)
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)Ontico
 
Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)
Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)
Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)Ontico
 
DUMP-2015: «Распределенная обработка миллионов документов на Scala и Akka» Ст...
DUMP-2015: «Распределенная обработка миллионов документов на Scala и Akka» Ст...DUMP-2015: «Распределенная обработка миллионов документов на Scala и Akka» Ст...
DUMP-2015: «Распределенная обработка миллионов документов на Scala и Akka» Ст...it-people
 
Денис Иванов
Денис ИвановДенис Иванов
Денис ИвановCodeFest
 
Юрий Насретдинов, Badoo
Юрий Насретдинов, BadooЮрий Насретдинов, Badoo
Юрий Насретдинов, BadooOntico
 
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...Ontico
 
С одним плюсом (Андрей Аксёнов)
С одним плюсом (Андрей Аксёнов)С одним плюсом (Андрей Аксёнов)
С одним плюсом (Андрей Аксёнов)Unigine Corp.
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотомRoman Grebennikov
 

What's hot (20)

Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
 Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo) Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
 
Akka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный кодAkka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный код
 
Введение в Akka
Введение в AkkaВведение в Akka
Введение в Akka
 
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
 
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
 
Андрей Акиньшин
Андрей АкиньшинАндрей Акиньшин
Андрей Акиньшин
 
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
 
Алексей Федоров
Алексей ФедоровАлексей Федоров
Алексей Федоров
 
Sivko
SivkoSivko
Sivko
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
 
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)
RTB DSP на языке Go укрощение buzzwords /  Даниил Подольский (Qmobi.Com)RTB DSP на языке Go укрощение buzzwords /  Даниил Подольский (Qmobi.Com)
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)
 
Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)
Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)
Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)
 
DUMP-2015: «Распределенная обработка миллионов документов на Scala и Akka» Ст...
DUMP-2015: «Распределенная обработка миллионов документов на Scala и Akka» Ст...DUMP-2015: «Распределенная обработка миллионов документов на Scala и Akka» Ст...
DUMP-2015: «Распределенная обработка миллионов документов на Scala и Akka» Ст...
 
Денис Иванов
Денис ИвановДенис Иванов
Денис Иванов
 
Юрий Насретдинов, Badoo
Юрий Насретдинов, BadooЮрий Насретдинов, Badoo
Юрий Насретдинов, Badoo
 
мир без Jsp. thymeleaf 2.0
мир без Jsp. thymeleaf 2.0мир без Jsp. thymeleaf 2.0
мир без Jsp. thymeleaf 2.0
 
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
 
С одним плюсом (Андрей Аксёнов)
С одним плюсом (Андрей Аксёнов)С одним плюсом (Андрей Аксёнов)
С одним плюсом (Андрей Аксёнов)
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотом
 

Viewers also liked

1000 запросов в секунду на rails (Макс Лапшин)
1000 запросов в секунду на rails (Макс Лапшин)1000 запросов в секунду на rails (Макс Лапшин)
1000 запросов в секунду на rails (Макс Лапшин)Ontico
 
Корпоративное приложение на Rails
Корпоративное приложение на RailsКорпоративное приложение на Rails
Корпоративное приложение на RailsAndrei Kaleshka
 
Отладка и эксплуатация Rails-приложений
Отладка и эксплуатация Rails-приложенийОтладка и эксплуатация Rails-приложений
Отладка и эксплуатация Rails-приложенийEgor Baranov
 
Разрушаем негативные мифы Ruby, Rails.
Разрушаем негативные мифы Ruby, Rails.Разрушаем негативные мифы Ruby, Rails.
Разрушаем негативные мифы Ruby, Rails.Ravil Bayramgalin
 
Rails, Eventmachine, Erlang
Rails, Eventmachine, ErlangRails, Eventmachine, Erlang
Rails, Eventmachine, ErlangMax Lapshin
 
Ruby on Rails at HackDay in Saint Petersburg
Ruby on Rails at HackDay in Saint PetersburgRuby on Rails at HackDay in Saint Petersburg
Ruby on Rails at HackDay in Saint PetersburgAlexander Krass
 
Ruby On Rails: Web-разработка по-другому!
Ruby On Rails: Web-разработка по-другому!Ruby On Rails: Web-разработка по-другому!
Ruby On Rails: Web-разработка по-другому!Constantin Kichinsky
 
Ruby: интерпретируемый, динамичный, человеколюбивый
Ruby: интерпретируемый, динамичный, человеколюбивыйRuby: интерпретируемый, динамичный, человеколюбивый
Ruby: интерпретируемый, динамичный, человеколюбивыйAlex Mikitenko
 
13 HappyDev-lite-2015 autumn. Руслан Шарипов. Ruby, making programmers happy.
13 HappyDev-lite-2015 autumn. Руслан Шарипов. Ruby, making programmers happy.13 HappyDev-lite-2015 autumn. Руслан Шарипов. Ruby, making programmers happy.
13 HappyDev-lite-2015 autumn. Руслан Шарипов. Ruby, making programmers happy.HappyDev-lite
 
Антон Веснин - "Обзорное сравнение серверов приложений ruby-on-rails"
Антон Веснин - "Обзорное сравнение серверов приложений ruby-on-rails"Антон Веснин - "Обзорное сравнение серверов приложений ruby-on-rails"
Антон Веснин - "Обзорное сравнение серверов приложений ruby-on-rails"railsclub
 
Codefest 2016 - Go в Openprovider
Codefest 2016 - Go в OpenproviderCodefest 2016 - Go в Openprovider
Codefest 2016 - Go в OpenproviderIgor Dolzhikov
 
Go в автобусе
Go в автобусеGo в автобусе
Go в автобусеArtem Kovardin
 
Обзорная экскурсия по runit
Обзорная экскурсия по runitОбзорная экскурсия по runit
Обзорная экскурсия по runitAlexander Shcherbinin
 
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнесРИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнесAnton Piskunov
 
Как ВКонтакте использует Go
Как ВКонтакте использует GoКак ВКонтакте использует Go
Как ВКонтакте использует GoArtem Kovardin
 
Dynamic Ruby. Lesson #1: Object model
Dynamic Ruby. Lesson #1: Object modelDynamic Ruby. Lesson #1: Object model
Dynamic Ruby. Lesson #1: Object modelAlex Mikitenko
 

Viewers also liked (20)

1000 запросов в секунду на rails (Макс Лапшин)
1000 запросов в секунду на rails (Макс Лапшин)1000 запросов в секунду на rails (Макс Лапшин)
1000 запросов в секунду на rails (Макс Лапшин)
 
Корпоративное приложение на Rails
Корпоративное приложение на RailsКорпоративное приложение на Rails
Корпоративное приложение на Rails
 
Отладка и эксплуатация Rails-приложений
Отладка и эксплуатация Rails-приложенийОтладка и эксплуатация Rails-приложений
Отладка и эксплуатация Rails-приложений
 
Разрушаем негативные мифы Ruby, Rails.
Разрушаем негативные мифы Ruby, Rails.Разрушаем негативные мифы Ruby, Rails.
Разрушаем негативные мифы Ruby, Rails.
 
Rails, Eventmachine, Erlang
Rails, Eventmachine, ErlangRails, Eventmachine, Erlang
Rails, Eventmachine, Erlang
 
Ruby on Rails at HackDay in Saint Petersburg
Ruby on Rails at HackDay in Saint PetersburgRuby on Rails at HackDay in Saint Petersburg
Ruby on Rails at HackDay in Saint Petersburg
 
Ruby On Rails: Web-разработка по-другому!
Ruby On Rails: Web-разработка по-другому!Ruby On Rails: Web-разработка по-другому!
Ruby On Rails: Web-разработка по-другому!
 
Ruby: интерпретируемый, динамичный, человеколюбивый
Ruby: интерпретируемый, динамичный, человеколюбивыйRuby: интерпретируемый, динамичный, человеколюбивый
Ruby: интерпретируемый, динамичный, человеколюбивый
 
13 HappyDev-lite-2015 autumn. Руслан Шарипов. Ruby, making programmers happy.
13 HappyDev-lite-2015 autumn. Руслан Шарипов. Ruby, making programmers happy.13 HappyDev-lite-2015 autumn. Руслан Шарипов. Ruby, making programmers happy.
13 HappyDev-lite-2015 autumn. Руслан Шарипов. Ruby, making programmers happy.
 
Антон Веснин - "Обзорное сравнение серверов приложений ruby-on-rails"
Антон Веснин - "Обзорное сравнение серверов приложений ruby-on-rails"Антон Веснин - "Обзорное сравнение серверов приложений ruby-on-rails"
Антон Веснин - "Обзорное сравнение серверов приложений ruby-on-rails"
 
Oleg Gorbunov Action cable
Oleg Gorbunov Action cableOleg Gorbunov Action cable
Oleg Gorbunov Action cable
 
Codefest 2016 - Go в Openprovider
Codefest 2016 - Go в OpenproviderCodefest 2016 - Go в Openprovider
Codefest 2016 - Go в Openprovider
 
Go в автобусе
Go в автобусеGo в автобусе
Go в автобусе
 
Обзорная экскурсия по runit
Обзорная экскурсия по runitОбзорная экскурсия по runit
Обзорная экскурсия по runit
 
Golang
GolangGolang
Golang
 
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнесРИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
 
Как ВКонтакте использует Go
Как ВКонтакте использует GoКак ВКонтакте использует Go
Как ВКонтакте использует Go
 
Dynamic Ruby. Lesson #1: Object model
Dynamic Ruby. Lesson #1: Object modelDynamic Ruby. Lesson #1: Object model
Dynamic Ruby. Lesson #1: Object model
 
Ruby строки
Ruby строкиRuby строки
Ruby строки
 
OOP в Go
OOP в GoOOP в Go
OOP в Go
 

Similar to Опыт эксплуатации большого проекта на Ruby

Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaAlex Chistyakov
 
Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrusAlex Chistyakov
 
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...IT-Portfolio
 
ekbpy'2012 - Данила Штань - Распределенное хранилище
ekbpy'2012 - Данила Штань - Распределенное хранилищеekbpy'2012 - Данила Штань - Распределенное хранилище
ekbpy'2012 - Данила Штань - Распределенное хранилищеit-people
 
Практический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQLПрактический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQLAlex Chistyakov
 
Обзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновОбзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновOntico
 
PG Day'14 Russia, PostgreSQL в avito.ru, Михаил Тюрин
PG Day'14 Russia, PostgreSQL в avito.ru, Михаил ТюринPG Day'14 Russia, PostgreSQL в avito.ru, Михаил Тюрин
PG Day'14 Russia, PostgreSQL в avito.ru, Михаил Тюринpgdayrussia
 
Mysql replication DevConf 2012
Mysql replication DevConf 2012Mysql replication DevConf 2012
Mysql replication DevConf 2012Alex Chistyakov
 
Практическая реализация распределенного отказоустойчивого Comet сервера на Er...
Практическая реализация распределенного отказоустойчивого Comet сервера на Er...Практическая реализация распределенного отказоустойчивого Comet сервера на Er...
Практическая реализация распределенного отказоустойчивого Comet сервера на Er...Ontico
 
My talk at Highload++ 2015
My talk at Highload++ 2015My talk at Highload++ 2015
My talk at Highload++ 2015Alex Chistyakov
 
Слон желтого цвета и его друзья (эксплуатация Hadoop-стека в федеральном прое...
Слон желтого цвета и его друзья (эксплуатация Hadoop-стека в федеральном прое...Слон желтого цвета и его друзья (эксплуатация Hadoop-стека в федеральном прое...
Слон желтого цвета и его друзья (эксплуатация Hadoop-стека в федеральном прое...Ontico
 
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)Ontico
 
Жизнь проекта на production
Жизнь проекта на productionЖизнь проекта на production
Жизнь проекта на productionNikolay Sivko
 
Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_drupalconf
 
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...rit2011
 
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013Alex Chistyakov
 
Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Serguei Gitinsky
 
AVITO. Решардинг Redis без даунтайма. DevConf 2012
AVITO. Решардинг Redis без даунтайма. DevConf 2012AVITO. Решардинг Redis без даунтайма. DevConf 2012
AVITO. Решардинг Redis без даунтайма. DevConf 2012Roman Pavlushko
 
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...rit2011
 

Similar to Опыт эксплуатации большого проекта на Ruby (20)

Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на Java
 
Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrus
 
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
 
ekbpy'2012 - Данила Штань - Распределенное хранилище
ekbpy'2012 - Данила Штань - Распределенное хранилищеekbpy'2012 - Данила Штань - Распределенное хранилище
ekbpy'2012 - Данила Штань - Распределенное хранилище
 
Практический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQLПрактический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQL
 
Migrate!
Migrate!Migrate!
Migrate!
 
Обзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновОбзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий Насретдинов
 
PG Day'14 Russia, PostgreSQL в avito.ru, Михаил Тюрин
PG Day'14 Russia, PostgreSQL в avito.ru, Михаил ТюринPG Day'14 Russia, PostgreSQL в avito.ru, Михаил Тюрин
PG Day'14 Russia, PostgreSQL в avito.ru, Михаил Тюрин
 
Mysql replication DevConf 2012
Mysql replication DevConf 2012Mysql replication DevConf 2012
Mysql replication DevConf 2012
 
Практическая реализация распределенного отказоустойчивого Comet сервера на Er...
Практическая реализация распределенного отказоустойчивого Comet сервера на Er...Практическая реализация распределенного отказоустойчивого Comet сервера на Er...
Практическая реализация распределенного отказоустойчивого Comet сервера на Er...
 
My talk at Highload++ 2015
My talk at Highload++ 2015My talk at Highload++ 2015
My talk at Highload++ 2015
 
Слон желтого цвета и его друзья (эксплуатация Hadoop-стека в федеральном прое...
Слон желтого цвета и его друзья (эксплуатация Hadoop-стека в федеральном прое...Слон желтого цвета и его друзья (эксплуатация Hadoop-стека в федеральном прое...
Слон желтого цвета и его друзья (эксплуатация Hadoop-стека в федеральном прое...
 
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
 
Жизнь проекта на production
Жизнь проекта на productionЖизнь проекта на production
Жизнь проекта на production
 
Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_
 
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
 
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
 
Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013
 
AVITO. Решардинг Redis без даунтайма. DevConf 2012
AVITO. Решардинг Redis без даунтайма. DevConf 2012AVITO. Решардинг Redis без даунтайма. DevConf 2012
AVITO. Решардинг Redis без даунтайма. DevConf 2012
 
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
 

More from Alex Chistyakov

My slides from DevOpsDays 2019
My slides from DevOpsDays 2019My slides from DevOpsDays 2019
My slides from DevOpsDays 2019Alex Chistyakov
 
My slides from BMM №3 May 2019
My slides from BMM №3 May 2019My slides from BMM №3 May 2019
My slides from BMM №3 May 2019Alex Chistyakov
 
My slides from DevOps-40 meetup Jun 2019
My slides from DevOps-40 meetup Jun 2019 My slides from DevOps-40 meetup Jun 2019
My slides from DevOps-40 meetup Jun 2019 Alex Chistyakov
 
My slides from SECR'2018
My slides from SECR'2018My slides from SECR'2018
My slides from SECR'2018Alex Chistyakov
 
My slides from the first SPb SRE community meetup at DataArt
My slides from the first SPb SRE community meetup at DataArtMy slides from the first SPb SRE community meetup at DataArt
My slides from the first SPb SRE community meetup at DataArtAlex Chistyakov
 
My slides from BMM №4 Nov 2019
My slides from BMM №4 Nov 2019My slides from BMM №4 Nov 2019
My slides from BMM №4 Nov 2019Alex Chistyakov
 
My slides from DevOps-40 meetup Oct 2019
My slides from DevOps-40 meetup Oct 2019My slides from DevOps-40 meetup Oct 2019
My slides from DevOps-40 meetup Oct 2019Alex Chistyakov
 
My slides from DevOps-40 meetup Dec 2019
My slides from DevOps-40 meetup Dec 2019My slides from DevOps-40 meetup Dec 2019
My slides from DevOps-40 meetup Dec 2019Alex Chistyakov
 
Configuration management and Kubernetes
Configuration management and KubernetesConfiguration management and Kubernetes
Configuration management and KubernetesAlex Chistyakov
 
Python performance engineering in 2017
Python performance engineering in 2017Python performance engineering in 2017
Python performance engineering in 2017Alex Chistyakov
 
My talk at SPb SQA sub-meetup of ITGM
My talk at SPb SQA sub-meetup of ITGMMy talk at SPb SQA sub-meetup of ITGM
My talk at SPb SQA sub-meetup of ITGMAlex Chistyakov
 
My talk on DevOps engineer's adventures in the Windows world at UWDC 2017
My talk on DevOps engineer's adventures in the Windows world at UWDC 2017My talk on DevOps engineer's adventures in the Windows world at UWDC 2017
My talk on DevOps engineer's adventures in the Windows world at UWDC 2017Alex Chistyakov
 
My talk on GitHub open data at ITGM #10
 My talk on GitHub open data at ITGM #10 My talk on GitHub open data at ITGM #10
My talk on GitHub open data at ITGM #10Alex Chistyakov
 
My talk on DevOps :) at Stachka 2017
My talk on DevOps :) at Stachka 2017My talk on DevOps :) at Stachka 2017
My talk on DevOps :) at Stachka 2017Alex Chistyakov
 

More from Alex Chistyakov (20)

My slides from DevOpsDays 2019
My slides from DevOpsDays 2019My slides from DevOpsDays 2019
My slides from DevOpsDays 2019
 
My slides from BMM №3 May 2019
My slides from BMM №3 May 2019My slides from BMM №3 May 2019
My slides from BMM №3 May 2019
 
My slides from DevOps-40 meetup Jun 2019
My slides from DevOps-40 meetup Jun 2019 My slides from DevOps-40 meetup Jun 2019
My slides from DevOps-40 meetup Jun 2019
 
My slides from SECR'2018
My slides from SECR'2018My slides from SECR'2018
My slides from SECR'2018
 
My slides from the first SPb SRE community meetup at DataArt
My slides from the first SPb SRE community meetup at DataArtMy slides from the first SPb SRE community meetup at DataArt
My slides from the first SPb SRE community meetup at DataArt
 
My slides from CC'2019
My slides from CC'2019My slides from CC'2019
My slides from CC'2019
 
My slides from BMM №4 Nov 2019
My slides from BMM №4 Nov 2019My slides from BMM №4 Nov 2019
My slides from BMM №4 Nov 2019
 
My slides from DevOps-40 meetup Oct 2019
My slides from DevOps-40 meetup Oct 2019My slides from DevOps-40 meetup Oct 2019
My slides from DevOps-40 meetup Oct 2019
 
My slides from DevOps-40 meetup Dec 2019
My slides from DevOps-40 meetup Dec 2019My slides from DevOps-40 meetup Dec 2019
My slides from DevOps-40 meetup Dec 2019
 
Configuration management and Kubernetes
Configuration management and KubernetesConfiguration management and Kubernetes
Configuration management and Kubernetes
 
Ansible and other stuff
Ansible and other stuffAnsible and other stuff
Ansible and other stuff
 
Python performance engineering in 2017
Python performance engineering in 2017Python performance engineering in 2017
Python performance engineering in 2017
 
My talk at SPb SQA sub-meetup of ITGM
My talk at SPb SQA sub-meetup of ITGMMy talk at SPb SQA sub-meetup of ITGM
My talk at SPb SQA sub-meetup of ITGM
 
My talk at SECR 2017
My talk at SECR 2017My talk at SECR 2017
My talk at SECR 2017
 
On scaling teams
On scaling teamsOn scaling teams
On scaling teams
 
MariaDB workshop
MariaDB workshopMariaDB workshop
MariaDB workshop
 
Docker for JS people
Docker for JS peopleDocker for JS people
Docker for JS people
 
My talk on DevOps engineer's adventures in the Windows world at UWDC 2017
My talk on DevOps engineer's adventures in the Windows world at UWDC 2017My talk on DevOps engineer's adventures in the Windows world at UWDC 2017
My talk on DevOps engineer's adventures in the Windows world at UWDC 2017
 
My talk on GitHub open data at ITGM #10
 My talk on GitHub open data at ITGM #10 My talk on GitHub open data at ITGM #10
My talk on GitHub open data at ITGM #10
 
My talk on DevOps :) at Stachka 2017
My talk on DevOps :) at Stachka 2017My talk on DevOps :) at Stachka 2017
My talk on DevOps :) at Stachka 2017
 

Опыт эксплуатации большого проекта на Ruby

  • 1. Опыт эксплуатации большого Ruby-проекта Александр Чистяков КупиКупон http://alexclear.livejournal.com
  • 2. Докладчик? • PHP-программист • Администратор баз данных • Эксплуатационщик • Архитектор серверных приложений ^ WTF? • Добрый землянин • Занимает место в профессии
  • 3. Аудитория? • Ruby-программисты • Администраторы баз данных? • Эксплуатационщики? • Архитекторы серверных приложений • Добрые земляне?
  • 4. Цели • Разрушить мифы • Столкнуть с парохода современности • Я никого не хочу победить • «Не едь за мной – ты там не проедешь» (ворона птица сильная и на голову наглухо ушибленная)
  • 5. Disclaimer • Все мертвые проекты мертвы одинаково, все живые проекты живы по-разному • «Кто не умеет работать – учит» – «Кодекс это набор рекомендаций» • Самое важное – верно определить граничные условия – А нужно ли вам именно это? А зачем? – А, может, ну его этот веб и в Тибет?
  • 6. Большой проект • Купонный сервис, входит в top 3 в России • Что он должен уметь технически? – Рассылать много почты – Предоставлять пользователям возможность регистрироваться и покупать – Предоставлять продавцам возможность регистрироваться и управлять акциями – Предоставлять менеджерам возможность создавать аналитические отчеты
  • 7. Моя роль в проекте • Системный администратор • Мне больше нравится слово «эксплуатационщик», но мне его не произнести • В свое время был привлечен для консультаций, да так и прижился
  • 8. Исходное состояние • Проект на LAMP – MySQL 5.0.95 – Drupal • Хостинг: – OpenVZ контейнер большого размера – Доступа к хост-машине нет – Установлена Cpanel • ~20 RPS к бэкенду
  • 9. Проблемы 1 • Необходима новая функциональность, но – См. картинку – По моему опыту, это верно для многих PHP CMS – Тем не менее, стоит вопрос о расширении команды картинка взята с http://habrahabr.ru/post/144857
  • 10. Проблемы 2 • Drupal не справлялся с нагрузкой, так как – MySQL не справлялся с нагрузкой – Apache/PHP не справлялся с нагрузкой • Включение кэша Drupal не спасло – Отвалился геотаргетинг (все незалогиненные видят одно и то же) – Совсем отвалился геотаргетинг (выбор города вручную в меню не помогает)
  • 11. Решение проблем с разработкой • Вне зоны моей ответственности, я занимался только эксплуатацией проекта • Если вкратце, три слова: Ruby on Rails • Если вам интересно мое мнение – Лучше сразу писать проект на RoR, чем сначала написать RoR на PHP/Drupal, а на этом уже – проект – И не забудьте про гемы, их все тоже придется написать на PHP – Переход выглядит более чем оправданным
  • 12. Решение текущих проблем с эксплуатацией 1 • Apache/PHP – Выкинули suPHP - избавились от форков – (Почти) выкинули cPanel (инвазивнейший монстр, протачивающий свои ходы по всей системе) • MySQL – Убрали MyISAM – перестали блокировать базу в момент дампа – Размер буфера, размер бинлога, flush_log_at_trx_commit – см. доклад Андрея Аксенова
  • 13. Решение текущих проблем с эксплуатацией 2 • MySQL – Включили query cache (меньшее зло) – Настроили slow log и mk-log-parser – Построили индексы там, где было необходимо • Платформа – etckeeper (спасал нас впоследствии) – Приведение в порядок cron-файлов и других конфигов – Не имея доступа к хост-машине много не натюнишь
  • 14. Последствия • Кэш Drupal удалось отключить • Нагрузка на машину существенно снизилась • Когда через пару месяцев трафик возрос в два раза, это не вызвало никаких проблем
  • 15. Ruby-версия: платформа • RHEL 5.5 • Ruby 1.8.7 (REE), Rails 3 • PostgreSQL вместо MySQL • (Единственное, на мой взгляд, преимущество PostgreSQL для таких проектов – наличие online alter прямо в поставке) – Это если вы не добавляете столбец с дефолтным значением
  • 16. Ruby-версия: железо • Dell R710, 24 или 48 Gb, SAS-диски • RAID контроллеры с BBU • Production конфигурация: – Один сервер для базы данных – Один сервер для RoR – Сервер для бэкапа – Сервера для отдачи статики, телефонии, разработки – гораздо более скромные параметры
  • 17. Ruby-версия: компоненты • RVM • Unicorn • god для управления Unicorn’ами • Периодические задачи – cron+rake • Обработчики очередей • Resque как сервер очередей • Изначально – god для управления обработчиками
  • 18. Тем временем, PHP-версия • Менеджеры хотят считать статистику – вынос тяжелых запросов на R/O реплику, отдельное приложение (потом для Ruby-версии будет то же самое) • (Кстати, эта реплика постоянно отваливалась) • Трафик продолжает расти • Внезапно, DDoS
  • 19. DDoS 1 • Быстро выделили шаблон и собрали список «плохих» IP (~6000 адресов за первый час) • Доступа к хост-машине нет – ipset установить невозможно • Передали список «плохих» IP хостеру с просьбой сделать блокировку на их оборудовании • Поставили mod_evasive
  • 20. DDoS 2 • С утра передали еще один список ~8000 адресов • Поддержка хостера заблокировала все адреса на нашем же iptables • %$^#! • Арендовали сервер в другом месте, установили на нем ipset, сделали его фронтэндом к старому
  • 21. Это еще не все с PHP-версией • Легитимный трафик со временем все больше • PHP-версия не справляется, разработчики вынуждены опять включить кэш Drupal’а • Не помогает, база время от времени «выносит» диск • Аренда еще одного сервера у того же хостера (сервер стоит дороже, лучше дисковая – выносим базу на него)
  • 22. Запуск Ruby-версии • Запуск поэтапный, по странам • В России больше всего клиентов – ее запускали в последнюю очередь • Процедура запуска: остановка платежей, домиграция пользователей, проксирование сайта со старого места на новое, смена записей в DNS
  • 23. Проблемы 1 • Миграции с первого раза не проходят – не сходятся балансы, приходится править код и перезапускать миграцию • Миграции идут через Resque • Один пользователь – одно сообщение в очереди • Одно сообщение в очереди – один fork() • Fork rate ~80 forks/s
  • 24. Проблемы 2 • Приложение для России запустили в пятницу вечером (thank God), в субботу днем оно начало втыкать • Все это время мы бились за живучесть • Не забыли ли мы о нагрузочном тестировании? • Не забыли, но где-то ошиблись с оценкой
  • 25. Битва за живучесть 1 • Сразу было видно, что проблемы не на базе данных • Выкинули GlusterFS – не помогло • Переехали с KVM-based виртуалки на хост – не помогло • Увеличили количество воркеров – не помогло • Поставка нового сервера – 10 дней
  • 26. Битва за живучесть 2 • А как вообще понять, где втыкает приложение? • Сделать профайлинг? • Ограничение – профайлить надо прямо под нагрузкой • Я PHP-программист  и не имел опыта профайлинга Ruby-проектов под нагрузкой при помощи профайлера для Ruby • Но ясно, что нужно что-то неинвазивное
  • 27. Битва за живучесть 3 • А как бы я профайлил Java-приложение? • Очевидно: сделал бы сэмплинг стектрейсов • А что останавливает в случае Ruby? • Ничего не останавливает: – PMP, http://poormansprofiler.org • При помощи тривиального sh-скрипта gdb превращается в средство записи сэмплов с заданным интервалом • Я писал раз в секунду, 50-600 сэмплов за один запуск скрипта
  • 28. PMP • Что хорошо – RVM собирает Ruby с debug info • Что плохо – стектрейсы приходится анализировать и классифицировать вручную • Сейчас я пытаюсь написать полуавтоматический классификатор, но даже до альфа-версии дело пока не дошло
  • 29. Битва за живучесть - 4 • Сэмплирование показало, что втыкает GC • Попытки настроить GC через переменные окружения провалились • Срочный переход REE 1.8.7 – MRI 1.9.3 • После перехода GC заработал как надо • Тем временем, разработчики приделали фрагментарный кэш • Ура, белый господин разрешил нам немного поспать!
  • 30. А сколько нужно воркеров? • Автор Unicorn рекомендует от 4 до 8 воркеров на ядро • Double facepalm • На самом деле, воркеров нужно столько, чтобы они могли держать нагрузку • Что же такое «держать нагрузку»? • 50-70% сэмплов должны быть «сижу на select(), жду запроса» • - Почему 50-70%? – А почему было 4-8 на ядро?
  • 31. Когда в руках сэмплирующий профайлер • Все вокруг выглядит программным обеспечением • В норме воркеры Unicorn стоят на select() и ждут запрос от апстрима • Не в норме: – На вызовах GC – На записи в лог – На select() внутри EventMachine (вопросы не ко мне) – На обмене с БД
  • 32. Помните, я говорил о рассылке почты? • Рассылкой почты занимается внешний провайдер, но запускает ее rake task • При миграции Ruby с 1.8.7 до 1.9.3 возникли проблемы с производительностью • Сэмплер показал что уперлись в старый добрый GC • В этот раз удалось настроить GC при помощи переменных окружения
  • 33. Что еще было хорошего? • Запрос для построения аналитической таблицы: UPDATE purchases SET user_created_at = us.created_at FROM purchases p INNER JOIN users us ON us.id = p.user_id AND p.user_id >= 2000000 AND p.user_id < 2100000; • Как вы думаете, что он делает? • По уму, ему нужно сделать один full scan и успокоиться • Есть fork bomb и archive bomb, а это – SQL bomb
  • 34. Sinatra • Что занесло ее в проект сейчас не узнать – иных уж нет, а те далече • Может, кому-то не хватало строк в резюме? • Sinatra при ошибке приложения читает модели, для чего переопрашивает БД на предмет структуры базы • Это очень эффективный способ поставить базу на колени
  • 35. Пруф или не было • На графике погода в Сахаре, но можно сделать оценочное суждение о том, что базе плохо • Мы в эту ловушку попадали дважды с большим промежутком, и во второй раз никто уже не помнил суть вопроса
  • 36. Байки из склепа • Однажды мы забыли на продакшне mc с поиском по большому файлу, и он занял 16 гигабайт • Я знал, что этим кончится, поэтому не пользуюсь mc последние лет семь • Кстати, для расследования подобных инцидентов у нас запущен atop
  • 37. Немного про настройку БД • Ежедневные отчеты pgfouine • Если где-то нет индекса, и он может помочь - строим • Настройка конфигурации движка: – А чего хотим? – Включаем log_checkpoints и следим, чтобы причиной выполнения checkpoint’а было истечение таймаута, а не переполнение лога – Таймаут, кстати, поднимаем – А также ставим checkpoint_completion_target поближе к 1 – Много сегментов хорошо для массовой записи и плохо для аварийного рестарта (адаптируйте под ситуацию)
  • 38. Еще немного про настройку БД • Пробовали встроенную в 9.X hot standby репликацию – Все хорошо до того момента, пока данные в реплике не окажутся не такими, как в мастере • Пробовали Slony-I – DDL statements в миграциях нужно оборачивать в вызов команды, что очень неудобно • Вернулись к hot standby, ведем наблюдение
  • 39. И про бэкап БД • Сначала делали pg_dumpall прямо с продакшна – Это быстро закончилось • Потом – pg_dumpall с реплики – Это тоже перестало работать • Теперь WAL archiving при помощи pg_rman • Хотим попробовать Amanda
  • 40. Эволюция деплоймента • Вручную из git • Caplite (не спрашивайте в киосках города, это внутренний набор скриптов) • Capistrano • Я раньше не думал, что приложение на динамическом языке может деплоиться так долго (thank SASS, etc)
  • 41. Эволюция процесса • Креативный хаос (очень быстро, но очень грязно) • Peer reviews • Unit tests • CI: – Bigtuna – <s>Bigtuna</s> Jenkins
  • 42. Управление конфигурацией • Вручную • Chef • Каждому разработчику – свою виртуальную машину – Збс!
  • 43. Мониторинг • NAGIOS • http://host-tracker.com • Airbrake • NewRelic • Smokeping • Мониторинг от хостера (много лишних срабатываний) • В большом проекте всегда кто-нибудь не спит
  • 44. Человеческий фактор 1 • Вам может показаться, что ваши коллеги не умеют работать • Не надо волноваться, так оно и есть • Google, Yandex, Островок, калифорнийские стартапы, …, … - все нанимают лучших • Если все нанимают лучших, кому же достаются худшие? • Кстати, а с чего вы взяли, что умеете работать?
  • 45. Человеческий фактор 2 • Лучшие, худшие, дайте хоть каких-нибудь! • ~15 Skype-собеседований, чтобы найти одного человека в команду эксплуатации • Люди из Yandex, Mail.Ru, Scalaxy… • Наняли того, кто хотя бы умеет пользоваться поисковиком (делайте выводы о качестве остальных) • И не ошиблись в выборе
  • 46. Человеческий фактор 3 • Что мешает простым людям в команде: – Микроменеджмент – Соревнования на пустом месте (поэтому не нанимайте в команду одних только «звезд») – Поиск виноватых в те моменты, когда надо чинить упавшее – Истерики в эти же моменты • К счастью, все эти вопросы можно решить
  • 47. Планы на будущее • Стандартизация, унификация – Больше Chef’а – Консолидация серверов – Больше мониторинга и графиков • Автоматизация – Автоматический failover – Раннее обнаружение отказов, построение трендов • Уменьшение количества SPOF
  • 48. Выводы • Who dares wins • Большой проект это <s>сложно</s> тяжело, но интересно • Ruby on Rails продукт эволюции, а не революции – стандартные практики все те же • Понимание происходящего в системе все так же важно, как и 10 лет назад
  • 50. Спасибо за внимание! • С вами был Александр Чистяков • http://alexclear.livejournal.com • alexclear@gmail.com • http://github.com/alexclear