46
Как устроена MySQL репликация Андрей Аксёнов, Sphinx v.1.1

Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

  • Upload
    ontico

  • View
    640

  • Download
    7

Embed Size (px)

Citation preview

Page 1: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Как устроена MySQL репликация

Андрей Аксёнов, Sphinxv.1.1

Page 2: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Зачем/кому этот доклад?• Уходите, если вы знаете, как это всё устроено и

работает внутри

– Ключевые слова = PSE, binary log, relay log, SBR, RBR, mixed, master, slave, log position, log filters, Tungsten, Galera, GTID, …

• Оставайтесь, если хочется чуток усилить понимание

– Понимание устройства = настройка и починка с открытыми глазами, например

Page 3: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Чего щаз НЕ будет?

Page 4: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Вот такого:• мастер:

[mysqld], log-bin=binlog, server-id=1, остановить запись, SHOW MASTER STATUS

• слейв:[mysqld], server-id=2CHANGE MASTER TO …_HOST/USER/PASS=…, MASTER_LOG_FILE=‘binlog.000001’, MASTER_LOG_POS=1234;START SLAVE;

Page 5: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

I don’t know, but I’ve been told• Ну, т.е. не будет конкретных SQL statements и

прочих code snippets, совсем ;)

• Думаю, таких обучалок полно в интернетах

• Уверен, синтаксис есть в документации

• Я же хочу слегка объяснить, как это работает внутри, что это за master_log_file, _pos и всё такое

Page 6: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Как оно бывает “вообще”?

Page 7: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Что такое т.н. репликация?• Репликация = копирование изменений (changes,

writes, transactions…) между копиями БД

• Бывает разных видов, чем может отличаться?

– Степень синхронизации (sync, async, semisync)

– Количество серверов записи (M/S, M/M)

– Формат изменений (SBR, RBR, mixed)

– Теоретически, модель передачи изменений (push, pull)

• Fun fact, помогает скейлить чтение

Page 8: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Про синхронизацию• Разные гарантии наличия и доступности

• Sync commit = local commit + remote commit

– Новые данные и скопированы и доступны (другим операциям) на N разных серверах

• Async commit = local commit

– Никаких (!) дополнительных гарантий

• Semi-sync commit = local commit + remote receive-ack

– Доступны на 1 сервере, но скопированы уже в N

Page 9: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Про сервера (для) записи• Master-slave, изменения принимает 1 сервер

• Master-master, изменения принимают N серверов

– Внезапно конфликты, “сверка часов”, все эти дела

– При этом не обязан помогать write bandwidth!

• Master-slave + routing, фактически 1 сервер, но для приложения их как бы N

• Читать можно со всех N точек всегда

Page 10: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Про формат изменений• Можно передавать сами запросы

– UPDATE table SET x=123 WHERE id=456

– SBR, statement based replication

• Можно передавать измененные строчки

– {“id”:456, “x”:123} (есс-но в бинарном формате)

– RBR, row based replication

• И так и эдак плохо! Можно смешивать, mixed

Page 11: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Про модель распространения• Push-based = кто чего изменил, тот и рассылает

• Pull-based = кто хочет обновлений, тот их и качает

• Вроде (вроде) push-based в мире СУБД таки даже бывает, но нечасто

Page 12: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Как сделано вMySQL?

Page 13: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Что такое т.н. MySQL?• MySQL = общий логический слой

– сеть, оптимизатор, кеши, бинлог, репликация…

• Конкретный физический слой = т.н. PSE

– Включая сразу встроенные InnoDB, MyISAM и т.п.

– Транзакционные WAL, если есть, живут там

• А вот репликация = именно MySQL

– т.е. не зависит и не требует ничего от движка

– т.е. можно менять движок на лету, например

Page 14: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Что с репликацией-то?• Строго master-slave, pull-based

• 4.1 = async, SBR

• 5.1 = +RBR, +mixed

• 5.6 = +semi-sync, +slave, +GTID

• Говорят, божественный NDB cluster = sync, master-master, 99.(9)% доступность и т.п., но есть нюанс...

Page 15: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Чем занимается master• Принимает запросы-изменения, как обычно

• Фиксирует транзакции, как обычно

• Вдобавок, пишет binary logs (тупо файлы)

• Вдобавок, умеет рассылать их по сетке

• И… всё

Page 16: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Чем занимается slave• Изменения на слейв лучше бы не слать…

– Ну, если вы не хотите всё красиво сломать!!!

• Slave I/O thread качает удаленные binary logs в локальные relay logs

• Slave SQL thread проигрывает relay logs

• Отслеживает позиции “там” и “здесь”, кладет их в master/relay log info

Page 17: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Самурай без меча• INSERT INTO mytest VALUES (123,’hello’)

• Приложение-писатель=> таблица на мастере mysqld=> приложение-читатель

Page 18: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Самурай с мечом• INSERT INTO mytest VALUES (123,’hello’)

• Приложение-писатель=> таблица на мастере mysqld=> binary log на мастере=> relay log на слейве=> таблица на слейве mysqld=> приложение-читатель

Page 19: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Что пишется в binary log?• Зависит от настроек SBR/RBR/mixed

• Представь себя базой данных!!!

• UPDATE users SET x=123 WHERE id=456

– Плюс-минус пофигу

• UPDATE users SET bonus=bonus+100

– Запрос = 32 байта, пользователей = ууу, ааа

– Надо писать текст запроса, SBR, statement based

Page 20: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Что пишется в binary log?• UPDATE users SET disabled=1 WHERE last_login <

UNIX_TIMESTAMP(NOW())-100*86400

– Для краткости надо бы сам запрос, но…

Page 21: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)
Page 22: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Что пишется в binary log?• UPDATE users SET disabled=1 WHERE last_login <

