Антон Щербаков, Отказоустойчивость на примере aviasales —...

35

Upload: tanya-denisyuk

Post on 26-Jun-2015

2.814 views

Category:

Technology


5 download

DESCRIPTION

В докладе на примере системы метапоиска aviasales будет рассмотрен переход от монолитной архитектуры RoR приложения к многозвенной системе внутренней разработки на базе tornado/python в целях ослабления зависимостей между подсистемами, упрощения контроля за потоком данных и изоляции потенциальных аварийных ситуаций. Будут рассмотрены побочные эффекты этого перехода, такие как устойчивость к пиковым нагрузкам, упрощение схемы выкатки обновлений и сокращение потребляемых машинных ресурсов.

TRANSCRIPT

Page 1: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи
Page 2: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Принцип работы системы метапоиска

Page 3: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Aviasales cегодня

● 800 000 запросов поиска авиабилетов в сутки● 6 000 000 уникальных пользователей в месяц● 35% от всех авиабилетов, проданных в России

через интернет за 2013 год.

Page 4: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Эволюция системы метапоиска

SEO Landingclient request

Page 5: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Эволюция системы метапоиска

SEO Landingclient request RoR Applicationredirect

Page 6: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Эволюция системы метапоиска

Page 7: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Эволюция системы метапоиска

SEO Landingclient request

Search Clientredirect API

Search Engine

Minimal prices

Statisticqueue

queue

Travel Payoutsclient request

API

Page 8: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Эволюция системы метапоиска

SEO Landingclient request

Search Clientredirect API

Search Engine

Minimal prices

Statisticqueue

queue

Travel Payoutsclient request

API

client request Mobile

API

Notifications

queu

e

Page 9: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Архитектура поискового движка

request requestHAProxy

request request

requestrequest

NODE 1NGINX + PASSENGER

Ruby on Rails

NODE 2NGINX + PASSENGER

Ruby on Rails

...

MYSQLMASTER/SLAVE

REPLICATEDrequest

requestNODE N

NGINX + PASSENGERRuby on Rails

Page 10: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Потребляемые ресурсы

● 8 машин 8 ядер Xeon 2GHz 16 GB RAM.● 40-50 passenger процессов на каждой

машине.

Page 11: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Проблемы данной реализации поискового движка

1. Высокий уровень потребления ресурсов;2. Зависимость от базы данных;3. Сложность управления потоком

выполнения задач;4. Сложность выкатки обновлений.

Page 12: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Проблемы разработки

● Высокий порог вхождения в проект;● Скорость разработки;● Объектно-ориентированный подход при

декомпозиции кода программы.

Page 13: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Конфигурируемость

Набор сайтов-партнеров (гейтов) для опроса определяется в зависимости от:● Геолокации пользователя;● Пунктов вылета и назначения;● Набора пассажиров;● Источника траффика;● Локали пользователя;

А также многих других параметров во всевозможных сочетаниях.Новые агентства добавлются в систему несколько раз в неделю. Правила выбора изменются несколько раз в час.

Page 14: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Новый поисковый движок “Ясень”

Page 15: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Ясень. DSLИспользуем функциональный подход при декомпозиции кода.

Строим систему из независимых компонентов - юнитов, которые:● Имеют один входной аргумент и один выходной аргумент;● Изолированы друг от друга;● Не имеют зависимостей от среды исполнения;● Могут быть легко протестированы.

params_validator

nabortu_gate

ozon_gate

mergeonetwotrip_gate

Page 16: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Ясень. Юниты

Page 17: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Ясень. Юниты

Взаимодействие с юнитом осуществляется по HTTP.Данные и файлы конфигурации закодированы в JSON.Каждый юнит поддерживает API:● Вызов;● Загрузка конфигурации;● Выгрузка конфигурации.

MultiplicationUnit

{"value": 100}

call

{"multiplier": 5} set_config

result

{"value": 500}

Page 18: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Ясень. Цепочки юнитовПоследовательные цепочки юнитов.

● Входной аргумент цепочки подается в первый юнит цепочки;● Если юнит возвращает None, последующие юниты не выполняются, None объявляется

результатом работы цепочки;● Результат работы юнита N передается в юнит N + 1;● Результатом работы цепочки является значение, возвращаемое последним юнитом.

params_validator ozon_gate add_airlines

Page 19: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Ясень. Цепочки юнитовПараллельные цепочки юнитов.

