Рассказ о том, что творилось с проектами kolesa.kz и krisha.kz в 2011-2012 годах и что происходит сейчас, как мы создавали с нуля API и впоследствии переезжали на него, как на лету меняли хранилища данных, как боролись с нагрузками и воевали за надежность, расскажу о граблях на которые наступили и как их можно было бы избежать.
2. Кто здесь и зачем?
● Никита, один из ведущих разработчиков в «Колёсах»
● В данный момент отвечаю за разработку market.kz, API и
по чуть-чуть за kolesa.kz и krisha.kz
● Знаю много страшных слов и программирую на кучке разных
языков программирования
Расскажу:
● Что было в 2010-2011
● Что есть сейчас
● Что будет завтра
7. Окружение 2010-2012
● PHP 5.2
● MySQL 4.x
● GlusterFS
● 100500 XML-файлов на сетевой файловой системе
● И еще больше фотографий там же
● Поиск через sphinxsearch исключительно в live
Технологии
8. Разработка 2010-2012
● Пилим фичу для колес
● Если все получилось, Ctrl+C / Ctrl+V на крышу с
«небольшими» изменениями
● Вечерами плачем из-за медленной сетевой FS
● Круглые сутки ревем навзрыд из-за отсутствия надежности
● Из-за угла маячат мобильные приложения
Технологии
11. Придумываем API
● API един для всех сайтов
● HTTP — это доступно, просто и легко, даже Tcl из «коробки»
умеет делать HTTP-запросы
● Отдавать все будем в JSON
● Не RESTFul!
● Весь функционал сайта повторять не нужно
● «Драйверы» для хранилищ
API
12. Драйвер? О чем ты?
● Реализует единые интерфейсы для всех сайтов
● Знает, что такое категории, параметры, пользователи и
объявления
● Умеет со всем этим работать (CRUD)
● Реализует специфичные для каждого сайта штуки
● Можно наследовать от других драйверов
API. Драйверы
13. Тот самый первый драйвер
● Пишет и читает данные объявлений из XML-файлов на
GlusterFS
● Сохраняет фотографии в GlusterFS
● Знает что и где лежит в MySQL (комментарии, пользователи,
антиспам, etc)
● Есть «печенька» — поиск по всем объявлениям через Solr
API. Драйверы
16. Учим сайт искать объявления не в
sphinx'е, а через API
API. Переезд
17.
18. Сначала фотографии
● Жесткие диски сыпятся
● Писать свое надежное и реплицируемое файловое
хранилище в blob'ах — затратно (мы пока еще не facebook)
API. Надежность
У нас есть механизм драйверов и мы можем прозрачно для
клиентов делать, что хотим.
И где хранить эту кучу файлов?
20. OpenStack Swift
● Не сетевая ФС
● Хранилище объектов
● Каждый объект реплицируется минимум на 3 ноды в двух
разных датацентрах
● Медленный :(
● Но у нас есть прокси и куча кэшей! :)
API. Надежность
21. А дальше по накатанной:
● Пишем новый драйвер и прозрачно уносим объявления из
XML в MongoDB
● Отдаем API партнерам (Smart TV, виджеты на других сайтах)
● Запускаем мобильные приложения
● Пишем драйвер, который все так же прозрачно
«объединяет» личные кабинеты пользователей на сайтах
● Запускаем market.kz
● Переезжаем на elasticsearch
API. Надежность
22. Софт
● Для кода — PHP 5.4
● Для мета-информации — Percona Server 5.5
● Для объявлений — MongoDB 2.4
● Для фотографий — OpenStack Swift
● Для поиска — Elasticsearch 1.3 и немножко Solr
● Для логов — Graylog2
● Для очередей — beanstalkd
● Для кешей — Redis
● Для анализа производительности — BTP (и клиент к нему)
API. Сегодня
25. Грабли MongoDB
● Работаете из PHP? Сразу запускайте mongos
● Впрочем, когда не из PHP, тоже запускайте
● Не используйте точки в именах полей, иначе можно
попрощаться с версией 2.6
● Не используйте map/reduce или aggregation framework на
серверах в продакшене
● Стабильная работа replicaSet'а в двух датацентрах — миф,
%username%
● Типы данных — это важно
API. Сегодня
26. Грабли OpenStack Swift
● Репликация медленная
● Запись тоже не блещет скоростью, так что проксируем все
через брокер очередей и быстрое хранилище (у нас
beanstalkd+redis)
● Чем меньше нод, тем ниже производительность
API. Сегодня
27. Цифры
● 3 MongoDB и 26M объектов объявлений в них
● 330М объектов фотографий, занимающих 25TB в OSS (75TB
с учетом реплик)
● 85-195 запросов в секунду от мобильных приложений
● 550-1000 запросов в секунду от сайтов
● 82/164 Мбит/сек трафика
● 8 нод эластика на колесах и 1 на маркете, на крыше все еще
Solr
● 20 серверов redis'а для разных кэшей
API. Сегодня
28. Что будет завтра?
На самом деле, никто не знает, но попробуем погадать:
● Повышение надежности (может быть и отказ от MongoDB)
● Гео-рапределенность
● Ускорение кода, переезд на HHVM
● Разработка новых интересных фич
API. Завтра