Slide 1

Slide 1 text

MySQL DevOps: эксплуатация MySQL под высокой нагрузкой Владимир Федорков (ProxySQL), Анастасия Распопина (ProxySQL) DevOps Pro, 20 ноября 2019, Москва

Slide 2

Slide 2 text

• Скучать, сидя в аудитории из вежливости • Мешать другим • Пить чай и кофе • Снисходительно посматривать на докладчиков • Заходить, выходить • Задавать вопросы в любое время Правила поведения DevOpsPro 2019, Москва Proxysql.com

Slide 3

Slide 3 text

О докладчиках DevOpsPro 2019, Москва Proxysql.com • Владимир Федорков • 19+ лет опыта с MySQL. • Вытягиваю проекты из сложных жизненных ситуаций – в высоконагруженных проектах простых не бывает • Специализация - MySQL – Также – ProxySQL и полнотекстовый поиск • Анастасия Распопина • Коммуникации в СУБД- индустрии. • Придумываю интересные доклады (DevRel) • ориентирую экспертов в их морях смыслов • Специализация – мероприятия • В РФ и за рубежом

Slide 4

Slide 4 text

MySQL в контексте DevOps • Один из самых неудобных элементов • Требователен к железу • Плохо переносит виртуализацию • Отвратительно масштабируется –По сравнению с любыми фронтами –Откуда-то куда-то постоянно реплицируется DevOpsPro 2019, Москва Proxysql.com

Slide 5

Slide 5 text

Почему всё так сложно?! • MySQL — это stateful-система • Содержит много «тяжелых» операций • Жестоко заоптимизирован • Всё это требуется для бережного хранения данных DevOpsPro 2019, Москва Proxysql.com

Slide 6

Slide 6 text

Бережное хранение: ACID • A – Atomicity Всё или ничего. Даже если отключат свет. • C – Consistency Данные логически непротиворечивы. Всегда. • I – Isolation Изменения не видны, пока не закончены. • D – Durability Записанное можно гарантированно прочитать. DevOpsPro 2019, Москва Proxysql.com

Slide 7

Slide 7 text

Дополнительные затраты • Сохранение корректного состояния в любой момент времени. Его обеспечивают – блокировки; – мультиверсионность. • Восстановление состояния после отказов – сети; – дисков; – питания. DevOpsPro 2019, Москва Proxysql.com

Slide 8

Slide 8 text

Кому, зачем и где нужен такой тюнинг? DevOpsPro 2019, Москва Proxysql.com

Slide 9

Slide 9 text

Там, где данные критичны • Финансовые приложения • Торговля (магазины и склады) • Учебные заведения • Хранилища документов • … назовите сами) DevOpsPro 2019, Москва Proxysql.com

Slide 10

Slide 10 text

«Что?» Определяем задачи • Эксплуатация: – Железо – Настройки OS – Настройки MySQL • Разработка: – Выбор подсистемы хранения (storage engine) – InnoDB, MyRocks, MyISAM, Etc • Всем вместе: – Запросы DevOpsPro 2019, Москва Proxysql.com

Slide 11

Slide 11 text

«Как?» Работаем с данными • Какие настройки использовать? • Какие индексы делать? • Как проектировать базу? • Как потом её менять? DevOpsPro 2019, Москва Proxysql.com

Slide 12

Slide 12 text

«Где» Вопросы размещения • Глобальный вопрос всего проекта – Масштабирование – Расходы – Перспектива роста • Регион • Платформа – «Чистое» железо – Виртуализация – Облако DevOpsPro 2019, Москва Proxysql.com

Slide 13

Slide 13 text

Нужна ли база данных вообще? • Зависит от того: – Как данные читаются – Как данные записываются – Какие выборки используются – Как данные масштабируются – Насколько данные ценны – Какая нужна скорость доступа – Насколько важна отказоустойчивость – Насколько значима безопасность – Есть ли географическая распределённость DevOpsPro 2019, Москва Proxysql.com

Slide 14

Slide 14 text

Конфигурация MySQL • Конфигурация MySQL – 5% настроек обеспечивают 95% производительности • Что тюнить – Буферы / Память – Тонкие настройки подсистемы хранения (storage engine) – Кэши – Сеть – Репликацию DevOpsPro 2019, Москва Proxysql.com

Slide 15

Slide 15 text

Репликация: важно • Бинлоги – log_bin – log_slave_updates • Настройки реплики – read_only – skip_slave_start DevOpsPro 2019, Москва Proxysql.com

Slide 16

Slide 16 text

Ура, сконфигурили! • Правильные настройки – не мешают работе MySQL – oбеспечивают отказоустойчивость • только на уровне операционной системы! – не обеспечивают производительности. • Допустим, всё работает… DevOpsPro 2019, Москва Proxysql.com

Slide 17

Slide 17 text

Запросы • Обеспечивают 99,99% тормозов – и головную боль админов • Лучший MySQL-запрос – тот, который до MySQL не дошёл! – MySQL не сможет выполнить некоторые запросы быстро! – Просто потому что эта СУБД так спроектирована. DevConf 2017, Москва ASTELLAR.COM