● Входной аргумент цепочки подается во все юниты цепочки;● Результаты работы всех юнитов собираются в массив;● Массив с результатами всех юнитов цепочки является результатом работы цепочки.

ozon_gate

trip_ru_gate

nabortu_gate

Page 20: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Ясень. Цепочки юнитовОтложенные цепочки.

● Выходным аргументом цепочки является входной аргумент цепочки;● Входной аргумент цепочки подается в первый юнит цепочки;● Результат работы юнита N подается на вход юниту N + 1.

save_search_params send_in_rabbitmq

Page 21: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Ясень. Цепочки юнитовПример композитной цепочки

validator merge

ozon_gate

nabortu_gate

sindbad_gate

send_to_queue

Parallel Sequential

Delayed

Page 22: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Ясень. Работа с даннымиТипы данных в системе:● Справочники - часто читаются, редко обновляются;

○ Информация об аэропортах;○ Информация об авиакомпаниях;○ Курсы валют.

● Логи - часто пишутся, редко читаются;○ Информация о поведении пользователей;○ Поиски;○ Переходы на покупку;

● Динамические данные - часто читаются, часто пишутся;○ Ссылки для переходов на страницу покупки;○ Результаты поиска;

Page 23: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Ясень. Работа с даннымиСправочники.● Небольние справочники (< 1mb) храним в памяти каждого рабочего

процесса;● Большие справочники храним в файловой базе данных kyotocabinet.

Файлы базы данных отображаются через mmap в адресное пространство рабочего процесса;

● Информация для справочников хранится в файловой системе. При обновлении файлов inotify уведомляет о необходимости обновить данные в рабочих процессах;

● Между нодами кластера файлы справочников распространяются lsyncd при помощи inotify.

Page 24: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Ясень. Работа с даннымиЛоги.● Рабочие процессы не могут писать данные в глобальное хранилище

непосредственно. В этом случае отказ глобального хранилища приведет к потере данных или повредит работоспособности приложения;

● Рабочие процессы складывают данные в локальное хранилище. Переносом данных в глобальное хранилище занимаются вспомогательные независимые процессы.

Page 25: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Ясень. Работа с даннымиДинамические данные.● Скорость доступа на чтение и запись критичны. Поэтому используем

in memory key-value хранилище;● Данные должны быть доступны со всех нод кластера;● Избыточность для обеспечения отказоустойчивости.

Page 26: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Ясень. Кластерная нода

Local Storage

MYSQL

REDIS REDIS

RabbitMQ

Page 27: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Ясень. Кластерная нодаДетали реализации.● Каждый рабочий процесс - это отдельный Tornado сервер (python 3,

tornado 3.2). Занимает в памяти 60mb;● Одна нода кластера 16 ядер Xeon 2GHz 16 GB RAM обрабатывает до

300 одновременных поисковых запросов;● Local storage - в первых версиях in memory redis. Сейчас kyotocabinet,

все данные на жестком диске.

Page 28: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Ясень. Кластер

Local Storage

MYSQL

REDIS REDIS

RabbitMQ

Local Storage

Page 29: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Ясень. Кластер

● 4 машины 16 ядер Xeon 2GHz 8GB RAM● Запас на случай пиковых нагрузок 40-50% уже в

указанной конфигурации● Потребяет в 4 раза меньше оперативной памяти

Page 30: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Ясень. Аварийные ситуации

Local Storage

REDIS REDIS

Page 31: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Ясень. Аварийные ситуации

Local Storage

MYSQL

REDIS

RabbitMQ

Page 32: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Ясень. Аварийные ситуации

Local Storage

MYSQL

RabbitMQ

Page 33: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Ясень. Аварийные ситуации

Local Storage

MYSQL

REDIS REDIS

RabbitMQ

Page 34: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Выводы1. Реализованная в поисковом движке “Ясень” архитектура лучше подходит для

решаемых задач с точки зрения надежности, потребления ресурсов и конфигурируемости;

2. Данная схема успешно используется в других проектах компании, таких как система аналитики партнерской сети TravelPayouts, движок рекламы мобильного приложения и прочих;

Но, необходимо помнить:1. Данная схема не является универсальной и применима далеко не для всех

задач;2. Отклоняясь от типовых решений и конфигураций, вы остаетесь один на один с

возникающими проблемами;3. Платой за надежность почти всегда служит усложнение инфраструктуры.

Page 35: Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если наши сервера падают, пользователи

Спасибо за внимание