Эффективная отладка репликации MySQL
- 2. ∙
Инженер тех. поддержки MySQL
∙ Автор
∙ MySQL Troubleshooting
∙ JSON UDF функции
∙ FILTER clause для MySQL
∙ Докладчик
∙ Percona Live, OOW, Fosdem,
DevConf, ...
Света Смирнова
2
- 4. ∙ Существует с первых версий
∙ Простая в использовании
Репликация в MySQL
3
- 5. ∙ Существует с первых версий
∙ Простая в использовании
∙ Требует минимальной настройки
Репликация в MySQL
3
- 18. Slave_IO_State: Waiting for master to send event
Master_Host: 127.0.0.1
Master_User: root
Master_Port: 13000
Connect_Retry: 60
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_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1032
Last_Error: Could not execute Update_rows event on...
Skip_Counter: 0
Exec_Master_Log_Pos: 989
Relay_Log_Space: 63814652
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No | Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 1032
Last_SQL_Error: Could not execute Update_rows event on...
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: d08c509e-6857-11e6-8872-30b5c2208a0f
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State:
Master_Retry_Count: 10
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp: 160823 15:11:21
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name: master-1 | Master_TLS_Version:
∙
Конфигурация IO thread
∙
Конфигурация SQL thread
∙
Состояние IO thread
∙
Состояние SQL thread
∙ Ошибки
∙
Только последняя
∙ Все есть в журнале ошибок
Инструмент №1: SHOW SLAVE STATUS
13
- 19. 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’ -
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:
Ошибки Сети
14
- 20. 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)
№2: connection_status в Performance Schema
15
- 21. 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
№ 3: Лог Ошибок
16
- 22. $ perror 1045
MySQL error code 1045 (ER_ACCESS_DENIED_ERROR): Access denied for user ’%-.48s’@’%-.64s’
(using password: %s)
№4: perror
17
- 23. ∙
На слейве
$ mysql -h127.0.0.1 -P13000 -uslave_user -pslave_password
Warning: Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user ’slave_user’@’localhost’ (using password: YES
№5: MySQL Command Line Client
18
- 24. ∙
На слейве
∙
На мастере
mysql> SHOW GRANTS;
+-----------------------------------------+
| Grants for slave_user@% |
+-----------------------------------------+
| GRANT SELECT ON *.* TO ’slave_user’@’%’ |
+-----------------------------------------+
1 row in set (0.00 sec)
№5: MySQL Command Line Client
18
- 32. ∙ Запись на мастере медленнее асинхронной
Полусинхронная: с точки зрения отладки
20
- 33. ∙ Запись на мастере медленнее асинхронной
∙ Сколько "Ack"-ов ждёт мастер?
Полусинхронная: с точки зрения отладки
20
- 34. ∙ Запись на мастере медленнее асинхронной
∙ Сколько "Ack"-ов ждёт мастер?
∙ До версии 5.7: от одного слейва
Полусинхронная: с точки зрения отладки
20
- 35. ∙ Запись на мастере медленнее асинхронной
∙ Сколько "Ack"-ов ждёт мастер?
∙ До версии 5.7: от одного слейва
∙
Сейчас в MySQL:
rpl_semi_sync_master_wait_for_slave_count
Полусинхронная: с точки зрения отладки
20
- 36. ∙ Запись на мастере медленнее асинхронной
∙ Сколько "Ack"-ов ждёт мастер?
∙ До версии 5.7: от одного слейва
∙
Сейчас в MySQL:
rpl_semi_sync_master_wait_for_slave_count
∙ Остальных ждать не будет
Полусинхронная: с точки зрения отладки
20
- 37. ∙ Запись на мастере медленнее асинхронной
∙ Сколько "Ack"-ов ждёт мастер?
∙ Что происходит при timeout-е?
Полусинхронная: с точки зрения отладки
20
- 38. ∙ Запись на мастере медленнее асинхронной
∙ Сколько "Ack"-ов ждёт мастер?
∙ Что происходит при timeout-е?
∙ Репликация становится асинхронной
Полусинхронная: с точки зрения отладки
20
- 39. ∙ Запись на мастере медленнее асинхронной
∙ Сколько "Ack"-ов ждёт мастер?
∙ Что происходит при timeout-е?
∙
Что значит "Ack"?
Полусинхронная: с точки зрения отладки
20
- 40. ∙ Запись на мастере медленнее асинхронной
∙ Сколько "Ack"-ов ждёт мастер?
∙ Что происходит при timeout-е?
∙
Что значит "Ack"?
∙ Событие записано в relay log
Полусинхронная: с точки зрения отладки
20
- 41. ∙ Запись на мастере медленнее асинхронной
∙ Сколько "Ack"-ов ждёт мастер?
∙ Что происходит при timeout-е?
∙
Что значит "Ack"?
∙ Событие записано в relay log
∙ Неизвестно, выполнено ли оно
Полусинхронная: с точки зрения отладки
20
- 44. IO thread
Читает с мастера
Сохраняет в relay log
SQL thread
<- Читает из relay log
Два типа потоков
21
- 45. IO thread
Читает с мастера
Сохраняет в relay log
SQL thread
<- Читает из relay log
Исполняет
Два типа потоков
21
- 50. ∙ MySQL: ––slave_parallel_workers
∙ MySQL: ––slave_parallel_type=DATABASE | LOGICAL_CLOCK
∙ MySQL 8.0.1+:
SET @@GLOBAL.binlog_transaction_dependency_tracking =
WRITESET | WRITESET_SESSION | COMMIT_ORDER;
Настройка Производительности
26
- 51. ∙ MariaDB: ––slave_parallel_threads
∙ MariaDB: ––slave_parallel_max_queued
∙ MariaDB: ––slave_domain_parallel_threads
∙
MariaDB: ––slave_parallel_mode=optimistic | conservative |
aggressive | minimal | none
Настройка Производительности
26
- 52. 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...
№6: Ошибки Одного Останавливают Все
27
- 53. MariaDB [test]> select id, command, time, state from information_schema.processlist
-> where user=’system user’;
+----+---------+------+------------------------------------------------------------------+
| id | command | time | state |
+----+---------+------+------------------------------------------------------------------+
| 25 | Connect | 4738 | Waiting for master to send event |
| 24 | Connect | 5096 | Slave has read all relay log; waiting for the slave I/O thread t |
| 23 | Connect | 0 | Waiting for work from SQL thread |
| 22 | Connect | 0 | Unlocking tables |
| 21 | Connect | 0 | Update_rows_log_event::ha_update_row(-1) |
| 20 | Connect | 0 | Waiting for prior transaction to start commit before starting ne |
| 19 | Connect | 0 | Update_rows_log_event::ha_update_row(-1) |
| 18 | Connect | 0 | Update_rows_log_event::ha_update_row(-1) |
| 17 | Connect | 0 | Update_rows_log_event::find_row(-1)
...
№6: Ошибки Одного Останавливают Все
27
- 55. ∙
Разные данные
∙
Слейв не может выполнить event из relay log
∙ Разные ошибки на мастере и слейве
∙ Триггеры
∙ Транзакционные и нетранзакционные
таблицы одновременно
Какие Бывают Ошибки?
28
- 56. ∙ Таблица менялась вне репликации?
∙ Как?
∙
Конфликт с обновлениями на мастере?
Разные Данные на Мастере и Слейве
29
- 57. ∙ Таблица менялась вне репликации?
∙ Идентична ли структура таблиц?
∙ Percona Toolkit
pt-table-checksum, pt-table-sync
∙
MySQL Utilities
mysqlrplsync, mysqldbcompare, mysqldiff
Разные Данные на Мастере и Слейве
29
- 58. ∙ Таблица менялась вне репликации?
∙ Идентична ли структура таблиц?
∙ Обновления в неправильном порядке?
∙ mysqlbinlog
∙
Логика приложения на мастере
Разные Данные на Мастере и Слейве
29
- 67. ∙
Более активная запись
∙
RBR: ––binlog_row_image
∙
––binlog_cache_size
Наблюдайте Binlog_cache_disk_use
∙ ––binlog_stmt_cache_size
Наблюдайте Binlog_stmt_cache_disk_use
Производительность Мастера
31
- 69. ∙ Время жизни binary log
∙ ––expire_log_days
Поведение Мастера
32
- 70. ∙ Время жизни binary log
∙ Синхронизация
∙ SBR несовместима с READ COMMITTED и READ
UNCOMMITTED
Поведение Мастера
32
- 71. ∙ Время жизни binary log
∙ Синхронизация
∙ Порядок записи в binary log
∙ Non-deterministic события и SBR
Поведение Мастера
32
- 75. Клиент
INSERT INTO ... ->
Binary log
SET TIMESTAMP...
SET sql_mode...
Statement-Based Binary Log Format
33
- 76. Клиент
INSERT INTO ... ->
Binary log
SET TIMESTAMP...
SET sql_mode...
INSERT INTO ...
Statement-Based Binary Log Format
33
- 78. ∙ Существует с первых версий
∙ Мало чувствительна к структуре таблиц на
слейве
SBR: Сильные Стороны
34
- 79. ∙ Существует с первых версий
∙ Мало чувствительна к структуре таблиц на
слейве
∙
Экономна
SBR: Сильные Стороны
34
- 80. ∙ Существует с первых версий
∙ Мало чувствительна к структуре таблиц на
слейве
∙
Экономна
∙ Понятна человеку
SBR: Сильные Стороны
34
- 81. ∙ Существует с первых версий
∙ Мало чувствительна к структуре таблиц на
слейве
∙
Экономна
∙ Понятна человеку
∙ Легко отлаживать
SBR: Сильные Стороны
34
- 82. mysql> SHOW BINLOG EVENTS IN ’mysql-bin.000316’ FROM 422;
+------------------+-----+------------+------------+-------------+---------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+------------+------------+-------------+---------------------------------+
| mysql-bin.000316 | 422 | Query | 1456667904 | 509 | BEGIN |
| mysql-bin.000316 | 509 | Query | 1456667904 | 609 | use ‘PgDay‘; update ai set f1=1 |
| mysql-bin.000316 | 609 | Xid | 1456667904 | 640 | COMMIT /* xid=60328 */ |
+------------------+-----+------------+------------+-------------+---------------------------------+
3 rows in set (0,12 sec)
№7: SHOW BINLOG EVENTS
35
- 83. ∙ Не все запросы одинаково безопасны
∙ Non-deterministic функции
∙
Расширения MySQL
∙ Триггеры
∙ Таблицы транзакционные и нет
∙ Временные таблицы
SBR: Слабые Стороны
36
- 84. ∙ Не все запросы одинаково безопасны
∙ Порядок имеет значение!
∙
Построчные блокировки
SBR: Слабые Стороны
36
- 85. ∙ Только при использовании SBR
Обновления в неправильном порядке
37
- 86. ∙ Только при использовании SBR
∙ Блокировки на уровне строк
Обновления в неправильном порядке
37
- 87. ∙ Только при использовании SBR
∙ Блокировки на уровне строк
∙ Триггеры
∙ SET GLOBAL slave_skip_counter– No GTIDs!
∙
Пропустите транзакцию – GTIDs
∙
Синхронизируйте таблицы!
Обновления в неправильном порядке
37
- 88. ∙ Только при использовании SBR
∙ Блокировки на уровне строк
∙ Триггеры
∙
Разные опции: для олдфагов
∙ Запустите слейв с опциями мастера
∙ Перезапустите SQL thread
∙
Исправлено в последних версиях
Обновления в неправильном порядке
37
- 94. Клиент
UPDATE ... ->
Binary log
SET TIMESTAMP...
SET sql_mode...
Строка до изменений
Строка с изменениями
Row-Based Binary Log Format
38
- 95. ∙
Безопасность
∙ Вам больше не нужно заботиться о
Порядке
Триггерах
Функциях
Какие запросы вы посылаете мастеру
RBR: Сильные Стороны
39
- 96. ∙ Более чувствительна к структуре таблиц
∙ Как правило больше данных
∙
––binlog_row_image=FULL | MINIMAL | NOBLOB
∙ Сложнее отлаживать
RBR: Слабые Стороны
40
- 97. $ 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 */ /*!*/;
...
№8: mysqlbinlog
41
- 98. $ 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 */ /*!*/;
№8: mysqlbinlog
42
- 101. ∙ Необходимо указать
∙
Название binary log на мастере
∙ Позицию
∙ С точки зрения отладки
∙
Событие выполняется по указателю позиции
∙ Легко пропустить
Позиционная
43
- 102. ∙ Необходимо указать
∙
Название binary log на мастере
∙ Позицию
∙ С точки зрения отладки
∙
Событие выполняется по указателю позиции
∙ Легко пропустить
∙ Легко переместить указатель в прошлое
Позиционная
43
- 103. ∙ Необходимо указать
∙
Название binary log на мастере
∙ Позицию
∙ С точки зрения отладки
∙
Событие выполняется по указателю позиции
∙ Легко пропустить
∙ Легко переместить указатель в прошлое
∙ Нет проверок
Позиционная
43
- 105. ∙ Каждая транзакция получает номер: GTID
∙ MySQL: AUTO_POSITION=1
Глобальные идентификаторы транзакций (GTID)
44
- 106. ∙ Каждая транзакция получает номер: GTID
∙ MySQL: AUTO_POSITION=1
∙
MariaDB: master_use_gtid = { slave_pos | current_pos }
Глобальные идентификаторы транзакций (GTID)
44
- 107. ∙ Каждая транзакция получает номер: GTID
∙ MySQL: AUTO_POSITION=1
∙
MariaDB: master_use_gtid = { slave_pos | current_pos }
∙
Не нужно указывать binary log и позицию
Глобальные идентификаторы транзакций (GTID)
44
- 108. ∙ Каждая транзакция получает номер: GTID
∙ MySQL: AUTO_POSITION=1
∙
MariaDB: master_use_gtid = { slave_pos | current_pos }
∙
Не нужно указывать binary log и позицию
∙
Сложно исправить ошибку
Глобальные идентификаторы транзакций (GTID)
44
- 113. ∙ Несколько наборов relay log
∙ Несколько IO thread-ов
Несколько Мастеров: С Точки Зрения Отладки
48
- 114. ∙ Несколько наборов relay log
∙ Несколько IO thread-ов
∙ Несколько SQL thread-ов
Несколько Мастеров: С Точки Зрения Отладки
48
- 115. ∙ Несколько наборов relay log
∙ Несколько IO thread-ов
∙ Несколько SQL thread-ов
∙
MySQL: ––slave_parallel_workers для каждого
Несколько Мастеров: С Точки Зрения Отладки
48
- 116. ∙ Несколько наборов relay log
∙ Несколько IO thread-ов
∙ Несколько SQL thread-ов
∙
MySQL: ––slave_parallel_workers для каждого
∙
Каналы независимые
Несколько Мастеров: С Точки Зрения Отладки
48
- 117. ∙ Несколько наборов relay log
∙ Несколько IO thread-ов
∙ Несколько SQL thread-ов
∙
MySQL: ––slave_parallel_workers для каждого
∙
Каналы независимые
∙
Ошибка на одном остановит только его
Несколько Мастеров: С Точки Зрения Отладки
48
- 118. ∙ Несколько наборов relay log
∙ Несколько IO thread-ов
∙ Несколько SQL thread-ов
∙
MySQL: ––slave_parallel_workers для каждого
∙
Каналы независимые
∙
Ошибка на одном остановит только его
∙
Одноимённые объекты =⇒ конфликты
Несколько Мастеров: С Точки Зрения Отладки
48
- 123. ∙ Все особенности сохраняются
∙ Умножайте сложности на количество
каналов
Сложные Развёртывания
52
- 124. ∙ Все особенности сохраняются
∙ Умножайте сложности на количество
каналов
∙
Контролируйте где и что вы пишете
Сложные Развёртывания
52
- 127. ∙ Лог ошибок
∙ На слэйве
∙ SHOW SLAVE STATUS
∙
MySQL: Таблицы в Performance Schema
∙ Системная база mysql
Основные Инструменты
54
- 128. ∙ Лог ошибок
∙ На слэйве
∙ На мастере
∙ SHOW MASTER STATUS
∙
SHOW BINLOG EVENTS
∙
mysqlbinlog
Основные Инструменты
54
- 129. ∙ Лог ошибок
∙ На слэйве
∙ На мастере
∙
Percona Toolkit
Основные Инструменты
54
- 130. ∙ Лог ошибок
∙ На слэйве
∙ На мастере
∙
Percona Toolkit
∙
MySQL Utilities
Основные Инструменты
54
- 131. ∙
Всегда доступна, требует настройки
∙
Асинхронная
∙
Мастер
∙ Хранит все изменения в binary log
Два формата: ROW и STATEMENT
∙ Слейв
∙
IO thread реплицирует с мастера в relay log
∙ SQL thread исполняет обновления
Несколько SQL thread-ов в 5.6+
Несколько каналов (мастеров) в 5.7+
∙ GTID в 5.6+
Особенности Репликации
55
- 132. ∙
Мастер
∙ Те же, что и для обычного сервера
∙ Больше пишет и проверяет
Основные Проблемы
56
- 134. ∙
Мастер
∙
Slave IO thread
∙
Slave SQL thread
∙ Обычные проблемы при выполнении запросов
∙ Обычные проблемы движка
∙
Меньше потоков выполнения, чем на мастере
Основные Проблемы
56
- 135. ∙ Basic Techniques – troubleshooting webinar
∙
Troubleshooting hardware resource usage
∙ Introduction into storage engine troubleshoot...
∙
Percona Toolkit
∙ MySQL Utilities
∙
К��ига MySQL High Availability
∙ MySQL Replication Team blog
Больше информации
57