Elasticsearch: рациональный подход к 
созданию собственной системы аналитики 
Вячеслав Никулин, ведущий серверный разработчик, Nekki
Нам нужна аналитика
Поиск готового решения 
● Готово к использованию 
● Технические и функциональные ограничения 
● Высокая цена
РСУБД 
● Знакомый SQL - путь 
● Сложно масштабировать и поддерживать 
● А может нам не нужна РСУБД?
NoSQL 
● Документоориентированность, масштабируемость, отказоустойчивость 
● Огромный спектр технологий 
Hadoop HBase Cassandra MongoDB Redis Riak Kafka Storm RabbitMQ ZeroMQ Spark etc 
● Нет опыта - разработка может занять годы
Elasticsearch
Elasticsearch за 10 секунд 
● Документо-ориентированное хранилище, не требующее описание схемы 
таблиц 
● Распределенное, горизонтально-масштабируемое, отказоустойчивое 
● RESTful API (json поверх http) 
● Мощное поисковый движок 
● Написан на Java, расширяем 
● Активно развивается (> 15 релизов в этом году) 
● Разработан поверх Apache Lucene 
● Открытый исходный код (Apache License 2.0) 
● Много пользователей (StackOverflow, GitHub, TheGuardian, Bloomberg)
Чего в elasticsearch нет 
● Джойны 
● Транзакции 
● Безопасность
Стек ELK 
● Elasticsearch 
● Logstash 
○ Inputs (file, syslog, tcp, rabbitmq, zeromq, redis) 
○ Filters (geoip, grok, ruby) 
○ Outputs (file, elasticsearch, mongodb, zabbix) 
● Kibana 
● Marvel 
● Curator
Терминология 
● Узел - один сервер (один инстанс elasticsearch/jvm) 
● Кластер - множество узлов 
● Документ - базовый юнит информации, который может быть 
индексирован. 
● Индекс - коллекция документов с походими характеристиками 
● Тип - множество документов с одинаковым набором полей 
● Шард - неделимый юнит масштабирования 
● Реплика - копия шарда 
Примерное соотвествие между понятиями РСУБД и Elasticsearch 
● РСУБД ⇒ База данных/Схема⇒ Таблица ⇒ Строка ⇒ Столбец 
● Elasticsearch ⇒ Индекс ⇒ Тип ⇒ Документ ⇒ Поле
Разработка системы аналитики
Ключевые особенности 
● Возможность играть в оффлайне 
● ~1 000 000 DAU
Процессинг логов 
● Генерация и сохранение логов в клиенте 
● Отправка логов на сервер 
● Фильтрация логов, добавление полей в события, сохранение лога на 
диск 
● Централизация логов 
● Импорт логов в Elasticsearch 
● Визуализация данных
Генерация событий в клиенте 
● Эвент - это json-объект 
● Проектирование перечня эвентов и их структуры 
○ Список эвентов 
○ Обязательные параметры эвента 
○ Дополнительные параметры
Отправка логов на сервер 
● Http-запрос на веб-сервер 
● Бэкенд на PHP 
● Прореживание логов 
○ Каждый Nый 
○ Плательщик 
○ High level 
○ Участник A/B теста 
○ Некоторые события нужно принимать от всех юзеров 
○ Стратегии можно комбинировать 
○ Фильтрация читеров
Обработка логов на сервере 
● Фильтрация логов 
● Добавление полей в событие 
● Сохранение логов на диск
Централизация логов 
● Несколько серверов (ios, android etc) с установленным logstash 
● Logstash отслеживает изменения в директории и отсылает новые данные 
на сервер консолидации логов 
● Logstash на центральном сервере принимает данные и отправляет их в 
elasticsearch
Маппинг данных 
● Иногда необходим явный маппинг 
○ Nested объекты 
○ Timestamp в виде long 
○ Специфичный настройки индексирования 
● Задается шаблоном в файле или с помощью REST API
Разбиение по индексам 
● User-based индексы 
● Timestamp-based индексы 
○ /logs-2014-09-01/purchase, /logs-2014-09-02/fight_end 
○ Удалять лучше индекс целиком
О чем не стоит забывать 
● Mapping explosion 
○ Неправильно: {"1": 1} {"2": 4} {"3": 9} {"4": 16} {"5": 25} 
○ Правильно: {"key": 1, "value": 1} {"key": 2, "value": 4} 
● Длинные GC паузы 
● Много вложенных агрегаций 
● Проблема зиллиона шардов 
○ Индекс одного документа приведет к OOM
Визуализация данных 
● Kibana 
● Marvel 
● Своя админка
Продакшн
Наша аналитика 
● Сложные гд-отчеты 
● Статистика крашей 
● Аналитика А/B тестов
Цифры 
● Один сервер 
500 ГБ SSD, 4x-ядерный E3-1270 3.50GHz, 32 GB RAM 
● 50 rps индексирования, в пике было 10к 
● в день 3М событий, 1ГБ в elasticsearch 
● 1-2% cpu load 
● всего 100M документов 
● Поиск < 100 мс
Команда, поддержка 
● Сейчас занято 1.5 человека 
● Запустили в продакшн за 2 месяца силами 2.5 человек 
● Геймдизайнеры осваивают инструмент и сами пишут запросы 
● Большие планы на будущее: больше гд-отчетов, статистика пуш 
уведомлений, внедрение в другие проекты компании
Вопросы?

