Архитектура Справочного API 2ГИС
Сергей Коржнев

2gis.ru

@rnd2gis
2

Справочное API 2ГИС
• Справочник организаций, доступный через REST API
• Возможности
• Поиск организаций, гео-объектов
• Расчет маршрутов проезда транспорта
• Посещаемость
• 16 млн. уникальных посетителей в месяц
• 1600 RPS
3

Три кита
1. Отказоустойчивая архитектура
2. Обновление данных в распределенной системе
3. Ускорение веб-приложения
Отказоустойчивая
архитектура
5

Геораспределенность
6

Отказоустойчивость дата-центра
7

Отказоустойчивость ноды
8
9

Результаты
• Готовы к выведению из строя отдельных компонент архитектуры
• Распределение нагрузки
• Удобное горизонтальное масштабирование
Обновление данных в
распределенной
системе
11

Единый центр управления данных
• Данные готовятся в одном месте
• Затем «разливаются» по всем дата-центрам
• Минусы
• Задержки доставки данных
• Ограничение на ширину канала
• Плюс
• Простота
12

База данных
13

PostgreSQL 9.3
14

Результаты
• Как временное простое решение — отлично работает
• Следите за трафиком
• Будущее за децентрализацией
15

Поисковые индексы
Ускоряем
веб-приложение
17

1. Ускоряем PHP
• Тяжелые вычисления на C++
• Yii-фреймворк
• 4 мс на инициализацию
• ORM для чтения
• Компоненты и Lazy Loading
• fastcgi_finish_request()
• Отвечаем, как можно раньше
• Количество Php-fpm worker'ов
18

2. Кэширование
19

Redis
• В сравнение с Memcache:
• Векторные структуры данных
• Поиск ключей по маске
20

Хеши в Redis
• TTL на всю структуру сразу
• При превышении допустимой памяти грохается весь хеш
21

Поиск ключей по маске
• geo::1::*
• На «слейве»
• На «мастере» — крайне редко и осторожно
22

Shared memory
• Ограниченный набор данных небольшого размера
• PHP APC
23

Результаты
• Увеличивается быстродействие системы
• При этом система может жить без кэша
24

3. Realtime-мониторинг
25

Необходимость мониторинга
• Чем больше компонентов, тем чаще что-нибудь выходит из строя
• Чем раньше проблема обнаружится, тем быстрее мы ее исправим
26

Мониторинг времени работы
методов API
• Измеряем время работы метода
• Отправляем данные по UDP на сервис сбора статистки
• Отслеживаем данных в системе комплексного мониторинга
• Pinba и Zabbix
27

Анализ проблем
производительности
• Расставляем Pinba-таймеры
• Отслеживаем какие именно участки кода медленные
• Триггеры, UI
• Косвенно мониторим PostgreSQL, Redis, поисковые утилиты
• Отслеживаем медленный PHP-код на реальных данных
28

Мониторинг ошибок
• Перехватываем ошибку в PHP
• Отправляем ее на некоторый сервис по UDP
• Триггеры, UI
• Graylog2
29

Результаты
• Не замедляем работу приложения
• Используем Pinba, как показатель работы системы
• Не забываем про другие системные параметры мониторинга
30

Выводы
• Балансировка нагрузки
• между дата-центрами и нодами (LVS)
• внутри ноды (Nginx, PgPool2, TwemProxy)
• Мониторинг системы (Zabbix, Pinba, Graylog2)
• Оптимизация веб-приложения
• Весь хардкор в C++ (Apache Trift)
• Легковесный фреймворк (Yii)
• Отвечаем, как можно раньше
31

Вопросы?
Сергей Коржнев

s.korzhnev@2gis.ru

Cергей Коржнев, 2ГИС