Эффективная
отладка репликации
MySQL
Света Смирнова
8 ноября 2016
∙
Инженер тех. поддержки MySQL
∙ Автор
∙ MySQL Troubleshooting
∙ JSON UDF функции
∙ FILTER clause для MySQL
∙ Докладчик
∙ Percona Live, OOW, Fosdem,
DevConf, ...
Света Смирнова
2
∙Особенности репликации MySQL
∙Проблемы мастера
∙Проблемы Slave IO thread
∙Проблемы Slave SQL thread
∙Многопоточный слейв
∙Multi-master
Содержание
3
Особенности репликации
MySQL
Мастер Слейв
<- Инициирует
Асинхронная
5
Мастер Слейв
<- Инициирует
<- Запрашивает пакет
Асинхронная
5
Мастер
Отправляет пакет ->
Слейв
<- Инициирует
<- Запрашивает пакет
Асинхронная
5
Мастер
Отправляет пакет ->
Слейв
<- Инициирует
<- Запрашивает пакет
... ?
Асинхронная
5
Мастер Слейв
<- Инициирует
Полусинхронная (Semisynchrous plugin)
6
Мастер Слейв
<- Инициирует
<- Запрашивает пакет
Полусинхронная (Semisynchrous plugin)
6
Мастер
Отправляет пакет ->
Слейв
<- Инициирует
<- Запрашивает пакет
Полусинхронная (Semisynchrous plugin)
6
Мастер
Отправляет пакет ->
Ждёт "Ack"
Слейв
<- Инициирует
<- Запрашивает пакет
Полусинхронная (Semisynchrous plugin)
6
Мастер
Отправляет пакет ->
Ждёт "Ack"
Слейв
<- Инициирует
<- Запрашивает пакет
<- Отправляет "Ack"
Полусинхронная (Semisynchrous plugin)
6
Мастер
Получает изменение
Табличный движок
Логическая
7
Мастер
Получает изменение
Передаёт движку ->
Табличный движок
Логическая
7
Мастер
Получает изменение
Передаёт движку ->
Табличный движок
Пишет в таблицу
Логическая
7
Мастер
Получает изменение
Передаёт движку ->
Табличный движок
Пишет в таблицу
<- Передаёт управление
Логическая
7
Мастер
Получает изменение
Передаёт движку ->
Пишет в binary log
Табличный движок
Пишет в таблицу
<- Передаёт управление
Логическая
7
Мастер
Получает изменение
Передаёт движку ->
Пишет в binary log
Синхронизируется ->
Табличный движок
Пишет в таблицу
<- Передаёт управление
<- Синхронизируется
Логическая
7
IO thread
Читает с мастера
SQL thread
Два типа потоков
8
IO thread
Читает с мастера
Сохраняет в relay log
SQL thread
Два типа потоков
8
IO thread
Читает с мастера
Сохраняет в relay log
SQL thread
<- Читает из relay log
Два типа потоков
8
IO thread
Читает с мастера
Сохраняет в relay log
SQL thread
<- Читает из relay log
Исполняет
Два типа потоков
8
∙ В 5.6+ SQL thread-ов может быть много
Несколько SQL-потоков
9
∙ В 5.6+ SQL thread-ов может быть много
∙ С точки зрения отладки
∙ IO thread один
Несколько SQL-потоков
9
∙ В 5.6+ SQL thread-ов может быть много
∙ С точки зрения отладки
∙ IO thread один
∙ Relay log один
Несколько SQL-потоков
9
∙ В 5.6+ SQL thread-ов может быть много
∙ С точки зрения отладки
∙ IO thread один
∙ Relay log один
∙
Может отставать от мастера
Несколько SQL-потоков
9
∙ В 5.6+ SQL thread-ов может быть много
∙ С точки зрения отладки
∙ IO thread один
∙ Relay log один
∙
Может отставать от мастера
∙ Ошибка одного потока останавливает все
Несколько SQL-потоков
9
∙ В 5.7+ может быть несколько мастеров
Несколько мастеров (Multi-channel)
10
∙ В 5.7+ может быть несколько мастеров
∙ С точки зрения отладки
∙
Несколько наборов relay log
Несколько мастеров (Multi-channel)
10
∙ В 5.7+ может быть несколько мастеров
∙ С точки зрения отладки
∙
Несколько наборов relay log
∙ Несколько IO thread-ов
Несколько мастеров (Multi-channel)
10
∙ В 5.7+ может быть несколько мастеров
∙ С точки зрения отладки
∙
Несколько наборов relay log
∙ Несколько IO thread-ов
∙ Несколько SQL thread-ов
Несколько мастеров (Multi-channel)
10
∙ В 5.7+ может быть несколько мастеров
∙ С точки зрения отладки
∙
Несколько наборов relay log
∙ Несколько IO thread-ов
∙ Несколько SQL thread-ов
∙ slave_parallel_workers для каждого канала
Несколько мастеров (Multi-channel)
10
∙ В 5.7+ может быть несколько мастеров
∙ С точки зрения отладки
∙
Несколько наборов relay log
∙ Несколько IO thread-ов
∙ Несколько SQL thread-ов
∙ slave_parallel_workers для каждого канала
∙
Каналы независимые
Несколько мастеров (Multi-channel)
10
∙ В 5.7+ может быть несколько мастеров
∙ С точки зрения отладки
∙
Несколько наборов relay log
∙ Несколько IO thread-ов
∙ Несколько SQL thread-ов
∙ slave_parallel_workers для каждого канала
∙
Каналы независимые
∙ Ошибка на одном остановит только его
Несколько мастеров (Multi-channel)
10
∙ В 5.7+ может быть несколько мастеров
∙ С точки зрения отладки
∙
Несколько наборов relay log
∙ Несколько IO thread-ов
∙ Несколько SQL thread-ов
∙ slave_parallel_workers для каждого канала
∙
Каналы независимые
∙ Ошибка на одном остановит только его
∙ Одноимённые объекты могут вызвать
конфликты
Несколько мастеров (Multi-channel)
10
∙ Необходимо указать
∙
Название master’s binary log file
∙ Позицию
Позиционная
11
∙ Необходимо указать
∙
Название master’s binary log file
∙ Позицию
∙ С точки зрения отладки
∙
Событие выполняется по указателю позиции
Позиционная
11
∙ Необходимо указать
∙
Название master’s binary log file
∙ Позицию
∙ С точки зрения отладки
∙
Событие выполняется по указателю позиции
∙ Легко пропустить
Позиционная
11
∙ Необходимо указать
∙
Название master’s binary log file
∙ Позицию
∙ С точки зрения отладки
∙
Событие выполняется по указателю позиции
∙ Легко пропустить
∙ Легко переместить указатель в прошлое
Позиционная
11
∙ Необходимо указать
∙
Название master’s binary log file
∙ Позицию
∙ С точки зрения отладки
∙
Событие выполняется по указателю позиции
∙ Легко пропустить
∙ Легко переместить указатель в прошлое
∙ Нет проверок
Позиционная
11
∙ Каждая транзакция получает номер: GTID
Глобальные идентификаторы транзакций (GTID)
12
∙ Каждая транзакция получает номер: GTID
∙ AUTO_POSITION=1
Глобальные идентификаторы транзакций (GTID)
12
∙ Каждая транзакция получает номер: GTID
∙ AUTO_POSITION=1
∙ Не нужно указывать binary log и позицию
Глобальные идентификаторы транзакций (GTID)
12
Клиент Binary log
Statement-Based Binary Log Format
13
Клиент
INSERT INTO ... ->
Binary log
Statement-Based Binary Log Format
13
Клиент
INSERT INTO ... ->
Binary log
SET TIMESTAMP...
Statement-Based Binary Log Format
13
Клиент
INSERT INTO ... ->
Binary log
SET TIMESTAMP...
SET sql_mode...
Statement-Based Binary Log Format
13
Клиент
INSERT INTO ... ->
Binary log
SET TIMESTAMP...
SET sql_mode...
INSERT INTO ...
Statement-Based Binary Log Format
13
Клиент Binary log
Row-Based Binary Log Format
14
Клиент
UPDATE ... ->
Binary log
Row-Based Binary Log Format
14
Клиент
UPDATE ... ->
Binary log
SET TIMESTAMP...
Row-Based Binary Log Format
14
Клиент
UPDATE ... ->
Binary log
SET TIMESTAMP...
SET sql_mode...
Row-Based Binary Log Format
14
Клиент
UPDATE ... ->
Binary log
SET TIMESTAMP...
SET sql_mode...
Строка до изменений
Row-Based Binary Log Format
14
Клиент
UPDATE ... ->
Binary log
SET TIMESTAMP...
SET sql_mode...
Строка до изменений
Строка с изменениями
Row-Based Binary Log Format
14
∙ Лог ошибок
Основные инструменты
15
∙ Лог ошибок
∙ На слейве
∙ SHOW SLAVE STATUS
∙
Таблицы в Performance Schema
∙ Системная база mysql
Основные инструменты
15
∙ Лог ошибок
∙ На слейве
∙ На мастере
∙ SHOW MASTER STATUS
∙
SHOW BINLOG EVENTS
∙
mysqlbinlog
Основные инструменты
15
∙ Лог ошибок
∙ На слейве
∙ На мастере
∙
Percona Toolkit
Основные инструменты
15
∙ Лог ошибок
∙ На слейве
∙ На мастере
∙
Percona Toolkit
∙
MySQL Utilities
Основные инструменты
15
∙
Всегда доступна, требует настройки
∙
Асинхронная
∙
Мастер
∙ Хранит все изменения в binary log
Два формата: ROW и STATEMENT
∙ Слейв
∙
IO thread реплицирует с мастера в relay log
∙ SQL thread исполняет обновления
Несколько SQL thread-ов в 5.6+
Несколько каналов (мастеров) в 5.7+
∙ GTID в 5.6+
Особенности репликации: итоги
16
Проблемы мастера
∙
Более активная запись
∙
binlog_row_image =
FULL | MINIMAL | NOBLOB
Производительность
18
∙
Более активная запись
∙
binlog_row_image =
FULL | MINIMAL | NOBLOB
∙ binlog_cache_size
Наблюдайте Binlog_cache_disk_use
Производительность
18
∙
Более активная запись
∙
binlog_row_image =
FULL | MINIMAL | NOBLOB
∙ binlog_cache_size
Наблюдайте Binlog_cache_disk_use
∙ binlog_stmt_cache_size
Наблюдайте Binlog_stmt_cache_disk_use
Производительность
18
∙
Более активная запись
∙
Синхронизация
∙ binlog_sync
∙
Не изменяйте!
Производительность
18
∙ Время жизни binary log
∙ expire_log_days
Поведение
19
∙ Время жизни binary log
∙ Синхронизация
∙ SBR несовместима с READ COMMITTED и
READ UNCOMMITTED
Поведение
19
∙ Время жизни binary log
∙ Синхронизация
∙ Порядок записи в binary log
∙ Non-deterministic события и SBR
Поведение
19
Проблемы Slave IO thread
∙ SHOW SLAVE STATUS
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes
...
Last_IO_Errno: 1045
Last_IO_Error: error connecting to master ’root@127.0.0.1:13000’ -
retry-time: 60 retries: 1
Last_SQL_Errno: 0
Last_SQL_Error:
...
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp: 160824 03:18:36
Last_SQL_Error_Timestamp:
Сеть
21
∙ SHOW SLAVE STATUS
∙ P_S.replication_connection_status
mysql> select * from performance_schema.replication_connection_statusG
*************************** 1. row ***************************
CHANNEL_NAME:
GROUP_NAME:
SOURCE_UUID:
THREAD_ID: NULL
SERVICE_STATE: CONNECTING
COUNT_RECEIVED_HEARTBEATS: 0
LAST_HEARTBEAT_TIMESTAMP: 0000-00-00 00:00:00
RECEIVED_TRANSACTION_SET:
LAST_ERROR_NUMBER: 1045
LAST_ERROR_MESSAGE: error connecting to master ’root@127.0.0.1:13000’ -
retry-time: 60 retries: 4
LAST_ERROR_TIMESTAMP: 2016-08-24 03:21:36
1 row in set (0,01 sec)
Сеть
21
∙ SHOW SLAVE STATUS
∙ P_S.replication_connection_status
∙ Error log
2016-08-24T00:18:36.077384Z 3 [ERROR] Slave I/O for channel ”: error connecting to
master ’root@127.0.0.1:13000’ - retry-time: 60 retries: 1, Error_code: 1045
2016-08-24T00:19:36.299011Z 3 [ERROR] Slave I/O for channel ”: error connecting to
master ’root@127.0.0.1:13000’ - retry-time: 60 retries: 2, Error_code: 1045
2016-08-24T00:20:36.485315Z 3 [ERROR] Slave I/O for channel ”: error connecting to
master ’root@127.0.0.1:13000’ - retry-time: 60 retries: 3, Error_code: 1045
2016-08-24T00:21:36.677915Z 3 [ERROR] Slave I/O for channel ”: error connecting to
master ’root@127.0.0.1:13000’ - retry-time: 60 retries: 4, Error_code: 1045
2016-08-24T00:22:36.872066Z 3 [ERROR] Slave I/O for channel ”: error connecting to
master ’root@127.0.0.1:13000’ - retry-time: 60 retries: 5, Error_code: 1045
Сеть
21
∙ SHOW SLAVE STATUS
∙ P_S.replication_connection_status
∙ Error log
∙
Доступ
$ perror 1045
MySQL error code 1045 (ER_ACCESS_DENIED_ERROR): Access denied for user ’%-.48s’@’%-.64s’
(using password: %s)
Сеть
21
∙ SHOW SLAVE STATUS
∙ P_S.replication_connection_status
∙ Error log
∙
Доступ
∙ MySQL клиент и логин-пароль слейва
$ mysql -h127.0.0.1 -P13000 -uroot -pbar
Warning: Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user ’root’@’localhost’ (using password: YES)
Сеть
21
∙ SHOW SLAVE STATUS
∙ P_S.replication_connection_status
∙ Error log
∙
Доступ
∙ MySQL клиент и логин-пароль слейва
SHOW GRANTS
mysql> SHOW GRANTS;
+----------------------------------+
| Grants for foo@% |
+----------------------------------+
| GRANT SELECT ON *.* TO ’foo’@’%’ |
+----------------------------------+
Сеть
21
∙ SHOW SLAVE STATUS
∙ P_S.replication_connection_status
∙ Error log
∙
Доступ
∙ MySQL клиент и логин-пароль слейва
SHOW GRANTS
∙
Исправьте привилегии на мастере
∙ Перезапустите репликацию
Сеть
21
∙ Обычные методы отладки
∙ Проверьте с клиентом командной строки
∙ См. также Troubleshooting hardware resource
usage webinar
Производительность
22
Проблемы Slave SQL thread
∙ Один мастер-один слейв
∙ Разные данные
Слейв не может выполнить event из relay log
∙ Разные ошибки на мастере и слейве
∙
Слейв сильно отстаёт от мастера
SQL thread: типичные проблемы
24
∙ Один мастер-один слейв
∙ Разные данные
Слейв не может выполнить event из relay log
∙ Разные ошибки на мастере и слейве
∙
Слейв сильно отстаёт от мастера
∙ Круговая репликация и другая запись в
дополнение к SQL thread
∙ Разные данные
SQL thread: типичные проблемы
24
∙ Таблица менялась вне репликации?
∙ Как?
∙
Конфликт с обновлениями на мастере?
Разные данные
25
∙ Таблица менялась вне репликации?
∙ Идентична ли структура таблиц?
∙ Percona Toolkit
pt-table-checksum, pt-table-sync
∙ MySQL Utilities
mysqlrplsync, mysqldbcompare, mysqldiff
Разные данные
25
∙ Таблица менялась вне репликации?
∙ Идентична ли структура таблиц?
∙ Обновления в неправильном порядке?
∙ mysqlbinlog
∙
Логика приложения на мастере
Разные данные
25
∙ Только при использовании SBR
Обновления в неправильном порядке
26
∙ Только при использовании SBR
∙ Блокировки на уровне строк
Обновления в неправильном порядке
26
∙ Только при использовании SBR
∙ Блокировки на уровне строк
∙ Триггеры
∙ SET GLOBAL slave_skip_counter – No GTIDs!
∙
Пропустите транзакцию – GTIDs
∙
Синхронизируйте таблицы!
Обновления в неправильном порядке
26
∙ Только при использовании SBR
∙ Блокировки на уровне строк
∙ Триггеры
∙
Разные опции: для олдфагов
∙ Запустите слейв с опциями мастера
∙ Перезапустите SQL thread
∙
Исправлено в последних версиях
Обновления в неправильном порядке
26
∙
Потоки
∙ Мастер выполняет обновления в несколько
потоков
∙
Слейв использует один
Слейв отстаёт от мастера
27
∙
Потоки
∙
Seconds_behind_master увеличивается –
Нельзя однозначно полагаться!
Слейв отстаёт от мастера
27
∙
Потоки
∙
Seconds_behind_master увеличивается –
Нельзя однозначно полагаться!
∙ Настройте производительность слейва
∙ Multi-threaded слейв
Один поток на одну базу в 5.6
Могут возникнуть проблемы параллельного выполнения между потоками слейва
Слейв отстаёт от мастера
27
∙
Потоки
∙
Seconds_behind_master увеличивается –
Нельзя однозначно полагаться!
∙ Настройте производительность слейва
∙ Multi-threaded слейв
Один поток на одну базу в 5.6
Могут возникнуть проблемы параллельного выполнения между потоками слейва
∙ Индексы на слейве
Имеет смысл только для SBR
Слейв отстаёт от мастера
27
Многопоточный слейв
∙ Единственный relay log
∙
Скорость в высококонкурентной среде может
быть меньше, чем у мастера
Производительность
29
∙ Единственный relay log
∙
Скорость в высококонкурентной среде может
быть меньше, чем у мастера
∙ slave_parallel_workers
Производительность
29
∙ Единственный relay log
∙
Скорость в высококонкурентной среде может
быть меньше, чем у мастера
∙ slave_parallel_workers
∙ slave_parallel_type=DATABASE |
LOGICAL_CLOCK
Производительность
29
∙
Те же методы, что и для однопоточного
Неправильное поведение
30
∙
Те же методы, что и для однопоточного
∙
Ошибка одного thread-а останавливает все
mysql> select WORKER_ID, SERVICE_STATE, LAST_SEEN_TRANSACTION, LAST_ERROR_NUMBER,
-> LAST_ERROR_MESSAGE from performance_schema.replication_applier_status_by_workerG
*************************** 1. row ***************************
WORKER_ID: 1
SERVICE_STATE: OFF
LAST_SEEN_TRANSACTION: d318bc17-66dc-11e6-a471-30b5c2208a0f:4988
LAST_ERROR_NUMBER: 0
LAST_ERROR_MESSAGE:
*************************** 2. row ***************************
WORKER_ID: 3
SERVICE_STATE: OFF
LAST_SEEN_TRANSACTION: d318bc17-66dc-11e6-a471-30b5c2208a0f:4986
LAST_ERROR_NUMBER: 1032
LAST_ERROR_MESSAGE: Worker 2 failed executing transaction...
Неправильное поведение
30
Multi-master
∙ Репликация должна быть настроена для
каждого канала
Особенности
32
∙ Репликация должна быть настроена для
каждого канала
∙
Можно одновременно использовать мастера
с GTID и без
Особенности
32
∙ Репликация должна быть настроена для
каждого канала
∙
Можно одновременно использовать мастера
с GTID и без
∙ Те же проблемы и решения, что и в случае
обычной репликации
Особенности
32
∙ Репликация должна быть настроена для
каждого канала
∙
Можно одновременно использовать мастера
с GTID и без
∙ Те же проблемы и решения, что и в случае
обычной репликации
∙ Фильтры применяются одновременно для
всех каналов
Особенности
32
Итоги
∙ Проблемы мастера
∙ Те же, что и для обычного сервера
∙
Больше пишет и проверяет
Итоги
34
∙ Проблемы мастера
∙ Slave IO thread
∙ Обычные проблемы с сетью
∙
mysql command line client для тестов
Итоги
34
∙ Проблемы мастера
∙ Slave IO thread
∙ Slave SQL thread
∙ Обычные проблемы при выполнении запросов
∙
Обычные проблемы движка
∙
Меньше потоков выполнения, чем на мастере
Итоги
34
∙
Basic Techniques – troubleshooting webinar
∙
Troubleshooting hardware resource usage
webinar
∙ Introduction into storage engine
troubleshooting webinar
∙ Percona Toolkit
∙ MySQL Utilities
∙
Книга MySQL High Availability
∙
MySQL Replication Team blog
Больше информации
35
???
Место для ваших вопросов
36
http://www.slideshare.net/SvetaSmirnova
https://twitter.com/svetsmirnova
https://github.com/svetasmirnova
Спасибо!
37
Приложение
Особенности репликации подробно
∙ Актуальны ли данные?
∙ Одинаковы ли
∙
Структура таблиц
∙ Движок
∙ Данные
∙
Любая запись может сломать репликацию
Асинхронная: вопросы на слейве
40
∙ Запись на мастере медленнее асинхронной
репликации
Полусинхронная: с точки зрения отладки
41
∙ Запись на мастере медленнее асинхронной
репликации
∙
Сколько "Ack"-ов ждёт мастер?
Полусинхронная: с точки зрения отладки
41
∙ Запись на мастере медленнее асинхронной
репликации
∙
Сколько "Ack"-ов ждёт мастер?
∙ До версии 5.7: от одного слейва
Полусинхронная: с точки зрения отладки
41
∙ Запись на мастере медленнее асинхронной
репликации
∙
Сколько "Ack"-ов ждёт мастер?
∙ До версии 5.7: от одного слейва
∙ Сейчас:
rpl_semi_sync_master_wait_for_slave_count
Полусинхронная: с точки зрения отладки
41
∙ Запись на мастере медленнее асинхронной
репликации
∙
Сколько "Ack"-ов ждёт мастер?
∙ До версии 5.7: от одного слейва
∙ Сейчас:
rpl_semi_sync_master_wait_for_slave_count
∙ Остальных ждать не будет
Полусинхронная: с точки зрения отладки
41
∙ Запись на мастере медленнее асинхронной
репликации
∙
Сколько "Ack"-ов ждёт мастер?
∙
Что значит "Ack"?
Полусинхронная: с точки зрения отладки
41
∙ Запись на мастере медленнее асинхронной
репликации
∙
Сколько "Ack"-ов ждёт мастер?
∙
Что значит "Ack"?
∙ Событие записано в relay log
Полусинхронная: с точки зрения отладки
41
∙ Запись на мастере медленнее асинхронной
репликации
∙
Сколько "Ack"-ов ждёт мастер?
∙
Что значит "Ack"?
∙ Событие записано в relay log
∙ Неизвестно, выполнено ли оно
Полусинхронная: с точки зрения отладки
41
∙ Запись на мастере медленнее асинхронной
репликации
∙
Сколько "Ack"-ов ждёт мастер?
∙
Что значит "Ack"?
∙ Что происходит при timeout-е?
Полусинхронная: с точки зрения отладки
41
∙ Запись на мастере медленнее асинхронной
репликации
∙
Сколько "Ack"-ов ждёт мастер?
∙
Что значит "Ack"?
∙ Что происходит при timeout-е?
∙ Репликация становится асинхронной
Полусинхронная: с точки зрения отладки
41
∙
Каждое изменение записывается дважды:
Файлы движка:
логи, данные, ...
Бинарный лог
Логическая: с точки зрения отладки
42
∙
Каждое изменение записывается дважды:
Файлы движка:
логи, данные, ...
Бинарный лог
∙
Можно параллельно писать на слейве
Логическая: с точки зрения отладки
42
∙ Не существует в MySQL!
Для сравнения: физическая репликация
43
∙ Не существует в MySQL!
∙ Есть две закрытые реализации
Для сравнения: физическая репликация
43
∙ Не существует в MySQL!
∙ Мастер пишет только в файлы движка
Для сравнения: физическая репликация
43
∙ Не существует в MySQL!
∙ Мастер пишет только в файлы движка
∙ Которые реплицируются на слейв
Для сравнения: физическая репликация
43
∙ Не существует в MySQL!
∙ Мастер пишет только в файлы движка
∙ Которые реплицируются на слейв
∙ С точки зрения отладки
∙
IO: изменения записываются единожды
∙ Нельзя параллельно писать на слейве
∙ Любое несоответствие данных приводит к
поломке
Для сравнения: физическая репликация
43
∙
Передача данных
∙
Выполнение
∙ Разные
∙ Диагностика
∙ Исправление
Два типа потоков – два вида проблем
44
∙ Гарантия, что транзакция не будет
выполнена дважды
GTID: с точки зрения отладки
45
∙ Гарантия, что транзакция не будет
выполнена дважды
∙
Простой failover
GTID: с точки зрения отладки
45
∙ Гарантия, что транзакция не будет
выполнена дважды
∙
Простой failover
∙ Пропустить одну транзакцию непросто
GTID: с точки зрения отладки
45
∙ Гарантия, что транзакция не будет
выполнена дважды
∙
Простой failover
∙ Пропустить одну транзакцию непросто
∙
Используйте mysqlslavetrx
GTID: с точки зрения отладки
45
∙ Гарантия, что транзакция не будет
выполнена дважды
∙
Простой failover
∙ Пропустить одну транзакцию непросто
∙
Используйте mysqlslavetrx
∙ Осторожнее с настройкой expire_logs_days!
GTID: с точки зрения отладки
45
∙ Statement-based (SBR)
∙ Запросы записываются в оригинальном виде
Форматы Binary log
46
∙ Statement-based (SBR)
∙ Запросы записываются в оригинальном виде
∙
Риск несовпадения данных (non-safe)
INSERT IGNORE
LIMIT без ORDER BY
Non-deterministic функции
...
Форматы Binary log
46
∙ Statement-based (SBR)
∙ Row-based (RBR)
∙ Обычно пишется больше данных
IO
Скорость передачи
binlog_row_image
Форматы Binary log
46
∙ Statement-based (SBR)
∙ Row-based (RBR)
∙ Обычно пишется больше данных
IO
Скорость передачи
binlog_row_image
∙ Ухудшение производительности для таблиц
без первичного (уникального) ключа
Форматы Binary log
46
∙ Statement-based (SBR)
∙ Row-based (RBR)
∙ Смешанная (Mixed)
∙
Преимущества обоих форматов
Форматы Binary log
46
Основные инструменты в примерах
∙ Информация о старте слейва
Лог ошибок
48
∙ Информация о старте слейва
∙ Ошибки
2016-08-23T12:11:21.867440Z 4 [ERROR] Slave SQL for channel ’master-1’: Could not execute
Update_rows event on table m2.t1; Can’t find record in ’t1’, Error_code: 1032; handler error
HA_ERR_END_OF_FILE; the event’s master log master-bin.000001, end_log_pos 1213, Error_code: 1032
2016-08-23T12:11:21.867471Z 4 [Warning] Slave: Can’t find record in ’t1’ Error_code: 1032
2016-08-23T12:11:21.867484Z 4 [ERROR] Error running query, slave SQL thread aborted.
Fix the problem, and restart the slave SQL thread with "SLAVE START".
We stopped at log ’master-bin.000001’ position 989
Лог ошибок
48
∙ Информация о старте слейва
∙ Ошибки
∙ Остановка слейва
Лог ошибок
48
Вся информация о слейве
∙
Конфигурация IO thread
∙ Конфигурация SQL thread
∙ Статус IO thread
∙ Статус SQL thread
∙ Ошибки
Только последняя
Все есть в логе ошибок
SHOW SLAVE STATUS
49
mysql> show slave status G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 127.0.0.1
...
Master_Log_File: master-bin.000002
Read_Master_Log_Pos: 63810611
Relay_Log_File: slave-relay-bin-master@002d1.000004
Relay_Log_Pos: 1156
Relay_Master_Log_File: master-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: No
...
Replicate_Wild_Ignore_Table:
Last_Errno: 1032
Last_Error: Could not execute Update_rows event on table m2.t1; Can’t find
record in ’t1’, Error_code: 1032; handler error HA_ERR_END_OF_FILE;
the event’s master log master-bin.000001, end_log_pos 1213
Skip_Counter: 0
...
SHOW SLAVE STATUS
49
∙ Не нужно парсить вывод SHOW
Таблицы в Performance Schema
50
∙ Не нужно парсить вывод SHOW
∙ Конфигурация
∙
replication_connection_configuration
∙ replication_applier_configuration
∙ mysql> select * from replication_connection_configuration
-> join replication_applier_configuration using(channel_name);
Таблицы в Performance Schema
50
∙ Не нужно парсить вывод SHOW
∙ Конфигурация
∙ Статус IO thread
∙ replication_connection_status
Таблицы в Performance Schema
50
∙ Не нужно парсить вывод SHOW
∙ Конфигурация
∙ Статус IO thread
∙ Статус SQL thread
∙
replication_applier_status
∙ replication_applier_status_by_coordinator - MTS!
mysql> select * from replication_applier_status join
-> replication_applier_status_by_coordinator
-> using(channel_name);
Таблицы в Performance Schema
50
∙ Не нужно парсить вывод SHOW
∙ Конфигурация
∙ Статус IO thread
∙ Статус SQL thread
∙
replication_applier_status
∙ replication_applier_status_by_worker
mysql> select * from replication_applier_status join
-> replication_applier_status_by_worker
-> using(channel_name);
Таблицы в Performance Schema
50
∙ Master Info
mysql> select * from slave_master_infoG
*************************** 1. row ***************************
Number_of_lines: 25
Master_log_name: mysqld-bin.000001
Master_log_pos: 154
Host: 127.0.0.1
User_name: root
User_password: secret
Port: 13000
Connect_retry: 60
Enabled_ssl: 0
...
Uuid: 31ed7c8f-74ea-11e6-8de8-30b5c2208a0f
Retry_count: 86400
...
Enabled_auto_position: 1
...
Системная база mysql: только на слейве
51
∙ Master Info
∙ Relay log info
mysql> select * from slave_relay_log_infoG
*************************** 1. row ***************************
Number_of_lines: 7
Relay_log_name: ./slave-relay-bin-master@002d1.000004
Relay_log_pos: 1156
Master_log_name: master-bin.000001
Master_log_pos: 989
Sql_delay: 0
Number_of_workers: 0
Id: 1
Channel_name: master-1
Системная база mysql: только на слейве
51
∙ Master Info
∙ Relay log info
∙ Worker info: multi-threaded slave
mysql> select * from slave_worker_infoG
*************************** 1. row ***************************
Id: 1
...
*************************** 8. row ***************************
Id: 8
Relay_log_name: ./Thinkie-relay-bin.000004
Relay_log_pos: 1216
Master_log_name: mysqld-bin.000001
Master_log_pos: 1342
Checkpoint_relay_log_name: ./Thinkie-relay-bin.000004
Checkpoint_relay_log_pos: 963
Checkpoint_master_log_name: mysqld-bin.000001
Системная база mysql: только на слейве
51
mysql> show master statusG
*************************** 1. row ***************************
File: master-bin.000005
Position: 154
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0,00 sec)
SHOW MASTER STATUS
52
mysql> show binlog events in ’master-bin.000001’ from 989;
+-------------------+------+----------------+-----------+-------------+--------------------------------
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info
+-------------------+------+----------------+-----------+-------------+--------------------------------
| master-bin.000001 | 989 | Anonymous_Gtid | 1 | 1054 | SET @@SESSION.GTID_NEXT= ...
| master-bin.000001 | 1054 | Query | 1 | 1124 | BEGIN
| master-bin.000001 | 1124 | Table_map | 1 | 1167 | table_id: 109 (m2.t1)
| master-bin.000001 | 1167 | Update_rows | 1 | 1213 | table_id: 109 flags: STMT_END_F
| master-bin.000001 | 1213 | Xid | 1 | 1244 | COMMIT /* xid=64 */
+-------------------+------+----------------+-----------+-------------+--------------------------------
5 rows in set (0,00 sec)
SHOW BINLOG EVENTS
53
$ mysqlbinlog var/mysqld.1/data/master-bin.000001 –start-position=989 –stop-position=1213
...
# at 1167
#160822 14:15:11 server id 1 end_log_pos 1213 CRC32 0x1f346c6b
Update_rows: table id 109 flags: STMT_END_F
BINLOG ’
v966VxMBAAAAKwAAAI8EAAAAAG0AAAAAAAEAAm0yAAJ0MQABAwABY2HOoQ==
v966Vx8BAAAALgAAAL0EAAAAAG0AAAAAAAEAAgAB///+BQAAAP4GAAAAa2w0Hw==
’/*!*/;
ROLLBACK /* added by mysqlbinlog */ /*!*/;
SET @@SESSION.GTID_NEXT= ’AUTOMATIC’ /* added by mysqlbinlog */ /*!*/;
...
mysqlbinlog
54
$ mysqlbinlog -v var/mysqld.1/data/master-bin.000001 –start-position=989 –stop-position=1213
...
# at 1167
#160822 14:15:11 server id 1 end_log_pos 1213 CRC32 0x1f346c6b
Update_rows: table id 109 flags: STMT_END_F
BINLOG ’
v966VxMBAAAAKwAAAI8EAAAAAG0AAAAAAAEAAm0yAAJ0MQABAwABY2HOoQ==
v966Vx8BAAAALgAAAL0EAAAAAG0AAAAAAAEAAgAB///+BQAAAP4GAAAAa2w0Hw==
’/*!*/;
### UPDATE ‘m2‘.‘t1‘
### WHERE
### @1=5
### SET
### @1=6
ROLLBACK /* added by mysqlbinlog */ /*!*/;
SET @@SESSION.GTID_NEXT= ’AUTOMATIC’ /* added by mysqlbinlog */ /*!*/;
...
mysqlbinlog
55
∙ Percona Toolkit
∙ pt-table-checksum
Проверяет соответствие данных
Тулкиты
56
∙ Percona Toolkit
∙ pt-table-checksum
Проверяет соответствие данных
∙ pt-table-sync
Исправляет несоответствия в данных
Тулкиты
56
∙ Percona Toolkit
∙ pt-table-checksum
Проверяет соответствие данных
∙ pt-table-sync
Исправляет несоответствия в данных
∙ pt-slave-find
Показывает топологию
Тулкиты
56
∙ MySQL Utilities
∙ mysqlrplcheck
Проверяет, можно ли запустить репликацию
Тулкиты
56
∙ MySQL Utilities
∙ mysqlrplcheck
Проверяет, можно ли запустить репликацию
∙ mysqlrplshow
Показывает топологию
Тулкиты
56
∙ MySQL Utilities
∙ mysqlrplcheck
Проверяет, можно ли запустить репликацию
∙ mysqlrplshow
Показывает топологию
∙ mysqlrplsync
Проверяет соответствие данных
Тулкиты
56
∙ MySQL Utilities
∙ mysqlrplcheck
Проверяет, можно ли запустить репликацию
∙ mysqlrplshow
Показывает топологию
∙ mysqlrplsync
Проверяет соответствие данных
∙ mysqlslavetrx
Пропускает 1-N транзакций
Тулкиты
56
∙ MySQL Utilities
∙
mysqldbcompare
Сравнивает две базы данных
Тулкиты
56
∙ MySQL Utilities
∙
mysqldbcompare
Сравнивает две базы данных
∙
mysqldiff
Сравнивает определения объектов
Тулкиты
56
∙ MySQL Utilities
∙
mysqldbcompare
Сравнивает две базы данных
∙
mysqldiff
Сравнивает определения объектов
∙
mysqlserverinfo
Показывает основные опции, такие как port и datadir
Ориентирован на репликацию
Тулкиты
56
∙
Лог ошибок
∙ Слейв
∙ SHOW SLAVE STATUS
∙
Таблицы в Performance Schema
∙
Таблицы в mysql database
∙ Мастер
∙ SHOW MASTER STATUS
∙
SHOW BINLOG EVENTS
∙ mysqlbinlog
∙ mysql command line client
Основные инструменты: итоги
57