Slide 18

Slide 18 text

А что с ним не так, турецкий? • Ограничение дизайна MySQL – ACID медленный! – Запрос обрабатывается одним ядром. – B-Tree работает только для особых случаев. – Есть полнотекстовые индексы, но они медленные. – Про репликацию можно говорить часами. • Что и делаем на собеседованиях! – Если вышеперечисленное для вас большая проблема, вы используете неправильный инструмент. Вам нужен не MySQL! • Если вы не Facebook! DevOpsPro 2019, Москва Proxysql.com

Slide 19

Slide 19 text

Как написать тормозной запрос? SELECT * FROM table … • WHERE DAY(FROM_UNIXTIME(`ts`)) = 205 • WHERE deleted != 1 • WHERE id NOT IN (1,2,3,…,10) • WHERE url LIKE ‘%чтототам%’ – Не путать с LIKE ‘чтототам%’ ! • ORDER BY RAND() DevOpsPro 2019, Москва Proxysql.com

Slide 20

Slide 20 text

Чем плох full table scan? • Индексы не помогают! – Значение функции считается для всех строк – B-Tree не эффективен • Читать всю таблицу долго! • Пока читаем, вымываем память базы ненужными данными. • Как бороться? – Пересматривать логику запросов. – Использовать предварительно аггрегированные данные вместо расчёта функций «на лету» – Использовать deleted = 0 вместо deleted != 1 DevOpsPro 2019, Москва Proxysql.com

Slide 21

Slide 21 text

Высокоселективные запросы • SELECT * / COUNT(*) FROM users WHERE active=1 – Здравствуй, вся таблица! • Как бороться? – Читаем только то, что показываем • Используем LIMIT – Делаем агрегацию для счётчиков – Кэшируем всё, что можем • Не в MySQL query cache! – Используем внешние инструменты (Mongo, Redis, Sphinx, etc.) DevOpsPro 2019, Москва Proxysql.com

Slide 22

Slide 22 text

Временные таблицы • Плохо – Если попадает на диск – очень плохо! • Если есть поля TEXT или BLOB, на диск таблица попадёт. • Когда создаются – GROUP BY – Подзапросы – DISTINCT + ORDER BY DevOpsPro 2019, Москва Proxysql.com

Slide 23

Slide 23 text

Что делать? • Тюнить буферы временных таблиц – tmp_table_size – max_heap_table_size • Запускать «тяжёлые» запросы на отдельной реплике – Например, для генерации отчетов DevOpsPro 2019, Москва Proxysql.com

Slide 24

Slide 24 text

Если нагрузка большая • Query cache • Thread cache • Table cache • Slow query log • wait_timeout • connection pooling • Репликация и шардинг DevOpsPro 2019, Москва Proxysql.com

Slide 25

Slide 25 text

Важно отслеживать состояние • Смотреть на состояние CPU, IO & RAM • Регулярно собирать все запросы – Не только медленные! – В идеале все 24 часа • Выполнять SQL review для любой новой функциональности – Один запрос может «положить» базу DevOpsPro 2019, Москва Proxysql.com

Slide 26

Slide 26 text

Как понять, что происходит? • PMM для ежедневной работы – Grafana + Анемометр • https://github.com/vlad-github/mysql-health-check – Для снятия моментального профиля нагрузки и текущей конфигурации • Регулярный сбор всех запросов – Блоками по несколько минут, чтобы поймать все кроны • Ходить на мастер-классы, задавать вопросы :) DevOpsPro 2019, Москва Proxysql.com

Slide 27

Slide 27 text

Между Dev и Ops • Коммуникация – это ключ к успеху! • Разработка – должна понимать как работают запросы, а также – тестировать функционал на фактическом объеме данных и – предупреждать о новой функциональности. • Эксплуатация – должна понимать, что меняют, – какой будет нагрузка завтра, – что можно отключить в случае перегруза. • В идеале – вплоть до парного программирования. DevOpsPro 2019, Москва Proxysql.com

Slide 28

Slide 28 text

От сервера кластеру • Один сервер мало, два – плохо. – Репликация медленная • Работает в один поток (исправили в версии 5.6). – Репликация хрупкая (не исправили до сих пор) • Но можно использовать GTID – Доверия репликации – нет • Консистентность данных требует проверок – Даже если видимых сбоев не было – pt-table-checksum + pt-table-sync • Есть варианты – Galera, Group Replication, PXC, etc. DevOpsPro 2019, Москва Proxysql.com

Slide 29

Slide 29 text

Прелести кластера • Если у тебя упал единственный сервер, это трагедия… – А если один из десяти? • Можно использовать реплики для бэкапа. • Можно балансировать нагрузку. DevOpsPro 2019, Москва Proxysql.com

Slide 30

Slide 30 text

