Top Banner
Распределенные системы в Одноклассниках Олег Анастасьев @m0nstermind [email protected]
58

Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

Feb 10, 2017

Download

Engineering

Ontico
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

Распределенные системы в Одноклассниках

Олег Анастасьев @m0nstermind [email protected]

Page 2: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

1. Абсолютно надежная сеть 2. Мизерная сетевая задержка 3. Практически безлимитная пропускная способность 4. Полностью однородна 5. Изменения топологии сети незаметны 6. Полностью защищена 7. Управляется одним администратором 8. Транспортировка данных почти ничего не стоит

2

В Одноклассниках

Page 3: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

1. Абсолютно надежная сеть 2. Мизерная сетевая задержка 3. Практически безлимитная пропускная способность 4. Полностью однородна 5. Изменение топологии сети незаметны 6. Полностью защищена 7. Управляется одним администратором 8. Транспортировка данных почти ничего не стоит

3

Заблуждения разработчиков распределенных систем

https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing[Peter Deutsch, 1994; James Gosling 1997]

Page 4: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

4

4ЦОД

150типов

сервисов

8000серверов

В Одноклассниках

Page 5: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

5

инженеры

сетевики

админы

разработчики

Page 6: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

6

Страница друзей

1. Получить список друзей

2. Применить фильтр

3. Подавить ЧС

4. Получить профили

5. Отсортировать

6. Получить наклейки

7. Посчитать счетчики

Page 7: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

7

Простой способ

SELECT * FROM friendlist f, users uJOIN ON f.vertexId=u.userId WHERE u.userId=? AND f.kind=?

AND NOT EXISTS( SELECT * FROM blacklist …)…

Page 8: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

• Дружбы

• 12 млрд. связей, 300GB

• 500 000 запросов в сек.

8

Простой способ не работает

• Профили пользователей

• > 350 млн. штук,

• 3 500 000 запросов в сек.

• 50 Gbit

Page 9: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

9

Работает так

web frontend API frontend

app server

one-graph user-cache black-list

(микро) сервисы

Page 10: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

10

Анатомия (микро) сервиса

Ремотный интерфейс

Логика , Кэши

[ Локальное хранилище ]

Внутри 1 Java VM

Page 11: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

11

Анатомия (микро) сервиса

Ремотный интерфейс

https://github.com/odnoklassniki/one-nio

interface GraphService extends RemoteService { @RemoteMethod long[] getFriendsByFilter(@Partition long vertexId, long relationMask);}

interface UserCache { @RemoteMethod User getUserById(long id);}

Page 12: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

12

App Server code

https://github.com/odnoklassniki/one-nio

long []friendsIds = graphService.getFriendsByFilter(userId, mask); List<User> users = new ArrayList<>(friendsIds.length); for (long id : friendsIds) { if(blackList.isAllowed(userId,id)) {

users.add(userCache.getUserById(id)); }

}…

return users;

Page 13: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

• По таким значениям партиционируем

• У сервиса есть стратегия

• long id -> int partitionId(id) -> node1,node2,…

• Стратегии разные

• Cassandra ring, Voldemort partitions

• или…

13

interface GraphService extends RemoteService { @RemoteMethod long[] getFriendsByFilter(@Partition long vertexId, long relationMask);}

Page 14: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

14

Взвешенный квадрат

p = id % 16 p = 0

p = 15

p = 1

N01 N02 N03 . . . 019 020

W =

1

W =

100

N11

node = wrr(p)

SET

Page 15: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

15

Проблема в коде

https://github.com/odnoklassniki/one-nio

long []friendsIds = graphService.getFriendsByFilter(userId, mask); List<User> users = new ArrayList<>(friendsIds.length); for (long id : friendsIds) { if(blackList.isAllowed(userId,id)) {

users.add(userCache.getUserById(id)); }

}…

return users;

Page 16: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

16

Цена сетевого запроса

0.1-0.3 ms

0.7-1.0 ms

Другой ЦОД

* цена сильно зависит от конкретной инфраструктуры и фреймворков.

задержка = 1.0ms * 2 reqs * 200 друзей = 400 ms

10k друзей задержка = 20 seconds

Page 17: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

17

Решение: пакетные запросы

public interface UserCache { @RemoteMethod( split = true ) Collection<User> getUsersByIds(long[] keys);}