Эффективная отладка репликации MySQL / Света Смирнова (Percona)

  • 1.
  • 2.
    ∙ Инженер тех. поддержкиMySQL ∙ Автор ∙ MySQL Troubleshooting ∙ JSON UDF функции ∙ FILTER clause для MySQL ∙ Докладчик ∙ Percona Live, OOW, Fosdem, DevConf, ... Света Смирнова 2
  • 3.
    ∙Особенности репликации MySQL ∙Проблемымастера ∙Проблемы Slave IO thread ∙Проблемы Slave SQL thread ∙Многопоточный слейв ∙Multi-master Содержание 3
  • 4.
  • 5.
  • 6.
    Мастер Слейв <- Инициирует <-Запрашивает пакет Асинхронная 5
  • 7.
    Мастер Отправляет пакет -> Слейв <-Инициирует <- Запрашивает пакет Асинхронная 5
  • 8.
    Мастер Отправляет пакет -> Слейв <-Инициирует <- Запрашивает пакет ... ? Асинхронная 5
  • 9.
  • 10.
    Мастер Слейв <- Инициирует <-Запрашивает пакет Полусинхронная (Semisynchrous plugin) 6
  • 11.
    Мастер Отправляет пакет -> Слейв <-Инициирует <- Запрашивает пакет Полусинхронная (Semisynchrous plugin) 6
  • 12.
    Мастер Отправляет пакет -> Ждёт"Ack" Слейв <- Инициирует <- Запрашивает пакет Полусинхронная (Semisynchrous plugin) 6
  • 13.
    Мастер Отправляет пакет -> Ждёт"Ack" Слейв <- Инициирует <- Запрашивает пакет <- Отправляет "Ack" Полусинхронная (Semisynchrous plugin) 6
  • 14.
  • 15.
    Мастер Получает изменение Передаёт движку-> Табличный движок Логическая 7
  • 16.
    Мастер Получает изменение Передаёт движку-> Табличный движок Пишет в таблицу Логическая 7
  • 17.
    Мастер Получает изменение Передаёт движку-> Табличный движок Пишет в таблицу <- Передаёт управление Логическая 7
  • 18.
    Мастер Получает изменение Передаёт движку-> Пишет в binary log Табличный движок Пишет в таблицу <- Передаёт управление Логическая 7
  • 19.
    Мастер Получает изменение Передаёт движку-> Пишет в binary log Синхронизируется -> Табличный движок Пишет в таблицу <- Передаёт управление <- Синхронизируется Логическая 7
  • 20.
    IO thread Читает смастера SQL thread Два типа потоков 8
  • 21.
    IO thread Читает смастера Сохраняет в relay log SQL thread Два типа потоков 8
  • 22.
    IO thread Читает смастера Сохраняет в relay log SQL thread <- Читает из relay log Два типа потоков 8
  • 23.
    IO thread Читает смастера Сохраняет в relay log SQL thread <- Читает из relay log Исполняет Два типа потоков 8
  • 24.
    ∙ В 5.6+SQL thread-ов может быть много Несколько SQL-потоков 9
  • 25.
    ∙ В 5.6+SQL thread-ов может быть много ∙ С точки зрения отладки ∙ IO thread один Несколько SQL-потоков 9
  • 26.
    ∙ В 5.6+SQL thread-ов может быть много ∙ С точки зрения отладки ∙ IO thread один ∙ Relay log один Несколько SQL-потоков 9
  • 27.
    ∙ В 5.6+SQL thread-ов может быть много ∙ С точки зрения отладки ∙ IO thread один ∙ Relay log один ∙ Может отставать от мастера Несколько SQL-потоков 9
  • 28.
    ∙ В 5.6+SQL thread-ов может быть много ∙ С точки зрения отладки ∙ IO thread один ∙ Relay log один ∙ Может отставать от мастера ∙ Ошибка одного потока останавливает все Несколько SQL-потоков 9
  • 29.
    ∙ В 5.7+может быть несколько мастеров Несколько мастеров (Multi-channel) 10
  • 30.
    ∙ В 5.7+может быть несколько мастеров ∙ С точки зрения отладки ∙ Несколько наборов relay log Несколько мастеров (Multi-channel) 10
  • 31.
    ∙ В 5.7+может быть несколько мастеров ∙ С точки зрения отладки ∙ Несколько наборов relay log ∙ Несколько IO thread-ов Несколько мастеров (Multi-channel) 10
  • 32.
    ∙ В 5.7+может быть несколько мастеров ∙ С точки зрения отладки ∙ Несколько наборов relay log ∙ Несколько IO thread-ов ∙ Несколько SQL thread-ов Несколько мастеров (Multi-channel) 10
  • 33.
    ∙ В 5.7+может быть несколько мастеров ∙ С точки зрения отладки ∙ Несколько наборов relay log ∙ Несколько IO thread-ов ∙ Несколько SQL thread-ов ∙ slave_parallel_workers для каждого канала Несколько мастеров (Multi-channel) 10
  • 34.
    ∙ В 5.7+может быть несколько мастеров ∙ С точки зрения отладки ∙ Несколько наборов relay log ∙ Несколько IO thread-ов ∙ Несколько SQL thread-ов ∙ slave_parallel_workers для каждого канала ∙ Каналы независимые Несколько мастеров (Multi-channel) 10
  • 35.
    ∙ В 5.7+может быть несколько мастеров ∙ С точки зрения отладки ∙ Несколько наборов relay log ∙ Несколько IO thread-ов ∙ Несколько SQL thread-ов ∙ slave_parallel_workers для каждого канала ∙ Каналы независимые ∙ Ошибка на одном остановит только его Несколько мастеров (Multi-channel) 10
  • 36.
    ∙ В 5.7+может быть несколько мастеров ∙ С точки зрения отладки ∙ Несколько наборов relay log ∙ Несколько IO thread-ов ∙ Несколько SQL thread-ов ∙ slave_parallel_workers для каждого канала ∙ Каналы независимые ∙ Ошибка на одном остановит только его ∙ Одноимённые объекты могут вызвать конфликты Несколько мастеров (Multi-channel) 10
  • 37.
    ∙ Необходимо указать ∙ Названиеmaster’s binary log file ∙ Позицию Позиционная 11
  • 38.
    ∙ Необходимо указать ∙ Названиеmaster’s binary log file ∙ Позицию ∙ С точки зрения отладки ∙ Событие выполняется по указателю позиции Позиционная 11
  • 39.
    ∙ Необходимо указать ∙ Названиеmaster’s binary log file ∙ Позицию ∙ С точки зрения отладки ∙ Событие выполняется по указателю позиции ∙ Легко пропустить Позиционная 11
  • 40.
    ∙ Необходимо указать ∙ Названиеmaster’s binary log file ∙ Позицию ∙ С точки зрения отладки ∙ Событие выполняется по указателю позиции ∙ Легко пропустить ∙ Легко переместить указатель в прошлое Позиционная 11
  • 41.
    ∙ Необходимо указать ∙ Названиеmaster’s binary log file ∙ Позицию ∙ С точки зрения отладки ∙ Событие выполняется по указателю позиции ∙ Легко пропустить ∙ Легко переместить указатель в прошлое ∙ Нет проверок Позиционная 11
  • 42.
    ∙ Каждая транзакцияполучает номер: GTID Глобальные идентификаторы транзакций (GTID) 12
  • 43.
    ∙ Каждая транзакцияполучает номер: GTID ∙ AUTO_POSITION=1 Глобальные идентификаторы транзакций (GTID) 12
  • 44.
    ∙ Каждая транзакцияполучает номер: GTID ∙ AUTO_POSITION=1 ∙ Не нужно указывать binary log и позицию Глобальные идентификаторы транзакций (GTID) 12
  • 45.
  • 46.
    Клиент INSERT INTO ...-> Binary log Statement-Based Binary Log Format 13
  • 47.
    Клиент INSERT INTO ...-> Binary log SET TIMESTAMP... Statement-Based Binary Log Format 13
  • 48.
    Клиент INSERT INTO ...-> Binary log SET TIMESTAMP... SET sql_mode... Statement-Based Binary Log Format 13
  • 49.
    Клиент INSERT INTO ...-> Binary log SET TIMESTAMP... SET sql_mode... INSERT INTO ... Statement-Based Binary Log Format 13
  • 50.
  • 51.
    Клиент UPDATE ... -> Binarylog Row-Based Binary Log Format 14
  • 52.
    Клиент UPDATE ... -> Binarylog SET TIMESTAMP... Row-Based Binary Log Format 14
  • 53.
    Клиент UPDATE ... -> Binarylog SET TIMESTAMP... SET sql_mode... Row-Based Binary Log Format 14
  • 54.
    Клиент UPDATE ... -> Binarylog SET TIMESTAMP... SET sql_mode... Строка до изменений Row-Based Binary Log Format 14
  • 55.
    Клиент UPDATE ... -> Binarylog SET TIMESTAMP... SET sql_mode... Строка до изменений Строка с изменениями Row-Based Binary Log Format 14
  • 56.
  • 57.
    ∙ Лог ошибок ∙На слейве ∙ SHOW SLAVE STATUS ∙ Таблицы в Performance Schema ∙ Системная база mysql Основные инструменты 15
  • 58.
    ∙ Лог ошибок ∙На слейве ∙ На мастере ∙ SHOW MASTER STATUS ∙ SHOW BINLOG EVENTS ∙ mysqlbinlog Основные инструменты 15
  • 59.
    ∙ Лог ошибок ∙На слейве ∙ На мастере ∙ Percona Toolkit Основные инструменты 15
  • 60.
    ∙ Лог ошибок ∙На слейве ∙ На мастере ∙ Percona Toolkit ∙ MySQL Utilities Основные инструменты 15
  • 61.
    ∙ Всегда доступна, требуетнастройки ∙ Асинхронная ∙ Мастер ∙ Хранит все изменения в binary log Два формата: ROW и STATEMENT ∙ Слейв ∙ IO thread реплицирует с мастера в relay log ∙ SQL thread исполняет обновления Несколько SQL thread-ов в 5.6+ Несколько каналов (мастеров) в 5.7+ ∙ GTID в 5.6+ Особенности репликации: итоги 16
  • 62.
  • 63.
    ∙ Более активная запись ∙ binlog_row_image= FULL | MINIMAL | NOBLOB Производительность 18
  • 64.
    ∙ Более активная запись ∙ binlog_row_image= FULL | MINIMAL | NOBLOB ∙ binlog_cache_size Наблюдайте Binlog_cache_disk_use Производительность 18
  • 65.
    ∙ Более активная запись ∙ binlog_row_image= FULL | MINIMAL | NOBLOB ∙ binlog_cache_size Наблюдайте Binlog_cache_disk_use ∙ binlog_stmt_cache_size Наблюдайте Binlog_stmt_cache_disk_use Производительность 18
  • 66.
    ∙ Более активная запись ∙ Синхронизация ∙binlog_sync ∙ Не изменяйте! Производительность 18
  • 67.
    ∙ Время жизниbinary log ∙ expire_log_days Поведение 19
  • 68.
    ∙ Время жизниbinary log ∙ Синхронизация ∙ SBR несовместима с READ COMMITTED и READ UNCOMMITTED Поведение 19
  • 69.
    ∙ Время жизниbinary log ∙ Синхронизация ∙ Порядок записи в binary log ∙ Non-deterministic события и SBR Поведение 19
  • 70.
  • 71.
    ∙ SHOW SLAVESTATUS Slave_IO_Running: Connecting Slave_SQL_Running: Yes ... Last_IO_Errno: 1045 Last_IO_Error: error connecting to master ’root@127.0.0.1:13000’ - retry-time: 60 retries: 1 Last_SQL_Errno: 0 Last_SQL_Error: ... Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: 160824 03:18:36 Last_SQL_Error_Timestamp: Сеть 21
  • 72.
    ∙ SHOW SLAVESTATUS ∙ P_S.replication_connection_status mysql> select * from performance_schema.replication_connection_statusG *************************** 1. row *************************** CHANNEL_NAME: GROUP_NAME: SOURCE_UUID: THREAD_ID: NULL SERVICE_STATE: CONNECTING COUNT_RECEIVED_HEARTBEATS: 0 LAST_HEARTBEAT_TIMESTAMP: 0000-00-00 00:00:00 RECEIVED_TRANSACTION_SET: LAST_ERROR_NUMBER: 1045 LAST_ERROR_MESSAGE: error connecting to master ’root@127.0.0.1:13000’ - retry-time: 60 retries: 4 LAST_ERROR_TIMESTAMP: 2016-08-24 03:21:36 1 row in set (0,01 sec) Сеть 21
  • 73.
    ∙ SHOW SLAVESTATUS ∙ P_S.replication_connection_status ∙ Error log 2016-08-24T00:18:36.077384Z 3 [ERROR] Slave I/O for channel ”: error connecting to master ’root@127.0.0.1:13000’ - retry-time: 60 retries: 1, Error_code: 1045 2016-08-24T00:19:36.299011Z 3 [ERROR] Slave I/O for channel ”: error connecting to master ’root@127.0.0.1:13000’ - retry-time: 60 retries: 2, Error_code: 1045 2016-08-24T00:20:36.485315Z 3 [ERROR] Slave I/O for channel ”: error connecting to master ’root@127.0.0.1:13000’ - retry-time: 60 retries: 3, Error_code: 1045 2016-08-24T00:21:36.677915Z 3 [ERROR] Slave I/O for channel ”: error connecting to master ’root@127.0.0.1:13000’ - retry-time: 60 retries: 4, Error_code: 1045 2016-08-24T00:22:36.872066Z 3 [ERROR] Slave I/O for channel ”: error connecting to master ’root@127.0.0.1:13000’ - retry-time: 60 retries: 5, Error_code: 1045 Сеть 21
  • 74.
    ∙ SHOW SLAVESTATUS ∙ P_S.replication_connection_status ∙ Error log ∙ Доступ $ perror 1045 MySQL error code 1045 (ER_ACCESS_DENIED_ERROR): Access denied for user ’%-.48s’@’%-.64s’ (using password: %s) Сеть 21
  • 75.
    ∙ SHOW SLAVESTATUS ∙ P_S.replication_connection_status ∙ Error log ∙ Доступ ∙ MySQL клиент и логин-пароль слейва $ mysql -h127.0.0.1 -P13000 -uroot -pbar Warning: Using a password on the command line interface can be insecure. ERROR 1045 (28000): Access denied for user ’root’@’localhost’ (using password: YES) Сеть 21
  • 76.
    ∙ SHOW SLAVESTATUS ∙ P_S.replication_connection_status ∙ Error log ∙ Доступ ∙ MySQL клиент и логин-пароль слейва SHOW GRANTS mysql> SHOW GRANTS; +----------------------------------+ | Grants for foo@% | +----------------------------------+ | GRANT SELECT ON *.* TO ’foo’@’%’ | +----------------------------------+ Сеть 21
  • 77.
    ∙ SHOW SLAVESTATUS ∙ P_S.replication_connection_status ∙ Error log ∙ Доступ ∙ MySQL клиент и логин-пароль слейва SHOW GRANTS ∙ Исправьте привилегии на мастере ∙ Перезапустите репликацию Сеть 21
  • 78.
    ∙ Обычные методыотладки ∙ Проверьте с клиентом командной строки ∙ См. также Troubleshooting hardware resource usage webinar Производительность 22
  • 79.
  • 80.
    ∙ Один мастер-одинслейв ∙ Разные данные Слейв не может выполнить event из relay log ∙ Разные ошибки на мастере и слейве ∙ Слейв сильно отстаёт от мастера SQL thread: типичные проблемы 24
  • 81.
    ∙ Один мастер-одинслейв ∙ Разные данные Слейв не может выполнить event из relay log ∙ Разные ошибки на мастере и слейве ∙ Слейв сильно отстаёт от мастера ∙ Круговая репликация и другая запись в дополнение к SQL thread ∙ Разные данные SQL thread: типичные проблемы 24
  • 82.
    ∙ Таблица меняласьвне репликации? ∙ Как? ∙ Конфликт с обновлениями на мастере? Разные данные 25
  • 83.
    ∙ Таблица меняласьвне репликации? ∙ Идентична ли структура таблиц? ∙ Percona Toolkit pt-table-checksum, pt-table-sync ∙ MySQL Utilities mysqlrplsync, mysqldbcompare, mysqldiff Разные данные 25
  • 84.
    ∙ Таблица меняласьвне репликации? ∙ Идентична ли структура таблиц? ∙ Обновления в неправильном порядке? ∙ mysqlbinlog ∙ Логика приложения на мастере Разные данные 25
  • 85.
    ∙ Только прииспользовании SBR Обновления в неправильном порядке 26
  • 86.
    ∙ Только прииспользовании SBR ∙ Блокировки на уровне строк Обновления в неправильном порядке 26
  • 87.
    ∙ Только прииспользовании SBR ∙ Блокировки на уровне строк ∙ Триггеры ∙ SET GLOBAL slave_skip_counter – No GTIDs! ∙ Пропустите транзакцию – GTIDs ∙ Синхронизируйте таблицы! Обновления в неправильном порядке 26
  • 88.
    ∙ Только прииспользовании SBR ∙ Блокировки на уровне строк ∙ Триггеры ∙ Разные опции: для олдфагов ∙ Запустите слейв с опциями мастера ∙ Перезапустите SQL thread ∙ Исправлено в последних версиях Обновления в неправильном порядке 26
  • 89.
    ∙ Потоки ∙ Мастер выполняетобновления в несколько потоков ∙ Слейв использует один Слейв отстаёт от мастера 27
  • 90.
    ∙ Потоки ∙ Seconds_behind_master увеличивается – Нельзяоднозначно полагаться! Слейв отстаёт от мастера 27
  • 91.
    ∙ Потоки ∙ Seconds_behind_master увеличивается – Нельзяоднозначно полагаться! ∙ Настройте производительность слейва ∙ Multi-threaded слейв Один поток на одну базу в 5.6 Могут возникнуть проблемы параллельного выполнения между потоками слейва Слейв отстаёт от мастера 27
  • 92.
    ∙ Потоки ∙ Seconds_behind_master увеличивается – Нельзяоднозначно полагаться! ∙ Настройте производительность слейва ∙ Multi-threaded слейв Один поток на одну базу в 5.6 Могут возникнуть проблемы параллельного выполнения между потоками слейва ∙ Индексы на слейве Имеет смысл только для SBR Слейв отстаёт от мастера 27
  • 93.
  • 94.
    ∙ Единственный relaylog ∙ Скорость в высококонкурентной среде может быть меньше, чем у мастера Производительность 29
  • 95.
    ∙ Единственный relaylog ∙ Скорость в высококонкурентной среде может быть меньше, чем у мастера ∙ slave_parallel_workers Производительность 29
  • 96.
    ∙ Единственный relaylog ∙ Скорость в высококонкурентной среде может быть меньше, чем у мастера ∙ slave_parallel_workers ∙ slave_parallel_type=DATABASE | LOGICAL_CLOCK Производительность 29
  • 97.
    ∙ Те же методы,что и для однопоточного Неправильное поведение 30
  • 98.
    ∙ Те же методы,что и для однопоточного ∙ Ошибка одного thread-а останавливает все mysql> select WORKER_ID, SERVICE_STATE, LAST_SEEN_TRANSACTION, LAST_ERROR_NUMBER, -> LAST_ERROR_MESSAGE from performance_schema.replication_applier_status_by_workerG *************************** 1. row *************************** WORKER_ID: 1 SERVICE_STATE: OFF LAST_SEEN_TRANSACTION: d318bc17-66dc-11e6-a471-30b5c2208a0f:4988 LAST_ERROR_NUMBER: 0 LAST_ERROR_MESSAGE: *************************** 2. row *************************** WORKER_ID: 3 SERVICE_STATE: OFF LAST_SEEN_TRANSACTION: d318bc17-66dc-11e6-a471-30b5c2208a0f:4986 LAST_ERROR_NUMBER: 1032 LAST_ERROR_MESSAGE: Worker 2 failed executing transaction... Неправильное поведение 30
  • 99.
  • 100.
    ∙ Репликация должнабыть настроена для каждого канала Особенности 32
  • 101.
    ∙ Репликация должнабыть настроена для каждого канала ∙ Можно одновременно использовать мастера с GTID и без Особенности 32
  • 102.
    ∙ Репликация должнабыть настроена для каждого канала ∙ Можно одновременно использовать мастера с GTID и без ∙ Те же проблемы и решения, что и в случае обычной репликации Особенности 32
  • 103.
    ∙ Репликация должнабыть настроена для каждого канала ∙ Можно одновременно использовать мастера с GTID и без ∙ Те же проблемы и решения, что и в случае обычной репликации ∙ Фильтры применяются одновременно для всех каналов Особенности 32
  • 104.
  • 105.
    ∙ Проблемы мастера ∙Те же, что и для обычного сервера ∙ Больше пишет и проверяет Итоги 34
  • 106.
    ∙ Проблемы мастера ∙Slave IO thread ∙ Обычные проблемы с сетью ∙ mysql command line client для тестов Итоги 34
  • 107.
    ∙ Проблемы мастера ∙Slave IO thread ∙ Slave SQL thread ∙ Обычные проблемы при выполнении запросов ∙ Обычные проблемы движка ∙ Меньше потоков выполнения, чем на мастере Итоги 34
  • 108.
    ∙ Basic Techniques –troubleshooting webinar ∙ Troubleshooting hardware resource usage webinar ∙ Introduction into storage engine troubleshooting webinar ∙ Percona Toolkit ∙ MySQL Utilities ∙ Книга MySQL High Availability ∙ MySQL Replication Team blog Больше информации 35
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
    ∙ Актуальны лиданные? ∙ Одинаковы ли ∙ Структура таблиц ∙ Движок ∙ Данные ∙ Любая запись может сломать репликацию Асинхронная: вопросы на слейве 40
  • 114.
    ∙ Запись намастере медленнее асинхронной репликации Полусинхронная: с точки зрения отладки 41
  • 115.
    ∙ Запись намастере медленнее асинхронной репликации ∙ Сколько "Ack"-ов ждёт мастер? Полусинхронная: с точки зрения отладки 41
  • 116.
    ∙ Запись намастере медленнее асинхронной репликации ∙ Сколько "Ack"-ов ждёт мастер? ∙ До версии 5.7: от одного слейва Полусинхронная: с точки зрения отладки 41
  • 117.
    ∙ Запись намастере медленнее асинхронной репликации ∙ Сколько "Ack"-ов ждёт мастер? ∙ До версии 5.7: от одного слейва ∙ Сейчас: rpl_semi_sync_master_wait_for_slave_count Полусинхронная: с точки зрения отладки 41
  • 118.
    ∙ Запись намастере медленнее асинхронной репликации ∙ Сколько "Ack"-ов ждёт мастер? ∙ До версии 5.7: от одного слейва ∙ Сейчас: rpl_semi_sync_master_wait_for_slave_count ∙ Остальных ждать не будет Полусинхронная: с точки зрения отладки 41
  • 119.
    ∙ Запись намастере медленнее асинхронной репликации ∙ Сколько "Ack"-ов ждёт мастер? ∙ Что значит "Ack"? Полусинхронная: с точки зрения отладки 41
  • 120.
    ∙ Запись намастере медленнее асинхронной репликации ∙ Сколько "Ack"-ов ждёт мастер? ∙ Что значит "Ack"? ∙ Событие записано в relay log Полусинхронная: с точки зрения отладки 41
  • 121.
    ∙ Запись намастере медленнее асинхронной репликации ∙ Сколько "Ack"-ов ждёт мастер? ∙ Что значит "Ack"? ∙ Событие записано в relay log ∙ Неизвестно, выполнено ли оно Полусинхронная: с точки зрения отладки 41
  • 122.
    ∙ Запись намастере медленнее асинхронной репликации ∙ Сколько "Ack"-ов ждёт мастер? ∙ Что значит "Ack"? ∙ Что происходит при timeout-е? Полусинхронная: с точки зрения отладки 41
  • 123.
    ∙ Запись намастере медленнее асинхронной репликации ∙ Сколько "Ack"-ов ждёт мастер? ∙ Что значит "Ack"? ∙ Что происходит при timeout-е? ∙ Репликация становится асинхронной Полусинхронная: с точки зрения отладки 41
  • 124.
    ∙ Каждое изменение записываетсядважды: Файлы движка: логи, данные, ... Бинарный лог Логическая: с точки зрения отладки 42
  • 125.
    ∙ Каждое изменение записываетсядважды: Файлы движка: логи, данные, ... Бинарный лог ∙ Можно параллельно писать на слейве Логическая: с точки зрения отладки 42
  • 126.
    ∙ Не существуетв MySQL! Для сравнения: физическая репликация 43
  • 127.
    ∙ Не существуетв MySQL! ∙ Есть две закрытые реализации Для сравнения: физическая репликация 43
  • 128.
    ∙ Не существуетв MySQL! ∙ Мастер пишет только в файлы движка Для сравнения: физическая репликация 43
  • 129.
    ∙ Не существуетв MySQL! ∙ Мастер пишет только в файлы движка ∙ Которые реплицируются на слейв Для сравнения: физическая репликация 43
  • 130.
    ∙ Не существуетв MySQL! ∙ Мастер пишет только в файлы движка ∙ Которые реплицируются на слейв ∙ С точки зрения отладки ∙ IO: изменения записываются единожды ∙ Нельзя параллельно писать на слейве ∙ Любое несоответствие данных приводит к поломке Для сравнения: физическая репликация 43
  • 131.
    ∙ Передача данных ∙ Выполнение ∙ Разные ∙Диагностика ∙ Исправление Два типа потоков – два вида проблем 44
  • 132.
    ∙ Гарантия, чтотранзакция не будет выполнена дважды GTID: с точки зрения отладки 45
  • 133.
    ∙ Гарантия, чтотранзакция не будет выполнена дважды ∙ Простой failover GTID: с точки зрения отладки 45
  • 134.
    ∙ Гарантия, чтотранзакция не будет выполнена дважды ∙ Простой failover ∙ Пропустить одну транзакцию непросто GTID: с точки зрения отладки 45
  • 135.
    ∙ Гарантия, чтотранзакция не будет выполнена дважды ∙ Простой failover ∙ Пропустить одну транзакцию непросто ∙ Используйте mysqlslavetrx GTID: с точки зрения отладки 45
  • 136.
    ∙ Гарантия, чтотранзакция не будет выполнена дважды ∙ Простой failover ∙ Пропустить одну транзакцию непросто ∙ Используйте mysqlslavetrx ∙ Осторожнее с настройкой expire_logs_days! GTID: с точки зрения отладки 45
  • 137.
    ∙ Statement-based (SBR) ∙Запросы записываются в оригинальном виде Форматы Binary log 46
  • 138.
    ∙ Statement-based (SBR) ∙Запросы записываются в оригинальном виде ∙ Риск несовпадения данных (non-safe) INSERT IGNORE LIMIT без ORDER BY Non-deterministic функции ... Форматы Binary log 46
  • 139.
    ∙ Statement-based (SBR) ∙Row-based (RBR) ∙ Обычно пишется больше данных IO Скорость передачи binlog_row_image Форматы Binary log 46
  • 140.
    ∙ Statement-based (SBR) ∙Row-based (RBR) ∙ Обычно пишется больше данных IO Скорость передачи binlog_row_image ∙ Ухудшение производительности для таблиц без первичного (уникального) ключа Форматы Binary log 46
  • 141.
    ∙ Statement-based (SBR) ∙Row-based (RBR) ∙ Смешанная (Mixed) ∙ Преимущества обоих форматов Форматы Binary log 46
  • 142.
  • 143.
    ∙ Информация остарте слейва Лог ошибок 48
  • 144.
    ∙ Информация остарте слейва ∙ Ошибки 2016-08-23T12:11:21.867440Z 4 [ERROR] Slave SQL for channel ’master-1’: Could not execute Update_rows event on table m2.t1; Can’t find record in ’t1’, Error_code: 1032; handler error HA_ERR_END_OF_FILE; the event’s master log master-bin.000001, end_log_pos 1213, Error_code: 1032 2016-08-23T12:11:21.867471Z 4 [Warning] Slave: Can’t find record in ’t1’ Error_code: 1032 2016-08-23T12:11:21.867484Z 4 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log ’master-bin.000001’ position 989 Лог ошибок 48
  • 145.
    ∙ Информация остарте слейва ∙ Ошибки ∙ Остановка слейва Лог ошибок 48
  • 146.
    Вся информация ослейве ∙ Конфигурация IO thread ∙ Конфигурация SQL thread ∙ Статус IO thread ∙ Статус SQL thread ∙ Ошибки Только последняя Все есть в логе ошибок SHOW SLAVE STATUS 49
  • 147.
    mysql> show slavestatus G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 127.0.0.1 ... Master_Log_File: master-bin.000002 Read_Master_Log_Pos: 63810611 Relay_Log_File: slave-relay-bin-master@002d1.000004 Relay_Log_Pos: 1156 Relay_Master_Log_File: master-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: No ... Replicate_Wild_Ignore_Table: Last_Errno: 1032 Last_Error: Could not execute Update_rows event on table m2.t1; Can’t find record in ’t1’, Error_code: 1032; handler error HA_ERR_END_OF_FILE; the event’s master log master-bin.000001, end_log_pos 1213 Skip_Counter: 0 ... SHOW SLAVE STATUS 49
  • 148.
    ∙ Не нужнопарсить вывод SHOW Таблицы в Performance Schema 50
  • 149.
    ∙ Не нужнопарсить вывод SHOW ∙ Конфигурация ∙ replication_connection_configuration ∙ replication_applier_configuration ∙ mysql> select * from replication_connection_configuration -> join replication_applier_configuration using(channel_name); Таблицы в Performance Schema 50
  • 150.
    ∙ Не нужнопарсить вывод SHOW ∙ Конфигурация ∙ Статус IO thread ∙ replication_connection_status Таблицы в Performance Schema 50
  • 151.
    ∙ Не нужнопарсить вывод SHOW ∙ Конфигурация ∙ Статус IO thread ∙ Статус SQL thread ∙ replication_applier_status ∙ replication_applier_status_by_coordinator - MTS! mysql> select * from replication_applier_status join -> replication_applier_status_by_coordinator -> using(channel_name); Таблицы в Performance Schema 50
  • 152.
    ∙ Не нужнопарсить вывод SHOW ∙ Конфигурация ∙ Статус IO thread ∙ Статус SQL thread ∙ replication_applier_status ∙ replication_applier_status_by_worker mysql> select * from replication_applier_status join -> replication_applier_status_by_worker -> using(channel_name); Таблицы в Performance Schema 50
  • 153.
    ∙ Master Info mysql>select * from slave_master_infoG *************************** 1. row *************************** Number_of_lines: 25 Master_log_name: mysqld-bin.000001 Master_log_pos: 154 Host: 127.0.0.1 User_name: root User_password: secret Port: 13000 Connect_retry: 60 Enabled_ssl: 0 ... Uuid: 31ed7c8f-74ea-11e6-8de8-30b5c2208a0f Retry_count: 86400 ... Enabled_auto_position: 1 ... Системная база mysql: только на слейве 51
  • 154.
    ∙ Master Info ∙Relay log info mysql> select * from slave_relay_log_infoG *************************** 1. row *************************** Number_of_lines: 7 Relay_log_name: ./slave-relay-bin-master@002d1.000004 Relay_log_pos: 1156 Master_log_name: master-bin.000001 Master_log_pos: 989 Sql_delay: 0 Number_of_workers: 0 Id: 1 Channel_name: master-1 Системная база mysql: только на слейве 51
  • 155.
    ∙ Master Info ∙Relay log info ∙ Worker info: multi-threaded slave mysql> select * from slave_worker_infoG *************************** 1. row *************************** Id: 1 ... *************************** 8. row *************************** Id: 8 Relay_log_name: ./Thinkie-relay-bin.000004 Relay_log_pos: 1216 Master_log_name: mysqld-bin.000001 Master_log_pos: 1342 Checkpoint_relay_log_name: ./Thinkie-relay-bin.000004 Checkpoint_relay_log_pos: 963 Checkpoint_master_log_name: mysqld-bin.000001 Системная база mysql: только на слейве 51
  • 156.
    mysql> show masterstatusG *************************** 1. row *************************** File: master-bin.000005 Position: 154 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 1 row in set (0,00 sec) SHOW MASTER STATUS 52
  • 157.
    mysql> show binlogevents in ’master-bin.000001’ from 989; +-------------------+------+----------------+-----------+-------------+-------------------------------- | Log_name | Pos | Event_type | Server_id | End_log_pos | Info +-------------------+------+----------------+-----------+-------------+-------------------------------- | master-bin.000001 | 989 | Anonymous_Gtid | 1 | 1054 | SET @@SESSION.GTID_NEXT= ... | master-bin.000001 | 1054 | Query | 1 | 1124 | BEGIN | master-bin.000001 | 1124 | Table_map | 1 | 1167 | table_id: 109 (m2.t1) | master-bin.000001 | 1167 | Update_rows | 1 | 1213 | table_id: 109 flags: STMT_END_F | master-bin.000001 | 1213 | Xid | 1 | 1244 | COMMIT /* xid=64 */ +-------------------+------+----------------+-----------+-------------+-------------------------------- 5 rows in set (0,00 sec) SHOW BINLOG EVENTS 53
  • 158.
    $ mysqlbinlog var/mysqld.1/data/master-bin.000001–start-position=989 –stop-position=1213 ... # at 1167 #160822 14:15:11 server id 1 end_log_pos 1213 CRC32 0x1f346c6b Update_rows: table id 109 flags: STMT_END_F BINLOG ’ v966VxMBAAAAKwAAAI8EAAAAAG0AAAAAAAEAAm0yAAJ0MQABAwABY2HOoQ== v966Vx8BAAAALgAAAL0EAAAAAG0AAAAAAAEAAgAB///+BQAAAP4GAAAAa2w0Hw== ’/*!*/; ROLLBACK /* added by mysqlbinlog */ /*!*/; SET @@SESSION.GTID_NEXT= ’AUTOMATIC’ /* added by mysqlbinlog */ /*!*/; ... mysqlbinlog 54
  • 159.
    $ mysqlbinlog -vvar/mysqld.1/data/master-bin.000001 –start-position=989 –stop-position=1213 ... # at 1167 #160822 14:15:11 server id 1 end_log_pos 1213 CRC32 0x1f346c6b Update_rows: table id 109 flags: STMT_END_F BINLOG ’ v966VxMBAAAAKwAAAI8EAAAAAG0AAAAAAAEAAm0yAAJ0MQABAwABY2HOoQ== v966Vx8BAAAALgAAAL0EAAAAAG0AAAAAAAEAAgAB///+BQAAAP4GAAAAa2w0Hw== ’/*!*/; ### UPDATE ‘m2‘.‘t1‘ ### WHERE ### @1=5 ### SET ### @1=6 ROLLBACK /* added by mysqlbinlog */ /*!*/; SET @@SESSION.GTID_NEXT= ’AUTOMATIC’ /* added by mysqlbinlog */ /*!*/; ... mysqlbinlog 55
  • 160.
    ∙ Percona Toolkit ∙pt-table-checksum Проверяет соответствие данных Тулкиты 56
  • 161.
    ∙ Percona Toolkit ∙pt-table-checksum Проверяет соответствие данных ∙ pt-table-sync Исправляет несоответствия в данных Тулкиты 56
  • 162.
    ∙ Percona Toolkit ∙pt-table-checksum Проверяет соответствие данных ∙ pt-table-sync Исправляет несоответствия в данных ∙ pt-slave-find Показывает топологию Тулкиты 56
  • 163.
    ∙ MySQL Utilities ∙mysqlrplcheck Проверяет, можно ли запустить репликацию Тулкиты 56
  • 164.
    ∙ MySQL Utilities ∙mysqlrplcheck Проверяет, можно ли запустить репликацию ∙ mysqlrplshow Показывает топологию Тулкиты 56
  • 165.
    ∙ MySQL Utilities ∙mysqlrplcheck Проверяет, можно ли запустить репликацию ∙ mysqlrplshow Показывает топологию ∙ mysqlrplsync Проверяет соответствие данных Тулкиты 56
  • 166.
    ∙ MySQL Utilities ∙mysqlrplcheck Проверяет, можно ли запустить репликацию ∙ mysqlrplshow Показывает топологию ∙ mysqlrplsync Проверяет соответствие данных ∙ mysqlslavetrx Пропускает 1-N транзакций Тулкиты 56
  • 167.
    ∙ MySQL Utilities ∙ mysqldbcompare Сравниваетдве базы данных Тулкиты 56
  • 168.
    ∙ MySQL Utilities ∙ mysqldbcompare Сравниваетдве базы данных ∙ mysqldiff Сравнивает определения объектов Тулкиты 56
  • 169.
    ∙ MySQL Utilities ∙ mysqldbcompare Сравниваетдве базы данных ∙ mysqldiff Сравнивает определения объектов ∙ mysqlserverinfo Показывает основные опции, такие как port и datadir Ориентирован на репликацию Тулкиты 56
  • 170.
    ∙ Лог ошибок ∙ Слейв ∙SHOW SLAVE STATUS ∙ Таблицы в Performance Schema ∙ Таблицы в mysql database ∙ Мастер ∙ SHOW MASTER STATUS ∙ SHOW BINLOG EVENTS ∙ mysqlbinlog ∙ mysql command line client Основные инструменты: итоги 57