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

Post on 26-Jun-2015

2.814 Views

Category:

Technology

5 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

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

Aviasales cегодня

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

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

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

SEO Landingclient request

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

SEO Landingclient request RoR Applicationredirect

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

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

SEO Landingclient request

Search Clientredirect API

Search Engine

Minimal prices

Statisticqueue

queue

Travel Payoutsclient request

API

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

SEO Landingclient request

Search Clientredirect API

Search Engine

Minimal prices

Statisticqueue

queue

Travel Payoutsclient request

API

client request Mobile

API

Notifications

queu

e

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

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

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

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

машине.

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

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

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

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

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

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

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

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

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

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

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

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

params_validator

nabortu_gate

ozon_gate

mergeonetwotrip_gate

Ясень. Юниты

Ясень. Юниты

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

MultiplicationUnit

{"value": 100}

call

{"multiplier": 5} set_config

result

{"value": 500}

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

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

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

params_validator ozon_gate add_airlines

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

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

ozon_gate

trip_ru_gate

nabortu_gate

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

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

save_search_params send_in_rabbitmq

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

validator merge

ozon_gate

nabortu_gate

sindbad_gate

send_to_queue

Parallel Sequential

Delayed

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Local Storage

MYSQL

REDIS REDIS

RabbitMQ

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

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

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

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

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

Local Storage

MYSQL

REDIS REDIS

RabbitMQ

Local Storage

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

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

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

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

Local Storage

REDIS REDIS

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

Local Storage

MYSQL

REDIS

RabbitMQ

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

Local Storage

MYSQL

RabbitMQ

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

Local Storage

MYSQL

REDIS REDIS

RabbitMQ

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

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

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

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

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

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

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

top related