UNIX_TIMESTAMP(NOW())-100*86400

– Время никогда не синхронно!

– Опа, реплика разошлась с мастером!

– Опа, надо бы строчки, а не запрос

– И вот мы изобрели RBR, row based replication

• А ещё бывает uuid(), found_rows(), rand(), разные UDF, триггер на апдейт auto_increment поля, …

Page 23: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Чем хорошо/плохо?• SBR

– Хорошо: меньше данных, как мелкий бонус audit trail

– Плохо: недетерминизм (rand()/now()), перевычисление сложных запросов на всех слейвах

• RBR

– Хорошо: детерминизм, реплицировать можно всё

– Плохо: куча данных в логе, не отличить границы stmt

• Mixed пытается комибинировать хорошее

Page 24: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Random Fun Facts

Page 25: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

В случайном порядке• Мастер многопоточен, а слейв нет

• Состояние слейва => имя и позиция в файле мастера

– Ну, если нету GTID

Page 26: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)
Page 27: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

В случайном порядке• Мастер многопоточен, а слейв нет

• Состояние слейва => имя и позиция в файле мастера

– Ну, если нету GTID

• RBR по умолчанию => полные before/after row image

Page 28: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)
Page 29: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

В случайном порядке• Мастер многопоточен, а слейв нет

• Состояние слейва => имя и позиция в файле мастера

– Ну, если нету GTID

• RBR по умолчанию => полные before/after row image

– Ахеренно для внешних читалок!!!

– Настраиваемо в 5.6, binlog_row_image (но по дефолту full, а не какие-нибудь minimal или noblob)

Page 30: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Как болеет Гондурас?

Page 31: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

В случайном порядке• У слейва протух лог, или слетела позиция, или...

• Слейв разошелся с мастером

• Слейв лагает и не может догнать мастера

• Слейв НЕ лагает, но кто-то жахнул DROP TABLE

• Мастер забил логами весь 10 PB облачный диск

• Мастер забил логами весь 10 Gbps интерфейс

• Мастер сдох и надо уже что-то решать

Page 32: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Что делать-то!• Традиционно не верим дефолтам

• Придется, ну, настраивать

• Лучше сразу, чем потом разбирать фарш

Page 33: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Что делать, если…• У слейва протух лог, или слетела позиция, или...

• Слейв разошелся с мастером

– Смотреть данные, восстанавливать позиции рукой, ооой

– SHOW BINARY LOGS, SHOW BINLOG EVENTS

– Очевидно, эта часть жизни куда проще с GTID

Page 34: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Что делать, если…• Слейв лагает и не может догнать мастера

– Если разово, попереналивать данные, позиции рукой… ;)

– Если хронически, сервер толще

– Или, внезапно, “конкуренция”! Tungsten Replicator – многопоточный, экспорт в другие системы, итп

Page 35: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Что делать, если…• Слейв НЕ лагает, но кто-то жахнул DROP TABLE

– А что, вы думали, реплика == бэкап? Тюю!

– Надо было 5.6 delayed replication или pt-slave-delay

– Теоретически (теоретически), логи “от сотворения мира” можно проиграть до нужной точки (практически на самую нужную таблицу их нет)

Page 36: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Что делать, если…• Мастер забил логами весь 10 PB облачный диск

• Мастер забил логами весь 10 Gbps интерфейс

– Молитва и пост!

– В смысле фильтрация на обоих сторонах

– {binlog|replicate}_{do|ignore}_db

– Внезапно жопа! USE A; UPDATE B.table SET x=1;

– Молитва и пост

Page 37: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Что делать, если…• Мастер сдох и надо уже что-то решать

– Эммм, ну в общем автопилота нету, всё ручками

– Скрипты на bash!!!

• Ужасно хочется master-master!!!

– Обещают отсутствие SPOF, отсутствие slave lag, и т.д.

– Galera, оно же Percona/MariaDB Cluster

– Помни про min latency, conflict resolution итп

Page 38: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Еще фокусы

Page 39: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Что плохо, то и хорошо!!!• Репликация то в MySQL есть…

• …кластерных проверок, автоматизации нету

• Плохо, что выборы мастера и прочее вручную

• Хорошо, что можно вручную же лепить всякое

Page 40: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Фокус 1, master/master/knee• Пусть сервер A будет слейвом для B

• Пусть сервер B будет слейвом для A

• Если всё взорвется, нам не отвечать!!!

• Бонусные очки за длинный circlejerk

– A => B => C => D => … => A

Page 41: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Фокус 2, catch-all slave• Слейв может читать с нескольких мастеров

• Например, тащим часть таблиц под аналитику

• Например, сервер со всеми-всеми бэкапами

• NB, никакой защиты от конфликтов, автопроверок

• 1 таблица, 2 мастера = I enjoy геморрой

Page 42: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Фокус 3, подменяем всякое• Репликация живет на логическом уровне

• Можно интересно чудить!

• innoDB => MyISAM для поиска (true story)

• innoDB => archive для компактного бэкапа

• Креативное изменение схемы через репликацию

• Параноидальный апгрейд версии через репликацию

Page 43: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Итого

Page 44: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

“Итоги подведём, упи** папу..”• Репликация в целом – бывает вот такая

– Типа мы узнали (надеюсь) ряд новых, интересных, длинных и применимых к любой распределенной (!) системе терминов

• Репликация в MySQL – устроена вот так

– Типа мы узнали (надеюсь) чуток подробностей, и теперь не так страшно нырять в это дело

• Типичные беды/фокусы – вот такие

Page 45: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Итого – репликация это несложно*

* Исключая малограмотных и хипстер-программистов.

Page 46: Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)

Вопросы?Для стеснительных:

[email protected]