long []friendsIds = graphService.getFriendsByFilter(userId, mask);friendsIds = blackList.filterAllowed(userId, friendsIds );List<User> users = userCache.getUsersByIds(friendsIds);

…return users;

Page 18: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

18

split & merge

split ( ids by p ) -> ids0, ids1

p = 0

p = 1

N01 N02 N03 . . .

N11

ids0

ids1

users = merge (users0, users1)

Page 19: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

19

1. Пропажа клиента

2. Пропажа сервера

3. Потеря исходящего сообщения

4. Потеря входящего сообщения

5. Таймаут сервера

6. Неправильный ответ

7. Произвольный отказ

Что может пойти не так ?

Page 20: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

Отказы

Распределенные системы в Одноклассниках

Page 21: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

• Отказы невозможно предотвратить, только скрыть

• Отказ произойдет обязательно.

• Ключ к скрытию отказов — избыточность:

• Информации (коды защиты от ошибок)

• Железа (резервирование, реплики, дублирующие схемы)

• Времени (транзакции, retries)

21

Что делать с отказами ?

Page 22: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

22

Что сервер сделал ?

Сдаваться нельзя , повторить !

Сдаваться , нельзя

повторить !

? ?Добавить друга

Page 23: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

• Со стороны клиента — неизвестно

• Что клиент может сделать ?

• Не давать никаких гарантий

• Никогда не повторять запрос. Максимум 1 раз. At Most Once.

• Всегда повторять запрос. По меньшей мере 1 раз. At Least Once.

23

Был ли друг добавлен ?

Page 24: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

1. Транзакция в ACID хранилище

• есть мастер, успех однозначен (или проходит, или нет)

• возможен атомарный откат

2. Обновление информации в кэшах

• много реплик, мастера нет

• атомарного отката нет: возможны частичные отказы

24

Добавляем друга

Page 25: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

• Операция применима повторно с тем же результатом

• напр: чтение, Set.add(), Math.max(x,y)

• Упорядоченное Атомарное изменение с контролем дубликата

25

Идемпотентность

Только для Идемпотентных операцийможно применять стратегию“всегда повторять попытку”

https://ru.wikipedia.org/wiki/Идемпотентность

Page 26: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

26

Идемпотентность в ACID хранилище

Подружиться

ждем; timeout

Подружиться

Подружились!

Уже друзья ?

Нет, делаем изменения!

Уже друзья ?

Да, ничего не делаем !

Page 27: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

27

Идемпотентность через секвенсинг

Подружиться (ОпИД)

Подружились!

УжеДелали (ОпИд) ?

Нет, делаем изменения!

Выписать ОпИД

Примеры ОпИД:

• OpId+=1

• OpId=currentTimeMillis()

• OpId=TimeUUIDhttp://johannburkard.de/software/uuid/

Page 28: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

1. Транзакция в ACID хранилище

• есть мастер, успех однозначен (или проходит, или нет)

• возможен атомарный откат

2. Обновление информации в кэшах

• много реплик, мастера нет

• атомарного отката нет: возможны частичные отказы

28

Добавляем друга

Page 29: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

29

Нотификация реплик кэшей

add(Friend)

p = 0 N01 N02 N03 . . .

Но без повтора данные реплики рассинхронизируются

Повторять бессмысленно

Page 30: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

• Процесс синхронизации данных

• Непрерывно читает изменения из транзакционного хранилищаSELECT * FROM users WHERE modified > ?

• Применяет их в память кэша

• Загружает изменения при старте ноды

• Повтор — не нужен

30

Синхронизируем кэш через БД

Page 31: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

31

Смерть через таймаут

Подружиться

ждем; timeout

конец

Page 32: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

1. Клиенты перестают обращаться к серверу

После Х непрерывных отказов за последнюю секунду

2. Клиенты мониторят доступность сервера

В фоне, раз в минуту

3. И возвращают его в ротацию

32

Вывод из ротации

Page 33: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

33

Смерть через торможение

Avg = 1.5msMax = 1.5c24 cpu coresCap = 24,000 ops

10,000 ops

Page 34: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

34

Смерть через торможение

Avg = 1.5msMax = 1.5c24 cpu coresCap = 24,000 ops

Cтавить таймаут = 2.4ms ?

Выводить из ротации если среднее > 2.4ms ?

