Как сделать вычислительную инфраструктуру для большого кластера

Содержание

Слайд 2

Введение и Архитектура
Доставка задач/результатов
Отладка и анализ
Обобщение опыта: корректность, надежность, производительность

Введение и Архитектура Доставка задач/результатов Отладка и анализ Обобщение опыта: корректность, надежность, производительность

Слайд 3

О нас

Mirantis делает проекты на заказ:
Высокотехнологичные, иногда долгосрочные, для «топовых» заказчиков

О нас Mirantis делает проекты на заказ: Высокотехнологичные, иногда долгосрочные, для «топовых»
(Cisco, Mentor Graphics, Cadence, GE, …)
В основном – масштабируемые системы, клауды, research

Слайд 4

Что мы строим

Очень тяжелые вычисления (но очень параллельные)
Простой API – задача =

Что мы строим Очень тяжелые вычисления (но очень параллельные) Простой API –
поток подзадач: CreateJob, SubmitTask, OnResult
Много одновременных задач разной важности
Очень разнородные вычисления: От секунд (нужна интерактивность) до дней (но не мешать чужой интерактивности)
Задействовать кластер целиком
Устойчивость к временным падениям компонент (и к перманентным падениям вычислительных узлов)

Слайд 5

Обычно (на суперкомпьютерах) используют:
Это называется «batch scheduler»

Обычно (на суперкомпьютерах) используют: Это называется «batch scheduler»

Слайд 6

Нам не подходит

Они предполагают:
Планировщик ничего не знает про задачу
Просто выделяет ядра
Задачи монолитны
«Мне

Нам не подходит Они предполагают: Планировщик ничего не знает про задачу Просто
надо 100 ядер»
Как появится 100 ядер – запустят
На 99 не запустят
Есть куча сложных правил и квот
Акцент на фичи, а не на эффективность
Без этих предположений можно сделать эффективнее.

Слайд 7

Терминология

Задача = поток задачек

Терминология Задача = поток задачек

Слайд 8

Становятся возможными некоторые трюки для повышения утилизации.
But this margin is too small…

Становятся возможными некоторые трюки для повышения утилизации. But this margin is too small…

Слайд 9

Пример неудачной архитектуры

Очевидно, single bottleneck – не масштабируется
+балансировка нагрузки очень математически нестабильна

Клиент

Пример неудачной архитектуры Очевидно, single bottleneck – не масштабируется +балансировка нагрузки очень
1

Клиент 2

Клиент 3

брокер

Слайд 10

Более удачная архитектура

Планировщик
Слушает команды о запуске-останове задач
Приказывает демонам обслуживать задачи
Трубы (как очереди,

Более удачная архитектура Планировщик Слушает команды о запуске-останове задач Приказывает демонам обслуживать
только шире)
Доставляют задачки и ответики
Вычислительные демоны на узлах
Слушаются планировщика
Тянут из очереди задачки, считают, публикуют ответики

+клиенты

+статистика

+логгирование

+мониторинг

Слайд 11

Пример

Клиент – Планировщику: Создай задачу A, важность 30%
Планировщик (выбирает несколько демонов) –

