Дмитрий Меньшиков
Aurora Technologies
Топ-10 фейлов на реальном highload
проекте
Gray hat
ACM
CTF, freelance
Senior
Team lead
Chef Technical Officer
Автор журнала ][akep
Как ошибка выбора идентификатора
пользователя, обнаруженная после запуска
проекта, чуть не стоила 2 лет разработки
>= 64 бит на id
Отсутствие пересечений в
разных дата центрах
Получение новых id
без опроса хранилища
Длина 128-bit
v1: date + time + MAC address
v2: random
UUID
Размер индекса для
хранения в БД?
100 000 000
224
» 5.9
Размер индекса для
хранения в БД?
100 000 000
224
» 5.9
… как 3 байта сохранить
Данные перенесли
Вскоре началось…
Пользователей запустили
Размер индекса для
хранения в БД?
100 000 000
224
» 5.9
Размер индекса для
хранения в БД?
100 000 000
224
» 5.9
200
SELECTIVITY
фактически полученное значение
The timestamp is a 60-bit value. For UUID
version 1, this is represented by UTC as a
count of 100-nanosecond intervals since
00:00:00.00, 15 October.
0011011101000110111 0000000001110
0011011101000110111 0000101011000
0011011101000110111 0001110010010
0011011101000110111 0010001111000
0011011101000110111 0011000011100
0011011101000110111 0011011101110
0011011101000110111 0100001110100
Big-endian vs little-endian,
потому секундная
фракция попала в начало
Отсутствие равномерного
распределения из-за
особенностей генерации
Остановка миграции
и отказ от переноса?
???
УВЕЛИЧИТЬ ДЛИНУ ИНДЕКСА
ДО 4 БАЙТ
Как мы боролись с перегруженным
MySQL когда даже включение binlog
убивало сервер
Задача: сделать ALTER без блокировки
Подключить slave
Синхронизировать
Вывести slave
Сделать ALTER
Поменять местами
Сервера были с i/o 85-90%
Затем был включен binlog
Сервера были с i/o 85-90%
Затем был включен binlog
Включение binlog добило их
pt-online-schema-change от PERCONA
*работает только с таблицами с PRIMARY KEY или UNIQUE
INDEX
Нужна альтернатива
требующая меньше ресурсов
pt-online-schema-change от PERCONA
*работает только с таблицами с PRIMARY KEY или UNIQUE
INDEX
OnlineSchemaChange от Facebook
*работает только с таблицами с PRIMARY KEY или UNIQUE
INDEX
*позволяет переливать базы на другой сервер
*отсутствует контроль скорости
Нужна альтернатива
требующая меньше ресурсов
За 4 (бессонных) суток
мной была написана утилита*!
* - без SMS и регистрации, первые 14 дней использования бесплатны, затем за каждый
день взымается абонентская плата в размере $10000 ZWL.
Атомарно создаются триггера на INSERT, UPDATE,
DELETE с записью изменений в delta-таблицы
Атомарно создаются триггера на INSERT, UPDATE,
DELETE с записью изменений в delta-таблицы
Начинается выборка данных, с регулятором
скорости
Атомарно создаются триггера на INSERT, UPDATE,
DELETE с записью изменений в delta-таблицы
Начинается выборка данных, с регулятором
скорости
Импорт на destination сервер дампа
Атомарно создаются триггера на INSERT, UPDATE,
DELETE с записью изменений в delta-таблицы
Начинается выборка данных, с регулятором
скорости
Импорт на destination сервер дампа
Загрузка данных с delta-таблиц
Атомарно создаются триггера на INSERT, UPDATE,
DELETE с записью изменений в delta-таблицы
Начинается выборка данных, с регулятором
скорости
Импорт на destination сервер дампа
Загрузка данных с delta-таблиц
Переключение серверов или свитч баз
Еще 2 недели времени потребовалось дабы
перетасовать базы с серверов на сервера
Почистил таблицы MySQL
под нагрузкой –
получи мертвый сервер
Запросы все поступали,
соединения
устанавливались, очередь
запросов росла
В какой-то момент сервер
перестал отвечать…
Дежурный сделал TRUNCATE
таблицы
TRUNCATE TABLE ставит lock
на операции с table cache и
buffer pool
Выполняет чистку по
pages в buffer pool
TRUNCATE TABLE ставит lock
на операции с table cache и
buffer pool
Выполняет чистку по
pages в buffer pool
Снимает блокировки в
самом конце
TRUNCATE TABLE ставит lock
на операции с table cache и
buffer pool
…В это время приходит DDL операция и
ставится lock на table cache, а затем
попытка установить lock на buffer pool…
… которая будет ожидать завершения
первого TRUNCATE
При этом table cache lock
не снялся!
Следствие:
все запросы в ожидании
Баг описан:
https://bugs.mysql.com/bug.php?id=80060
https://bugs.mysql.com/bug.php?id=56696
Закрыт только в 5.7.18
Замедляться выполнение еще
может из-за включенного adaptive
hash index
Scan по buffer pool для чистки
adaptive hash index может
выполняться долго
https://bugs.mysql.com/bug.php?id=68184
Проблема не наблюдалась на
серверах с небольшим размером
buffer pool
Рекомендация v1: …
Проблема не наблюдалась на
серверах с небольшим размером
buffer pool
Рекомендация v1: не транкейтить
таблицы, партиции, а использовать
DROP PARTITION
Проблема не наблюдалась на
серверах с небольшим размером
buffer pool
Просадка порой
наблюдается и с
DROP PARTITION
Рекомендация v1: не транкейтить
таблицы, партиции,а использовать
DROP PARTITION
Проблема не наблюдалась на
серверах с небольшим размером
buffer pool
Рекомендация v2: использовать
EXCHANGE PARTITION
Релиз одного проекта и влияние
на consul кластер в другом
проекте
сервера в стойке
подключены к стоечному
свитчу
кроссконнекты между
свитчами разных стоек
мир подключен к
маршрутизатору и от него
к свитчам
rsync обновлений с билд
машины
RIP consul
Шейпинг rsync
Перегрузка гипервизоров
???
За решение дам билет
О том как инвалидировался кэш
memcached при
добавлении/удалении сервера в пул
server_id = hash(key) %
num_servers
hash может быть crc32, fnv, md5,
murmur, etc
Стандартный алгоритм в
Memcache и Memcached:
https://www.adayinthelifeof.nl/2011/02/06/memcache-internals/
Consistent
hashing
https://www.adayinthelifeof.nl/2011/02/06/memcache-internals/
Consistent
hashing
https://www.adayinthelifeof.nl/2011/02/06/memcache-internals/
Consistent
hashing
При стандартном потоке
инвалидируется почти все
При consistent hashing
инвалидируется только
1/N, где N – количество
серверов в пуле
Как незнание особенностей работы
GC у redis
обошлось в $50к чистой прибыли
Response time: mean 99th percentile
Response time: mean
Response time: mean 99th percentile
Response time: mean
Response time: upper
Мы знали, что redis
использует 1 CPU core
Но не учли, что этот 1
CPU core использует и
Garbage Collector
А он фризился на
инстансе с сессиями на
2-5 секунд примерно
раз в несколько минут
Мы знали, что redis
использует 1 CPU core
Но не учли, что этот 1
CPU core использует и
Garbage Collector
К моменту обнаружения
поведение существовало
несколько месяцев…
QA не видели, так как
нагрузка была вне
рабочего времени
Как верстальщик поменял
верстку
и уложил продукт на 4 часа
http://photo.com/id/photoId?v=eyJ3aWR0a
CI6MTYwLCJoZWlnaHQiOjE2MH0K
eyJ3aWR0aCI6MTYwLCJoZWlnaH
QiOjE2MH0K
==
base64(‘{"width":160,"height":16
0}’)
А resize динамический!
Ошибка в ядре PHP,
что привела к даунтайму на
несколько часов
Завис SoapServer
партнера
Наши PHP скрипты с
SoapClient обращались
на SoapServer
Но не умирали
по таймауту!
Код выглядел
корректно, таймауты
были:
connection_timeout
default_socket_timeout
Но strace показывал,
что клиент игнорирует
настройки.
Разработчики забыли включить
таймаут для HTTPS
https://bugs.php.net/bug.php?id=48524
Как поправить тест потерять
2 миллиона писем
Архитектура системы
сбора статистики
requests
requests
requests
events
data
Смена состояния системы
при ошибке обработки с
последующим nack
Отсутствие
очередности в
доставке сообщений
Purge очереди
Hard reboot rabbitmq
Включение auto
acknowledgment в коде
Факторы потери/порчи данных:
Как же жить с highload?
Как же жить с highload?
Практически проверять внедряемые решения
Думать как изменение может затронуть систему
Собирать метрики и правильно анализировать их
Инвестировать в знания
https://t.me/noTieinIT
@noTieinIT
https://fb.com/menshikov.life
http://dmenshikov.com
https://t.me/noTieinIT
@noTieinIT
https://fb.com/menshikov.life
http://dmenshikov.com
???

Дмитрий Меньшиков "Топ-10 фейлов на реальном highload проекте"