кри 2014 elastic search рациональный подход к созданию собственной системы аналитики

  • 1.
    Elasticsearch: рациональный подходк созданию собственной системы аналитики Вячеслав Никулин, ведущий серверный разработчик, Nekki
  • 2.
  • 3.
    Поиск готового решения ● Готово к использованию ● Технические и функциональные ограничения ● Высокая цена
  • 4.
    РСУБД ● ЗнакомыйSQL - путь ● Сложно масштабировать и поддерживать ● А может нам не нужна РСУБД?
  • 5.
    NoSQL ● Документоориентированность,масштабируемость, отказоустойчивость ● Огромный спектр технологий Hadoop HBase Cassandra MongoDB Redis Riak Kafka Storm RabbitMQ ZeroMQ Spark etc ● Нет опыта - разработка может занять годы
  • 6.
  • 7.
    Elasticsearch за 10секунд ● Документо-ориентированное хранилище, не требующее описание схемы таблиц ● Распределенное, горизонтально-масштабируемое, отказоустойчивое ● RESTful API (json поверх http) ● Мощное поисковый движок ● Написан на Java, расширяем ● Активно развивается (> 15 релизов в этом году) ● Разработан поверх Apache Lucene ● Открытый исходный код (Apache License 2.0) ● Много пользователей (StackOverflow, GitHub, TheGuardian, Bloomberg)
  • 8.
    Чего в elasticsearchнет ● Джойны ● Транзакции ● Безопасность
  • 9.
    Стек ELK ●Elasticsearch ● Logstash ○ Inputs (file, syslog, tcp, rabbitmq, zeromq, redis) ○ Filters (geoip, grok, ruby) ○ Outputs (file, elasticsearch, mongodb, zabbix) ● Kibana ● Marvel ● Curator
  • 10.
    Терминология ● Узел- один сервер (один инстанс elasticsearch/jvm) ● Кластер - множество узлов ● Документ - базовый юнит информации, который может быть индексирован. ● Индекс - коллекция документов с походими характеристиками ● Тип - множество документов с одинаковым набором полей ● Шард - неделимый юнит масштабирования ● Реплика - копия шарда Примерное соотвествие между понятиями РСУБД и Elasticsearch ● РСУБД ⇒ База данных/Схема⇒ Таблица ⇒ Строка ⇒ Столбец ● Elasticsearch ⇒ Индекс ⇒ Тип ⇒ Документ ⇒ Поле
  • 11.
  • 12.
    Ключевые особенности ●Возможность играть в оффлайне ● ~1 000 000 DAU
  • 13.
    Процессинг логов ●Генерация и сохранение логов в клиенте ● Отправка логов на сервер ● Фильтрация логов, добавление полей в события, сохранение лога на диск ● Централизация логов ● Импорт логов в Elasticsearch ● Визуализация данных
  • 14.
    Генерация событий вклиенте ● Эвент - это json-объект ● Проектирование перечня эвентов и их структуры ○ Список эвентов ○ Обязательные параметры эвента ○ Дополнительные параметры
  • 15.
    Отправка логов насервер ● Http-запрос на веб-сервер ● Бэкенд на PHP ● Прореживание логов ○ Каждый Nый ○ Плательщик ○ High level ○ Участник A/B теста ○ Некоторые события нужно принимать от всех юзеров ○ Стратегии можно комбинировать ○ Фильтрация читеров
  • 16.
    Обработка логов насервере ● Фильтрация логов ● Добавление полей в событие ● Сохранение логов на диск
  • 17.
    Централизация логов ●Несколько серверов (ios, android etc) с установленным logstash ● Logstash отслеживает изменения в директории и отсылает новые данные на сервер консолидации логов ● Logstash на центральном сервере принимает данные и отправляет их в elasticsearch
  • 18.
    Маппинг данных ●Иногда необходим явный маппинг ○ Nested объекты ○ Timestamp в виде long ○ Специфичный настройки индексирования ● Задается шаблоном в файле или с помощью REST API
  • 19.
    Разбиение по индексам ● User-based индексы ● Timestamp-based индексы ○ /logs-2014-09-01/purchase, /logs-2014-09-02/fight_end ○ Удалять лучше индекс целиком
  • 20.
    О чем нестоит забывать ● Mapping explosion ○ Неправильно: {"1": 1} {"2": 4} {"3": 9} {"4": 16} {"5": 25} ○ Правильно: {"key": 1, "value": 1} {"key": 2, "value": 4} ● Длинные GC паузы ● Много вложенных агрегаций ● Проблема зиллиона шардов ○ Индекс одного документа приведет к OOM
  • 21.
    Визуализация данных ●Kibana ● Marvel ● Своя админка
  • 22.
  • 23.
    Наша аналитика ●Сложные гд-отчеты ● Статистика крашей ● Аналитика А/B тестов
  • 24.
    Цифры ● Одинсервер 500 ГБ SSD, 4x-ядерный E3-1270 3.50GHz, 32 GB RAM ● 50 rps индексирования, в пике было 10к ● в день 3М событий, 1ГБ в elasticsearch ● 1-2% cpu load ● всего 100M документов ● Поиск < 100 мс
  • 25.
    Команда, поддержка ●Сейчас занято 1.5 человека ● Запустили в продакшн за 2 месяца силами 2.5 человек ● Геймдизайнеры осваивают инструмент и сами пишут запросы ● Большие планы на будущее: больше гд-отчетов, статистика пуш уведомлений, внедрение в другие проекты компании
  • 26.