Пример Клиент – Планировщику: Создай задачу A, важность 30% Планировщик (выбирает несколько
демонам: Ты, ты и ты – бросайте всё и подключайтесь к трубе А.
Клиент бросает задачки в трубу А
Демоны считают, бросают ответики
Клиент собирает ответики, бросает новые задачки и т.п.

Слайд 12

Введение и Архитектура
Доставка задач/результатов
Отладка и анализ
Обобщение опыта: корректность, надежность, производительность

Введение и Архитектура Доставка задач/результатов Отладка и анализ Обобщение опыта: корректность, надежность, производительность

Слайд 13

Трубы

Как очереди
Только шире, быстрее и неупорядоченные
На основе RabbitMQ
Лучший продукт в своем классе (надежная

Трубы Как очереди Только шире, быстрее и неупорядоченные На основе RabbitMQ Лучший
доставка)
Но «из коробки» сам по себе не масштабируется

Слайд 14

Надежная доставка

Цикл жизни демона:
Получить задачку
Посчитать
Отослать ответик
Подтвердить получение задачки
Если помрет, RabbitMQ заметит и

Надежная доставка Цикл жизни демона: Получить задачку Посчитать Отослать ответик Подтвердить получение
перешлет задачку другому.

Слайд 15

Масштабирование

Из коробки RabbitMQ совсем не подходит
Одна очередь плохо тянет 10000 клиентов
Встроенная кластеризация

Масштабирование Из коробки RabbitMQ совсем не подходит Одна очередь плохо тянет 10000
делает не то
От нее вообще лучше отказаться (одни проблемы)
Очевидное решение: несколько очередей + load balancing

Слайд 16

Масштабирование

Голова задачи

(подбираются демонами)

задачки

Голова задачи

ответики

(отсылаются демонами)

Демон выбирает случайного кролика
и всю жизнь работает с

Масштабирование Голова задачи (подбираются демонами) задачки Голова задачи ответики (отсылаются демонами) Демон
ним

Слайд 17

Трудности

Маленький лимит соединений у RabbitMQ под Windows (не потянет 500-1000 машин)
Решено: каждая

Трудности Маленький лимит соединений у RabbitMQ под Windows (не потянет 500-1000 машин)
машина подключается к кому-нибудь одному
Не терять данные при крахах демонов
Решено: подтверждения тасков
Переустанавливать соединение при случайных разрывах связи
Не терять данные при крахах RabbitMQ
RabbitMQ не гарантирует безопасность данных вне транзакции!
Не перегружать RabbitMQ
Иначе начинаются ужасы (тормоза, разрывы связи, крахи)
Поддерживать асинхронные прерывания (немедленное переключение) без потери данных
Самая сложная часть
Переключаться на другой RabbitMQ, если в этом кончились задачки (иначе starvation)

Слайд 18

Сохранность данных при крахах RabbitMQ

Client

RabbitMQ

Disk

fsync

fsync

fsync

0..3

Publish confirmations

Клиент буферизует сообщения, про которые еще не

Сохранность данных при крахах RabbitMQ Client RabbitMQ Disk fsync fsync fsync 0..3
известно, на диске ли они.
При разрыве связи повторить «возможно-утерянные» сообщения.

4..5

6..7

Слайд 19

Не перегружать RabbitMQ

Если слишком яро слать сообщения, RabbitMQ захлебнется (не успевая писать

Не перегружать RabbitMQ Если слишком яро слать сообщения, RabbitMQ захлебнется (не успевая
на диск)
Тормоза, крахи, потеря соединения

Белое – «ждем задачи»
доставка тормозит,
или реконнектимся

Слайд 20

Не перегружать RabbitMQ

Оказывается, отличная метрика загрузки – число/размер неподтвержденных сообщений

4 задачи, 4

Не перегружать RabbitMQ Оказывается, отличная метрика загрузки – число/размер неподтвержденных сообщений 4
разноцветных кролика
Один кролик не поспевает.

Слайд 21

Не перегружать RabbitMQ

Ограничить число сообщений «в полете»
На каждого кролика?
Нет, тогда один медленный

Не перегружать RabbitMQ Ограничить число сообщений «в полете» На каждого кролика? Нет,
будет всех тормозить
А как тогда?
Давать очередное сообщение случайному неперегруженному.

Слайд 22

Около 5000 ядер, 4 RabbitMQ
Нет перегрузок – нет проблем

Около 5000 ядер, 4 RabbitMQ Нет перегрузок – нет проблем

Слайд 23

Поддерживать асинхронные прерывания

Иногда надо всё бросить и заняться другой задачей
Прервать запущенную задачку

Поддерживать асинхронные прерывания Иногда надо всё бросить и заняться другой задачей Прервать
и кинуть обратно в трубу
Или прервать ожидание задачки
Порвать соединения с трубами предыдущей задачи
Убедиться, что все ответики и отклоненные задачки точно сохранены на диск
Об этом мы узнаем из другого потока
Многопоточность – это всегда ад
К счастью, это почти единственное использование многопоточности
Но все равно ад.

Слайд 24

Переключаться между кроликами

Задаче досталось несколько демонов. 3 подключены к rmq1, 1 к

Переключаться между кроликами Задаче досталось несколько демонов. 3 подключены к rmq1, 1
rmq2
Дисбаланс
Голодание
Нет задачек в нашем – переключимся на другой
А если он отвалился?
А если в нем тоже нет?
А если нигде нет? (избегать бури реконнектов)
Нельзя надолго создавать дисбаланс нагрузки на кроликов
Нужно найти того, где есть, как можно быстрее
Решение есть, немножко хитрое, нет времени рассказать ☹

Слайд 25

Как это закодировать

Можно сделать лапшу, делающую все сразу
Реконнекты, подтверждения доставки, переключение, балансировка, асинхронные прерывания…

Как это закодировать Можно сделать лапшу, делающую все сразу Реконнекты, подтверждения доставки, переключение, балансировка, асинхронные прерывания…

Слайд 26

Как не сойти с ума

Разумеется, слои*.
*Паттерны Adapter, Composite etc, они же Combinator

Как не сойти с ума Разумеется, слои*. *Паттерны Adapter, Composite etc, они же Combinator Library
Library

Слайд 27

Слои

API проще некуда:
Отсыльщик:
Отослать
Получить/сбросить список неподтвержденных
Уничтожиться (возможно, асинхронно)
Слушатель:
Достать сейчас (blocking + timeout)
Достать потом

Слои API проще некуда: Отсыльщик: Отослать Получить/сбросить список неподтвержденных Уничтожиться (возможно, асинхронно)
(callback)
Уничтожиться (возможно, асинхронно)

Слайд 28

Слои

«При ошибке переоткрыться»

«При ошибке
попробовать еще раз»

«При ошибке сделать
то-то и то-то»

«Преобразовать

Слои «При ошибке переоткрыться» «При ошибке попробовать еще раз» «При ошибке сделать
тип
сообщения»

«Слушать сразу несколько»

«Балансировать отправку
между несколькими»

«Игнорировать неподтвержденные при закрытии»

Слайд 29

Например

По числу
кроликов

задачки

ответики

Например По числу кроликов задачки ответики

Слайд 30

Введение и Архитектура
Доставка задач/результатов
Отладка и анализ
Обобщение опыта: корректность, надежность, производительность

Введение и Архитектура Доставка задач/результатов Отладка и анализ Обобщение опыта: корректность, надежность, производительность

Слайд 31

Отладка и анализ

Дебаггер – не вариант (только для локальных тестов)
Где и когда

Отладка и анализ Дебаггер – не вариант (только для локальных тестов) Где
произойдет ошибка – заранее неизвестно
Post mortem отладка по логам
And you have to be pretty damn good at it
Это не логи вебсервера, где все реквесты независимы
Несколько взаимодействующих, иногда многопоточных подсистем
Проблемы с корректностью – недетерминированы
Проблемы с производительностью – не локальны
Логов, по нашим меркам, дофига (тысячи важных сообщений в сек.)

Слайд 32

Пара фокусов в рукаве

Мощный логгер
Глобальная ось времени (точнее, чем NTP)
Тянет сотни тысяч

Пара фокусов в рукаве Мощный логгер Глобальная ось времени (точнее, чем NTP)
сообщений в секунду от тысяч клиентов
http://code.google.com/p/greg – опенсорс-версия
Ставим 1шт. на кластер, получаем точную глобальную картину (без мучений со специальным сбором-слиянием логов)
GNU textutils + awk (пока хватает, MapReduce не юзаем)
timeplotters – две специальных рисовалки
http://jkff.info/software/timeplotters/

Слайд 33

Мы рисуем

http://jkff.info/software/timeplotters/

Мы рисуем http://jkff.info/software/timeplotters/

Слайд 34

http://jkff.info/software/timeplotters/

http://jkff.info/software/timeplotters/

Слайд 35

Что для этого нужно?

Очень подробные логи.
Еще об этом – позже.

Что для этого нужно? Очень подробные логи. Еще об этом – позже.

Слайд 36

Введение и Архитектура
Доставка задач/результатов
Отладка и анализ
Обобщение опыта: корректность, надежность, производительность

Введение и Архитектура Доставка задач/результатов Отладка и анализ Обобщение опыта: корректность, надежность, производительность

Слайд 37

Корректность: Главный принцип

Как писать правильный код?

Корректность: Главный принцип Как писать правильный код?

Слайд 38

Корректность: Главный принцип

Код точно неправильный.
Как быть?

Корректность: Главный принцип Код точно неправильный. Как быть?

Слайд 39

Как быть?

Быть скромнее
Дать себе шанс найти ошибку
Минимизировать «ядро корректности»
Минимизировать распространение ошибки
Избегать опасных

Как быть? Быть скромнее Дать себе шанс найти ошибку Минимизировать «ядро корректности»
приемов

Слайд 40

Быть скромнее

Не думать «ничего, отладим»
Это будет стоить вам увеличения времени разработки в

Быть скромнее Не думать «ничего, отладим» Это будет стоить вам увеличения времени
разы
Не лепить все фичи сразу:
Каждый раз приходится разломать и отлаживать по отдельности
Безжалостно уничтожать некритичные фичи
Единственный их эффект – усложнение отладки

Слайд 41

Цитаты в тему

«Write the simplest thing that could possibly work»
Ward Cunningham
«Debugging is

Цитаты в тему «Write the simplest thing that could possibly work» Ward
twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it»
Brian Kernighan

Слайд 42

Дать себе шанс найти ошибку

Максимально подробные логи
Не бывает «слишком много логов»
Не бывает

Дать себе шанс найти ошибку Максимально подробные логи Не бывает «слишком много
«от логгирования код некрасивый»

Слайд 43

Минимизировать «ядро корректности»

Часть, от корректности которой зависит работоспособность системы.
Веб-сервер:
Неправильное вычисление в процессе

Минимизировать «ядро корректности» Часть, от корректности которой зависит работоспособность системы. Веб-сервер: Неправильное
обработки запроса ? неправильный ответ
Дедлок в пуле сокетов ? виснет весь сервер

Слайд 44

Минимизировать распространение ошибки

Расставлять «барьеры»
До барьера – будь что будет
После барьера верны некоторые

Минимизировать распространение ошибки Расставлять «барьеры» До барьера – будь что будет После
свойства
Барьер должен быть очень надежен

Слайд 45

Барьеры

Уничтожение процесса (выполнение действия в отдельном процессе)
Защищает от утечек ресурсов внутри процесса
Периодический

Барьеры Уничтожение процесса (выполнение действия в отдельном процессе) Защищает от утечек ресурсов
перезапуск системы
Защищает от неограниченно долгих зависаний
Закрытие соединения с очередью
В худшем случае (неподтвержденная)задача будет сдублирована
Eventual consistency
negative feedback, периодическая сверка желаемого и действительного

Слайд 46

Избегать опасных приемов

Изменяемое состояние
Многопоточность
Блокирование, синхронизация
Обратная связь
Редко выполняющийся код

Избегать опасных приемов Изменяемое состояние Многопоточность Блокирование, синхронизация Обратная связь Редко выполняющийся код

Слайд 47

Введение и Архитектура
Доставка задач/результатов
Отладка и анализ
Обобщение опыта: корректность, надежность, производительность

Введение и Архитектура Доставка задач/результатов Отладка и анализ Обобщение опыта: корректность, надежность, производительность

Слайд 48

Надежность

Всё перезапускаемо и готово к перезапуску остальных
Asynchronous one-way messaging (противоположность RPC)
Явно формулировать

Надежность Всё перезапускаемо и готово к перезапуску остальных Asynchronous one-way messaging (противоположность
переход ответственности за целостность данных
Все компоненты готовы к дублям и потерям данных
Eventual consistency

Слайд 49

Перезапускаемость

Если она есть:
Можно перезапустить оборзевший процесс
Можно навсегда забыть о редких крахах
Можно перезапускать

Перезапускаемость Если она есть: Можно перезапустить оборзевший процесс Можно навсегда забыть о
процесс периодически и забыть навсегда об утечках и зависаниях
Если ее нет:
Надо вылизывать код, пока не исчезнут самые маловероятные крахи и утечки
Если крах не по вашей вине (ОС, библиотека...) – это все равно ваши проблемы.

Слайд 50

Asynchronous, one-way messaging

Противоположность RPC, прямое следствие из перезапускаемости.
Лучше возложить ответственность за доставку

Asynchronous, one-way messaging Противоположность RPC, прямое следствие из перезапускаемости. Лучше возложить ответственность
сообщений на софт, который хорошо умеет это делать.
Или использовать ненадежный транспорт (UDP).

Слайд 51

Eventual consistency

Стремление к согласованности

Eventual consistency Стремление к согласованности

Слайд 52

Eventual consistency

Client

RabbitMQ

Disk

fsync

fsync

fsync

0..3

Publish confirmations

4..5

6..7

Клиент и кролик постепенно согласуют знание о том, какие данные

Eventual consistency Client RabbitMQ Disk fsync fsync fsync 0..3 Publish confirmations 4..5
надежно сохранены

Слайд 53

Eventual consistency

Master

Slave

Хозяин и раб постепенно согласуют представление о том, чем рабу надо заниматься

«Займись

Eventual consistency Master Slave Хозяин и раб постепенно согласуют представление о том,

«Занимаюсь A»

«Займись B»

«Занимаюсь B»

Слайд 54

Введение и Архитектура
Доставка задач/результатов
Отладка и анализ
Обобщение опыта: корректность, надежность, производительность

Введение и Архитектура Доставка задач/результатов Отладка и анализ Обобщение опыта: корректность, надежность, производительность

Слайд 55

Производительность

Несколько аспектов:
Стабильность под нагрузкой
Пропускная способность
Задержка

Производительность Несколько аспектов: Стабильность под нагрузкой Пропускная способность Задержка

Слайд 56

Главное

Ресурсы конечны

Главное Ресурсы конечны

Слайд 57

Какие ресурсы конечны

Вот что кончалось у нас:
Соединения с RabbitMQ
Erlang-процессы в RabbitMQ
Cинхронные AMQP-операции

Какие ресурсы конечны Вот что кончалось у нас: Соединения с RabbitMQ Erlang-процессы
/ сек. (e.g. queue.declare) с RabbitMQ
Установленные соединения / сек. с RabbitMQ
Установленные соединения / сек. с логгером
Внутренние буферы сообщений в логгере
Место в пуле потоков (медленно разгребался)
Одновременные RPC-вызовы
Место на диске
CPU и диск одной машины, куда погрузили два сервиса сразу
Успешно проходящие UDP-пакеты по нагруженному каналу
Транзакции RabbitMQ в секунду (чего уж там – в минуту)
Терпение при анализе больших логов
Память у инструментов рисования логов
...

Слайд 58

Мораль

Планируйте потребление ресурсов
Особенно таких, потребление которых растет с масштабом
Особенно централизованных
Центральные одноэкземплярные сервисы
Сеть
Учитывайте

Мораль Планируйте потребление ресурсов Особенно таких, потребление которых растет с масштабом Особенно
паттерн загрузки!
Его бывает трудно предсказать
Наивные бенчмарки нерепрезентативны

Слайд 59

Пропускная способность

Избегайте обратной связи
Из-за нее задержка начинает уменьшать пропускную способность
Задержку оптимизировать гораздо

Пропускная способность Избегайте обратной связи Из-за нее задержка начинает уменьшать пропускную способность Задержку оптимизировать гораздо труднее
труднее
Имя файла: Как-сделать-вычислительную-инфраструктуру-для-большого-кластера.pptx
Количество просмотров: 179
Количество скачиваний: 0