6. Горизонтальное масштабирование БД
● Разнос таблиц по разным серверам
Для начала можно логически
● Шардирование самих таблиц
Виртуальные шарды
● Делаем реплики уже с шардов
7. БД в огне
● Кэширование
● Предварительное создание кэша
● Негативное кэширование
● Просроченный кэш
● Случайные задержки
● Throttling
Если можно
8. БД в огне
Очень важно, чтобы при плановой
нагрузке всё работало без кэша
17. MC протокол
А иногда и в
$mc->increment("counter$cnt_id[:$sub
cnt_id]#$uid[#$sex$age$status$polit$
section;$city;$region;$country;$sour
ce]")
18. Доступ к движкам по MC
● Группируем движки по задачам
Кластеры
● Несколько инстанций движка на сервер
Куски
● Доступ к группе как к единому целому
19. Доступ к движкам по MC
Я разработчик, я не хочу думать, я хочу
х*к-х*к и в продакшен!
$mc = chooseServer('cluster_name');
$mc->get('fooBar');
Где находится кластер и сколько в нем кусков -
для кода обычно не важно
20. Доступ к движкам по MC
function chooseServer($cluster) {
$map = array(
'cluster1' => array('port' => 11234),
// … ~300 кластеров
);
// list($host, $port) = $map[$cluster];
$mc = new Memcache();
$mc->addServer($host, $port);
return $mc;
}
21. Доступ к движкам по MC
● Подключение к кластерам через прокси
● Выбор кластера по номеру порта прокси
● Выбор куска в кластере на основе запроса
$mc->set("letter4,0,17", $task)
● hash("letter4,0,17")
● "letter4,0,17"
23. ● Набор команд
get, set, delete, …
● Размер ключей
250 байт
● Экранирование бинарных данных
● Избыточность текстового формата
Ограничения MC протокола
24. Свой бинарный формат и протокол
Лучшая публичная документация
https://core.telegram.org/mtproto/serialize
https://core.telegram.org/mtproto/TL
Ближайший аналог - protobuf
https://github.com/google/protobuf
Не путать с msgpack, bson - они schemaless
25. Доступ к движкам по RPC
● Подключение к кластерам через прокси
~340 кластеров
● Выбор кластера по его id из запроса на
уровне прокси
● Выбор куска в кластере на основе запроса
26. Доступ к движкам по RPC
● Расширение набора команд
Любые “хотелки” по запросам, умные прокси
● Мультиплексирование и асинхронщина
● Не нужно по порту на кластер
Вместо сотен проксей хватает десятка
● Шифрование соединения
● Переход от TCP к UDP
28. Разделяй и властвуй #1
● Проблема: сайт тормозит
● Выяснили: выросла нагрузка на
кластер общего кеша
● Кто виноват?
29. Разделяй и властвуй #1
● Проблема: сайт тормозит
● Выяснили: выросла нагрузка на
кластер общего кеша
● Кто виноват?
● А фиг его знает
30. Разделяй и властвуй #1
● Скажем “нет” общим кластерам
● Каждой задаче - свой кластер
● Выросла нагрузка - знаем точно кто
● Кластер упал - не упало остальное *
31. Разделяй и властвуй #2
К чему может привести запрос?
$mc->set("key", $value)
32. Разделяй и властвуй #2
К чему может привести запрос?
$mc->set("key", $value)
Ляжет весь сайт
33. Разделяй и властвуй #2
1. Запрос попадал на один движок
2. Движок не смог, начал тупить/упал
3. Прокси начали получать таймауты
4. Из-за таймаутов копилась очередь
5. Упали прокси
6. Упал сайт
35. Разделяй и властвуй #2
● Не писать такой код :)
● Размазывание highload ключей
● Выполнение запросов с вероятностью
● Повторный запрос в другой кусок *
36. Разделяй и властвуй #3
● Проблема: массовые 50x от kphp
● Выяснили: новый функционал
● Что делать?
37. Разделяй и властвуй #3
● Проблема: массовые 50x от kphp
● Выяснили: новый функционал
● Что делать?
● Все kphp разделяются на группы
(профили, новости, сообщения и т.п.)
Проблема раздела другие разделы не волнует
38. Разделяй и властвуй #3
Фронты с nginx, получая от kphp 5xx
ошибку, делают повторный запрос на
другой upstream.
Число таких попыток лимитировано.
39. И да пребудет с вами Персик
Презентация
https://ater.me/conf/tkconf2016.pdf
Для вопросов после
https://vk.com/ac
2016.10.08