Как балансировать нагрузку? • Использовать мастер только для записи – и чтения абсолютно критичных к времени данных. • Распределять запросы по репликам. • Сделать отдельную реплику для «тяжёлых» запросов. • Использовать балансировщики трафика: – ProxySQL, HA Proxy, MySQL Proxy и т.п. DevOpsPro 2019, Москва Proxysql.com

Slide 31

Slide 31 text

Красивая диаграмма О том, как всё могло бы быть

Slide 32

Slide 32 text

Что ещё умеет кластер • Встать колом полностью от вовремя запущенного ALTER TABLE • Эффектно среплицировать команду DROP DATABASE • С разной скоростью выполнять одинаковые запросы на разных нодах DevOpsPro 2019, Москва Proxysql.com

Slide 33

Slide 33 text

Ежедневная рутина • Отказы железа • Баги софта • Надежные бэкапы и восстановление • Мониторинг • Апгрейды и настройка репликации • Настройка сети и безопасности DevOpsPro 2019, Москва Proxysql.com

Slide 34

Slide 34 text

Облака: без админов обойдемся! • На примере Amazon RDS – Relational database service • MySQL, Oracle & MSSQL – MySQL (InnoDB) и Aurora • Что позволяет? – Создавать/удалять ноды и реплики – Выделять реплики из кластера – Автоматизировать развёртывание БД и фронтов • Вплодь до полного скриптования DevOpsPro 2019, Москва Proxysql.com

Slide 35

Slide 35 text

Что это значит для нас? • Полностью автоматизированное развёртывание приложения с использованием RDS и EC2 • Гибкий контроль производительности и стоимости с помощью добавления и удаления машин – В зависимости от времени дня – В зависимости от текущей нагрузки • Изменение параметров кластера «на лету» DevOpsPro 2019, Москва Proxysql.com

Slide 36

Slide 36 text

Что мы можем контролировать? • Выбирать регион для инстанса • Конфигурировать MySQL • Выбирать тип инстанса • Открывать/закрывать доступ по сети • Выбирать параметры дисковой подсистемы DevOpsPro 2019, Москва Proxysql.com

Slide 37

Slide 37 text

Availability zone • В каждом регионе несколько AZ • Можно сделать AZ мастер – Поможет в случае сбоя основного мастера • Репликация может быть сломана DevOpsPro 2019, Москва Proxysql.com

Slide 38

Slide 38 text

Storage • SSD & Magnetic диски – Полностью разные архитектурно и физически • Вы в облаке DevOpsPro 2019, Москва Proxysql.com

Slide 39

Slide 39 text

Настройка MySQL: Parameter groups • Содержит все возможные настройки MySQL • Настройки по умолчанию не оптимальны – Нужно создать свою группу и поменять как надо – Число PG не бесконечно • Некоторые настройки поменять нельзя • Статические и динамические настройки почти как в «родном» MySQL DevOpsPro 2019, Москва Proxysql.com

Slide 40

Slide 40 text

Добро пожаловать в облако! • Железо можеть быть разное – Даже на каждом запуске бенчмарков • IO зависит от сети • Стоят ограничители CPU & IO • Ты не знаешь своих соседей DevOpsPro 2019, Москва Proxysql.com

Slide 41

Slide 41 text

Как жить? • Всегда ориентируемся на худший случай. • Максимально уменьшаем нагрузку на IO. • Агрессивный шардинг – наш друг и верный друг и товарищ! • Внимательно следим за – нагрузкой на CPU/IO и – использованием памяти. – Стараемся вовремя обнаруживать битые реплики. DevOpsPro 2019, Москва Proxysql.com

Slide 42

Slide 42 text

Когда использовать облако? • Когда не очень много данных – или когда вы можете их зашардить… • Когда сложно предугадывать нагрузку. • Когда быстро нужно много ресурсов – или когда ресурсы нужны ненадолго. • RDS, когда не хватает рук для администрирования. DevOpsPro 2019, Москва Proxysql.com

Slide 43

Slide 43 text

Как со всем этим живут гиганты? • Строят свои датацентры и каналы. • Содержат команды инженеров и программистов. • Переделывают MySQL под свои нужды. • Меняются патчами и публикуют их. – Можно их найти и использовать! • Но если вы не Твиттер, не Фейсбук и не Google, переживать вам пока рано! DevOpsPro 2019, Москва Proxysql.com

Slide 44

Slide 44 text

Что дальше? • Анонсы митапов: канал @ru_mysql в Телеграме • Анонсы мастер-классов по MySQL: FB.com/vfedorkov • Посмотреть другие доклады на astellar.com • Прочитать книги: –«MySQL по максимуму» (Бэрон Шварц, Пётр Зайцев, Вадим Ткаченко); –«Отладка производительности MySQL» (Света Смирнова). DevOpsPro 2019, Москва Proxysql.com

Slide 45

Slide 45 text

ВОПРОСЫ! DevOpsPro 2019, Москва Proxysql.com

Slide 46

Slide 46 text

СПАСИБО! DevOpsPro 2019, Москва Proxysql.com