Avg = 24msMax = 1.5c24 cpu coresCap = 1,000 ops

10,000 ops

Page 35: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

35

Спекулятивный повтор

Идемпотентная Оп

wait; timeout

Повторный запрос

Результат операции

Page 36: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

36

Спекулятивный повтор: что лучше

• Задержки 99p, средние

• Стабильность системы

Классы, задержка 99p, наносекунды.без спекулятивного повтора (желтый)

и с ним (красный)

^^^ пики до 1 сек ^^^

Page 37: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

• Идемпотентные операции

• “Дополнительная” нагрузка

• Дополнительный трафик

• Балансируем спекуляцию:

• всегда, >99p, >50p

37

Спекулятивный повтор: применим не всегда

Классы, задержка 99p, наносекунды.без спекулятивного повтора (желтый)

и с ним (красный)

^^^ пики до 1 сек ^^^

Page 38: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

Больше отказов !

Распределенные системы в Одноклассниках

Page 39: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

• Чрезмерная нагрузка

• Чрезмерная паранойя

• Баги

• Люди

• Масштабные аварии

39

Отказ всех реплик сервиса

Page 40: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

40

Использовать другие источники,деградация консистентности

Использовать неполные данные, частичная деградация функции

Отключать функцию полностью

Деградировать!

Page 41: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

41

Код

interface Distributed<D>{

boolean isInconsistency(); D getData();}

class UserCacheStub implements UserCache { Distributed< Collection<User> > getUsersByIds(long[] keys) {

return Distributed.inconsistent(); }

}

interface UserCache { @RemoteMethod Distributed< Collection<User> > getUsersByIds(long[] keys);}

Page 42: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

Тестирование отказов

Распределенные системы в Одноклассниках

Page 43: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

43

Свой продукт

“Стандартные” продукты

“Админские” маневры

Что тестировать ?

— особенно!

Page 44: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

• Что делает:

• Определяет соединения с фронта на сервис

• Отрубает соединения (iptables drop)

• Запускает авто тесты

• Что проверяем

• Что ничего не валится, показываются красивые заглушки

• Сервер стартует

44

Свой продукт: “Горилла”

Page 45: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

• Тестовый стенд с синтетический нагрузкой ?

- Топология сети не неизменна

- Сложно воспроизвести профиль нагрузки

• На продакшене!

• Но чтобы никто не заметил

• Проверяем сценарии отказов и восстановления

45

Как тестировать стандартные решения ?

Page 46: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

46

Зеркало

UserCacheProxy

UserCacheImpl UserCacheNew

primary mirror

1. Вызываем primary

2. В отдельном тред пуле mirror. Сравниваем

3. На основании конфигурации отключаем, переключаем

one-conf

Page 47: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

Диагностика

Распределенные системы в Одноклассниках

Page 48: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

• Быстрое определение существования аварии

• Локализация проблемы

• Своевременное предупреждение аварий

48

Зачем

Page 49: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

• Zabbix, Cacti

• Операционные метрики

• Имена вызванных операций, напр. “Graph.getFriendsByFilter”

• Количество вызовов, успешность

• Длительность вызовов

49

Авария есть или будет ?

Page 50: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

• Оперативную статистику и тренды

• Агрегированное число вызовов и ошибок

• Агрегации задержек

• Среднее, Макс

• Перцентили 50,75,98,99,99.9

50

Что показывают графики

Page 51: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

51

Интересные графики

Page 52: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

52

Интересные графики

Page 53: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

53

Интересные графики

Page 54: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

54

Интересные графики

Page 55: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

55

Интересные графики

Page 56: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

56

Авто поиск аномалий

Page 57: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

• Возможности отказов в распределенных системах безграничны

• Отказы маскируются за счет информации, времени, железа

• При немаскируемых отказах — деградируем !

• Отказы надо тестировать наравне с функционалом

• Отказы нужно диагностировать и предупреждать на проде

57

Краткое содержание предыдущих слайдов

Page 58: Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)

58 Распределенные системы в Одноклассниках

slideshare.net/m0nstermind

https://v.ok.ru/publishing.html

http://www.cs.yale.edu/homes/aspnes/classes/465/notes.pdf

Notes on Theory of Distributed Systems CS 465/565: Spring 2014James Aspnes

Тут можно узнать больше: