SlideShare a Scribd company logo
Эффективная отладка репликации MySQL
June, 6, 2017
Света Смирнова
∙
Инженер тех. поддержки MySQL
∙ Автор
∙ MySQL Troubleshooting
∙ JSON UDF функции
∙ FILTER clause для MySQL
∙ Докладчик
∙ Percona Live, OOW, Fosdem,
DevConf, ...
Света Смирнова
2
∙ Существует с первых версий
Репликация в MySQL
3
∙ Существует с первых версий
∙ Простая в использовании
Репликация в MySQL
3
∙ Существует с первых версий
∙ Простая в использовании
∙ Требует минимальной настройки
Репликация в MySQL
3
∙
Мастер
∙
––log-bin
∙
––server-id
∙ GRANT REPLICATION SLAVE ON *.* ...
∙ Слейв
∙
––server-id
∙ CHANGE MASTER ...
∙ START SLAVE
Запустить репликацию
4
Типичные Ошибки Репликации
Репликация Остановлена
6
Слейв Отстаёт от Мастера
7
Возросшая Нагрузка на Мастере
8
Это не Полный Список!
9
Особенности репликации MySQL
Мастер Слейв
<- Инициирует
Асинхронная
11
Мастер Слейв
<- Инициирует
<- Запрашивает пакет
Асинхронная
11
Мастер
Отправляет пакет ->
Слейв
<- Инициирует
<- Запрашивает пакет
Асинхронная
11
Мастер
Отправляет пакет ->
Слейв
<- Инициирует
<- Запрашивает пакет
... ?
Асинхронная
11
∙ Ошибка сети
∙ Авторизация
Пришли ли Данные?
12
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
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
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
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
$ perror 1045
MySQL error code 1045 (ER_ACCESS_DENIED_ERROR): Access denied for user ’%-.48s’@’%-.64s’
(using password: %s)
№4: perror
17
∙
На слейве
$ 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
∙
На слейве
∙
На мастере
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
∙
На слейве
∙
На мастере
∙
Исправьте привилегии на мастере
GRANT REPLICATION SLAVE
ON *.* TO ’slave_user’@’%’
№5: MySQL Command Line Client
18
∙
На слейве
∙
На мастере
∙
Исправьте привилегии на мастере
∙
Перезапустите репликацию
№5: MySQL Command Line Client
18
Мастер Слейв
<- Инициирует
Полусинхронная (Semisynchrous plugin)
19
Мастер Слейв
<- Инициирует
<- Запрашивает пакет
Полусинхронная (Semisynchrous plugin)
19
Мастер
Отправляет пакет ->
Слейв
<- Инициирует
<- Запрашивает пакет
Полусинхронная (Semisynchrous plugin)
19
Мастер
Отправляет пакет ->
Ждёт "Ack"
Слейв
<- Инициирует
<- Запрашивает пакет
Полусинхронная (Semisynchrous plugin)
19
Мастер
Отправляет пакет ->
Ждёт "Ack"
Слейв
<- Инициирует
<- Запрашивает пакет
<- Отправляет "Ack"
Полусинхронная (Semisynchrous plugin)
19
∙ Запись на мастере медленнее асинхронной
Полусинхронная: с точки зрения отладки
20
∙ Запись на мастере медленнее асинхронной
∙ Сколько "Ack"-ов ждёт мастер?
Полусинхронная: с точки зрения отладки
20
∙ Запись на мастере медленнее асинхронной
∙ Сколько "Ack"-ов ждёт мастер?
∙ До версии 5.7: от одного слейва
Полусинхронная: с точки зрения отладки
20
∙ Запись на мастере медленнее асинхронной
∙ Сколько "Ack"-ов ждёт мастер?
∙ До версии 5.7: от одного слейва
∙
Сейчас в MySQL:
rpl_semi_sync_master_wait_for_slave_count
Полусинхронная: с точки зрения отладки
20
∙ Запись на мастере медленнее асинхронной
∙ Сколько "Ack"-ов ждёт мастер?
∙ До версии 5.7: от одного слейва
∙
Сейчас в MySQL:
rpl_semi_sync_master_wait_for_slave_count
∙ Остальных ждать не будет
Полусинхронная: с точки зрения отладки
20
∙ Запись на мастере медленнее асинхронной
∙ Сколько "Ack"-ов ждёт мастер?
∙ Что происходит при timeout-е?
Полусинхронная: с точки зрения отладки
20
∙ Запись на мастере медленнее асинхронной
∙ Сколько "Ack"-ов ждёт мастер?
∙ Что происходит при timeout-е?
∙ Репликация становится асинхронной
Полусинхронная: с точки зрения отладки
20
∙ Запись на мастере медленнее асинхронной
∙ Сколько "Ack"-ов ждёт мастер?
∙ Что происходит при timeout-е?
∙
Что значит "Ack"?
Полусинхронная: с точки зрения отладки
20
∙ Запись на мастере медленнее асинхронной
∙ Сколько "Ack"-ов ждёт мастер?
∙ Что происходит при timeout-е?
∙
Что значит "Ack"?
∙ Событие записано в relay log
Полусинхронная: с точки зрения отладки
20
∙ Запись на мастере медленнее асинхронной
∙ Сколько "Ack"-ов ждёт мастер?
∙ Что происходит при timeout-е?
∙
Что значит "Ack"?
∙ Событие записано в relay log
∙ Неизвестно, выполнено ли оно
Полусинхронная: с точки зрения отладки
20
IO thread
Читает с мастера
SQL thread
Два типа потоков
21
IO thread
Читает с мастера
Сохраняет в relay log
SQL thread
Два типа потоков
21
IO thread
Читает с мастера
Сохраняет в relay log
SQL thread
<- Читает из relay log
Два типа потоков
21
IO thread
Читает с мастера
Сохраняет в relay log
SQL thread
<- Читает из relay log
Исполняет
Два типа потоков
21
∙
Проще в отладке
∙ Медленнее мастера
∙ При больших нагрузках
Один SQL Поток
22
Запись на Мастере
23
Запись на Слейве: Один Поток
24
Несколько SQL-потоков: 5.6+
25
∙ 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
∙ MariaDB: ––slave_parallel_threads
∙ MariaDB: ––slave_parallel_max_queued
∙ MariaDB: ––slave_domain_parallel_threads
∙
MariaDB: ––slave_parallel_mode=optimistic | conservative |
aggressive | minimal | none
Настройка Производительности
26
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
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
∙
Разные данные
∙
Слейв не может выполнить event из relay log
Какие Бывают Ошибки?
28
∙
Разные данные
∙
Слейв не может выполнить event из relay log
∙ Разные ошибки на мастере и слейве
∙ Триггеры
∙ Транзакционные и нетранзакционные
таблицы одновременно
Какие Бывают Ошибки?
28
∙ Таблица менялась вне репликации?
∙ Как?
∙
Конфликт с обновлениями на мастере?
Разные Данные на Мастере и Слейве
29
∙ Таблица менялась вне репликации?
∙ Идентична ли структура таблиц?
∙ Percona Toolkit
pt-table-checksum, pt-table-sync
∙
MySQL Utilities
mysqlrplsync, mysqldbcompare, mysqldiff
Разные Данные на Мастере и Слейве
29
∙ Таблица менялась вне репликации?
∙ Идентична ли структура таблиц?
∙ Обновления в неправильном порядке?
∙ mysqlbinlog
∙
Логика приложения на мастере
Разные Данные на Мастере и Слейве
29
Мастер
Получает изменение
Табличный движок
Логическая
30
Мастер
Получает изменение
Передаёт движку ->
Табличный движок
Логическая
30
Мастер
Получает изменение
Передаёт движку ->
Табличный движок
Пишет в таблицу
Логическая
30
Мастер
Получает изменение
Передаёт движку ->
Табличный движок
Пишет в таблицу
<- Передаёт управление
Логическая
30
Мастер
Получает изменение
Передаёт движку ->
Пишет в binary log
Табличный движок
Пишет в таблицу
<- Передаёт управление
Логическая
30
Мастер
Получает изменение
Передаёт движку ->
Пишет в binary log
Синхронизируется ->
Табличный движок
Пишет в таблицу
<- Передаёт управление
<- Синхронизируется
Логическая
30
∙
Более активная запись
∙
RBR: ––binlog_row_image
Производительность Мастера
31
∙
Более активная запись
∙
RBR: ––binlog_row_image
∙
––binlog_cache_size
Наблюдайте Binlog_cache_disk_use
Производительность Мастера
31
∙
Более активная запись
∙
RBR: ––binlog_row_image
∙
––binlog_cache_size
Наблюдайте Binlog_cache_disk_use
∙ ––binlog_stmt_cache_size
Наблюдайте Binlog_stmt_cache_disk_use
Производительность Мастера
31
∙
Более активная запись
∙
Синхронизация
∙ ––binlog_sync
∙
Не отключайте!
∙ Может быть больше 1
Производительность Мастера
31
∙ Время жизни binary log
∙ ––expire_log_days
Поведение Мастера
32
∙ Время жизни binary log
∙ Синхронизация
∙ SBR несовместима с READ COMMITTED и READ
UNCOMMITTED
Поведение Мастера
32
∙ Время жизни binary log
∙ Синхронизация
∙ Порядок записи в binary log
∙ Non-deterministic события и SBR
Поведение Мастера
32
Клиент Binary log
Statement-Based Binary Log Format
33
Клиент
INSERT INTO ... ->
Binary log
Statement-Based Binary Log Format
33
Клиент
INSERT INTO ... ->
Binary log
SET TIMESTAMP...
Statement-Based Binary Log Format
33
Клиент
INSERT INTO ... ->
Binary log
SET TIMESTAMP...
SET sql_mode...
Statement-Based Binary Log Format
33
Клиент
INSERT INTO ... ->
Binary log
SET TIMESTAMP...
SET sql_mode...
INSERT INTO ...
Statement-Based Binary Log Format
33
∙ Существует с первых версий
SBR: Сильные Стороны
34
∙ Существует с первых версий
∙ Мало чувствительна к структуре таблиц на
слейве
SBR: Сильные Стороны
34
∙ Существует с первых версий
∙ Мало чувствительна к структуре таблиц на
слейве
∙
Экономна
SBR: Сильные Стороны
34
∙ Существует с первых версий
∙ Мало чувствительна к структуре таблиц на
слейве
∙
Экономна
∙ Понятна человеку
SBR: Сильные Стороны
34
∙ Существует с первых версий
∙ Мало чувствительна к структуре таблиц на
слейве
∙
Экономна
∙ Понятна человеку
∙ Легко отлаживать
SBR: Сильные Стороны
34
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
∙ Не все запросы одинаково безопасны
∙ Non-deterministic функции
∙
Расширения MySQL
∙ Триггеры
∙ Таблицы транзакционные и нет
∙ Временные таблицы
SBR: Слабые Стороны
36
∙ Не все запросы одинаково безопасны
∙ Порядок имеет значение!
∙
Построчные блокировки
SBR: Слабые Стороны
36
∙ Только при использовании SBR
Обновления в неправильном порядке
37
∙ Только при использовании SBR
∙ Блокировки на уровне строк
Обновления в неправильном порядке
37
∙ Только при использовании SBR
∙ Блокировки на уровне строк
∙ Триггеры
∙ SET GLOBAL slave_skip_counter– No GTIDs!
∙
Пропустите транзакцию – GTIDs
∙
Синхронизируйте таблицы!
Обновления в неправильном порядке
37
∙ Только при использовании SBR
∙ Блокировки на уровне строк
∙ Триггеры
∙
Разные опции: для олдфагов
∙ Запустите слейв с опциями мастера
∙ Перезапустите SQL thread
∙
Исправлено в последних версиях
Обновления в неправильном порядке
37
Клиент Binary log
Row-Based Binary Log Format
38
Клиент
UPDATE ... ->
Binary log
Row-Based Binary Log Format
38
Клиент
UPDATE ... ->
Binary log
SET TIMESTAMP...
Row-Based Binary Log Format
38
Клиент
UPDATE ... ->
Binary log
SET TIMESTAMP...
SET sql_mode...
Row-Based Binary Log Format
38
Клиент
UPDATE ... ->
Binary log
SET TIMESTAMP...
SET sql_mode...
Строка до изменений
Row-Based Binary Log Format
38
Клиент
UPDATE ... ->
Binary log
SET TIMESTAMP...
SET sql_mode...
Строка до изменений
Строка с изменениями
Row-Based Binary Log Format
38
∙
Безопасность
∙ Вам больше не нужно заботиться о
Порядке
Триггерах
Функциях
Какие запросы вы посылаете мастеру
RBR: Сильные Стороны
39
∙ Более чувствительна к структуре таблиц
∙ Как правило больше данных
∙
––binlog_row_image=FULL | MINIMAL | NOBLOB
∙ Сложнее отлаживать
RBR: Слабые Стороны
40
$ 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
$ 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
∙ Необходимо указать
∙
Название binary log на мастере
∙ Позицию
Позиционная
43
∙ Необходимо указать
∙
Название binary log на мастере
∙ Позицию
∙ С точки зрения отладки
∙
Событие выполняется по указателю позиции
Позиционная
43
∙ Необходимо указать
∙
Название binary log на мастере
∙ Позицию
∙ С точки зрения отладки
∙
Событие выполняется по указателю позиции
∙ Легко пропустить
Позиционная
43
∙ Необходимо указать
∙
Название binary log на мастере
∙ Позицию
∙ С точки зрения отладки
∙
Событие выполняется по указателю позиции
∙ Легко пропустить
∙ Легко переместить указатель в прошлое
Позиционная
43
∙ Необходимо указать
∙
Название binary log на мастере
∙ Позицию
∙ С точки зрения отладки
∙
Событие выполняется по указателю позиции
∙ Легко пропустить
∙ Легко переместить указатель в прошлое
∙ Нет проверок
Позиционная
43
∙ Каждая транзакция получает номер: GTID
Глобальные идентификаторы транзакций (GTID)
44
∙ Каждая транзакция получает номер: GTID
∙ MySQL: AUTO_POSITION=1
Глобальные идентификаторы транзакций (GTID)
44
∙ Каждая транзакция получает номер: GTID
∙ MySQL: AUTO_POSITION=1
∙
MariaDB: master_use_gtid = { slave_pos | current_pos }
Глобальные идентификаторы транзакций (GTID)
44
∙ Каждая транзакция получает номер: GTID
∙ MySQL: AUTO_POSITION=1
∙
MariaDB: master_use_gtid = { slave_pos | current_pos }
∙
Не нужно указывать binary log и позицию
Глобальные идентификаторы транзакций (GTID)
44
∙ Каждая транзакция получает номер: GTID
∙ MySQL: AUTO_POSITION=1
∙
MariaDB: master_use_gtid = { slave_pos | current_pos }
∙
Не нужно указывать binary log и позицию
∙
Сложно исправить ошибку
Глобальные идентификаторы транзакций (GTID)
44
sveta@thinkie> mysqlslavetrx –gtid-set=fb776095-8474-11e5-ad41-30b5c2208a0f:3 
–slaves=root:@127.0.0.1:13001
WARNING: Using a password on the command line interface can be insecure.
#
# GTID set to be skipped for each server:
# - 127.0.0.1@13001: fb776095-8474-11e5-ad41-30b5c2208a0f:3
#
# Injecting empty transactions for ’127.0.0.1:13001’...
#
#...done.
#
№9: mysqlslavetrx
45
MySQL Репликация Может Быть Любой
Несколько Мастеров (Multi-channel): 5.7+
47
∙ Несколько наборов relay log
Несколько Мастеров: С Точки Зрения Отладки
48
∙ Несколько наборов relay log
∙ Несколько IO thread-ов
Несколько Мастеров: С Точки Зрения Отладки
48
∙ Несколько наборов relay log
∙ Несколько IO thread-ов
∙ Несколько SQL thread-ов
Несколько Мастеров: С Точки Зрения Отладки
48
∙ Несколько наборов relay log
∙ Несколько IO thread-ов
∙ Несколько SQL thread-ов
∙
MySQL: ––slave_parallel_workers для каждого
Несколько Мастеров: С Точки Зрения Отладки
48
∙ Несколько наборов relay log
∙ Несколько IO thread-ов
∙ Несколько SQL thread-ов
∙
MySQL: ––slave_parallel_workers для каждого
∙
Каналы независимые
Несколько Мастеров: С Точки Зрения Отладки
48
∙ Несколько наборов relay log
∙ Несколько IO thread-ов
∙ Несколько SQL thread-ов
∙
MySQL: ––slave_parallel_workers для каждого
∙
Каналы независимые
∙
Ошибка на одном остановит только его
Несколько Мастеров: С Точки Зрения Отладки
48
∙ Несколько наборов relay log
∙ Несколько IO thread-ов
∙ Несколько SQL thread-ов
∙
MySQL: ––slave_parallel_workers для каждого
∙
Каналы независимые
∙
Ошибка на одном остановит только его
∙
Одноимённые объекты =⇒ конфликты
Несколько Мастеров: С Точки Зрения Отладки
48
Круговая
49
Звезда
50
Креативная
51
∙ Все особенности сохраняются
Сложные Развёртывания
52
∙ Все особенности сохраняются
∙ Умножайте сложности на количество
каналов
Сложные Развёртывания
52
∙ Все особенности сохраняются
∙ Умножайте сложности на количество
каналов
∙
Контролируйте где и что вы пишете
Сложные Развёртывания
52
Итоги
∙ Лог ошибок
Основные Инструменты
54
∙ Лог ошибок
∙ На слэйве
∙ SHOW SLAVE STATUS
∙
MySQL: Таблицы в Performance Schema
∙ Системная база mysql
Основные Инструменты
54
∙ Лог ошибок
∙ На слэйве
∙ На мастере
∙ SHOW MASTER STATUS
∙
SHOW BINLOG EVENTS
∙
mysqlbinlog
Основные Инструменты
54
∙ Лог ошибок
∙ На слэйве
∙ На мастере
∙
Percona Toolkit
Основные Инструменты
54
∙ Лог ошибок
∙ На слэйве
∙ На мастере
∙
Percona Toolkit
∙
MySQL Utilities
Основные Инструменты
54
∙
Всегда доступна, требует настройки
∙
Асинхронная
∙
Мастер
∙ Хранит все изменения в binary log
Два формата: ROW и STATEMENT
∙ Слейв
∙
IO thread реплицирует с мастера в relay log
∙ SQL thread исполняет обновления
Несколько SQL thread-ов в 5.6+
Несколько каналов (мастеров) в 5.7+
∙ GTID в 5.6+
Особенности Репликации
55
∙
Мастер
∙ Те же, что и для обычного сервера
∙ Больше пишет и проверяет
Основные Проблемы
56
∙
Мастер
∙
Slave IO thread
∙ Обычные проблемы с сетью
∙ mysql command line client для тестов
Основные Проблемы
56
∙
Мастер
∙
Slave IO thread
∙
Slave SQL thread
∙ Обычные проблемы при выполнении запросов
∙ Обычные проблемы движка
∙
Меньше потоков выполнения, чем на мастере
Основные Проблемы
56
∙ 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
http://www.slideshare.net/SvetaSmirnova
https://twitter.com/svetsmirnova
https://github.com/svetasmirnova
Спасибо!
58
Percona Live Europe Call for Papers & Registration!
59

More Related Content

Эффективная отладка репликации MySQL

  • 1. Эффективная отладка репликации MySQL June, 6, 2017 Света Смирнова
  • 2. ∙ Инженер тех. поддержки MySQL ∙ Автор ∙ MySQL Troubleshooting ∙ JSON UDF функции ∙ FILTER clause для MySQL ∙ Докладчик ∙ Percona Live, OOW, Fosdem, DevConf, ... Света Смирнова 2
  • 3. ∙ Существует с первых версий Репликация в MySQL 3
  • 4. ∙ Существует с первых версий ∙ Простая в использовании Репликация в MySQL 3
  • 5. ∙ Существует с первых версий ∙ Простая в использовании ∙ Требует минимальной настройки Репликация в MySQL 3
  • 6. ∙ Мастер ∙ ––log-bin ∙ ––server-id ∙ GRANT REPLICATION SLAVE ON *.* ... ∙ Слейв ∙ ––server-id ∙ CHANGE MASTER ... ∙ START SLAVE Запустить репликацию 4
  • 11. Это не Полный Список! 9
  • 14. Мастер Слейв <- Инициирует <- Запрашивает пакет Асинхронная 11
  • 15. Мастер Отправляет пакет -> Слейв <- Инициирует <- Запрашивает пакет Асинхронная 11
  • 16. Мастер Отправляет пакет -> Слейв <- Инициирует <- Запрашивает пакет ... ? Асинхронная 11
  • 17. ∙ Ошибка сети ∙ Авторизация Пришли ли Данные? 12
  • 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
  • 25. ∙ На слейве ∙ На мастере ∙ Исправьте привилегии на мастере GRANT REPLICATION SLAVE ON *.* TO ’slave_user’@’%’ №5: MySQL Command Line Client 18
  • 26. ∙ На слейве ∙ На мастере ∙ Исправьте привилегии на мастере ∙ Перезапустите репликацию №5: MySQL Command Line Client 18
  • 28. Мастер Слейв <- Инициирует <- Запрашивает пакет Полусинхронная (Semisynchrous plugin) 19
  • 29. Мастер Отправляет пакет -> Слейв <- Инициирует <- Запрашивает пакет Полусинхронная (Semisynchrous plugin) 19
  • 30. Мастер Отправляет пакет -> Ждёт "Ack" Слейв <- Инициирует <- Запрашивает пакет Полусинхронная (Semisynchrous plugin) 19
  • 31. Мастер Отправляет пакет -> Ждёт "Ack" Слейв <- Инициирует <- Запрашивает пакет <- Отправляет "Ack" Полусинхронная (Semisynchrous plugin) 19
  • 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
  • 42. IO thread Читает с мастера SQL thread Два типа потоков 21
  • 43. IO thread Читает с мастера Сохраняет в relay log SQL thread Два типа потоков 21
  • 44. IO thread Читает с мастера Сохраняет в relay log SQL thread <- Читает из relay log Два типа потоков 21
  • 45. IO thread Читает с мастера Сохраняет в relay log SQL thread <- Читает из relay log Исполняет Два типа потоков 21
  • 46. ∙ Проще в отладке ∙ Медленнее мастера ∙ При больших нагрузках Один SQL Поток 22
  • 48. Запись на Слейве: Один Поток 24
  • 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
  • 54. ∙ Разные данные ∙ Слейв не может выполнить event из relay log Какие Бывают Ошибки? 28
  • 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
  • 60. Мастер Получает изменение Передаёт движку -> Табличный движок Логическая 30
  • 61. Мастер Получает изменение Передаёт движку -> Табличный движок Пишет в таблицу Логическая 30
  • 62. Мастер Получает изменение Передаёт движку -> Табличный движок Пишет в таблицу <- Передаёт управление Логическая 30
  • 63. Мастер Получает изменение Передаёт движку -> Пишет в binary log Табличный движок Пишет в таблицу <- Передаёт управление Логическая 30
  • 64. Мастер Получает изменение Передаёт движку -> Пишет в binary log Синхронизируется -> Табличный движок Пишет в таблицу <- Передаёт управление <- Синхронизируется Логическая 30
  • 65. ∙ Более активная запись ∙ RBR: ––binlog_row_image Производительность Мастера 31
  • 66. ∙ Более активная запись ∙ RBR: ––binlog_row_image ∙ ––binlog_cache_size Наблюдайте Binlog_cache_disk_use Производительность Мастера 31
  • 67. ∙ Более активная запись ∙ RBR: ––binlog_row_image ∙ ––binlog_cache_size Наблюдайте Binlog_cache_disk_use ∙ ––binlog_stmt_cache_size Наблюдайте Binlog_stmt_cache_disk_use Производительность Мастера 31
  • 68. ∙ Более активная запись ∙ Синхронизация ∙ ––binlog_sync ∙ Не отключайте! ∙ Может быть больше 1 Производительность Мастера 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
  • 73. Клиент INSERT INTO ... -> Binary log Statement-Based Binary Log Format 33
  • 74. Клиент INSERT INTO ... -> Binary log SET TIMESTAMP... Statement-Based Binary Log Format 33
  • 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
  • 77. ∙ Существует с первых версий SBR: Сильные Стороны 34
  • 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
  • 89. Клиент Binary log Row-Based Binary Log Format 38
  • 90. Клиент UPDATE ... -> Binary log Row-Based Binary Log Format 38
  • 91. Клиент UPDATE ... -> Binary log SET TIMESTAMP... Row-Based Binary Log Format 38
  • 92. Клиент UPDATE ... -> Binary log SET TIMESTAMP... SET sql_mode... Row-Based Binary Log Format 38
  • 93. Клиент UPDATE ... -> Binary log SET TIMESTAMP... SET sql_mode... Строка до изменений Row-Based Binary Log Format 38
  • 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
  • 99. ∙ Необходимо указать ∙ Название binary log на мастере ∙ Позицию Позиционная 43
  • 100. ∙ Необходимо указать ∙ Название binary log на мастере ∙ Позицию ∙ С точки зрения отладки ∙ Событие выполняется по указателю позиции Позиционная 43
  • 101. ∙ Необходимо указать ∙ Название binary log на мастере ∙ Позицию ∙ С точки зрения отладки ∙ Событие выполняется по указателю позиции ∙ Легко пропустить Позиционная 43
  • 102. ∙ Необходимо указать ∙ Название binary log на мастере ∙ Позицию ∙ С точки зрения отладки ∙ Событие выполняется по указателю позиции ∙ Легко пропустить ∙ Легко переместить указатель в прошлое Позиционная 43
  • 103. ∙ Необходимо указать ∙ Название binary log на мастере ∙ Позицию ∙ С точки зрения отладки ∙ Событие выполняется по указателю позиции ∙ Легко пропустить ∙ Легко переместить указатель в прошлое ∙ Нет проверок Позиционная 43
  • 104. ∙ Каждая транзакция получает номер: GTID Глобальные идентификаторы транзакций (GTID) 44
  • 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
  • 109. sveta@thinkie> mysqlslavetrx –gtid-set=fb776095-8474-11e5-ad41-30b5c2208a0f:3 –slaves=root:@127.0.0.1:13001 WARNING: Using a password on the command line interface can be insecure. # # GTID set to be skipped for each server: # - 127.0.0.1@13001: fb776095-8474-11e5-ad41-30b5c2208a0f:3 # # Injecting empty transactions for ’127.0.0.1:13001’... # #...done. # №9: mysqlslavetrx 45
  • 112. ∙ Несколько наборов relay log Несколько Мастеров: С Точки Зрения Отладки 48
  • 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
  • 122. ∙ Все особенности сохраняются Сложные Развёртывания 52
  • 123. ∙ Все особенности сохраняются ∙ Умножайте сложности на количество каналов Сложные Развёртывания 52
  • 124. ∙ Все особенности сохраняются ∙ Умножайте сложности на количество каналов ∙ Контролируйте где и что вы пишете Сложные Развёртывания 52
  • 126. ∙ Лог ошибок Основные Инструменты 54
  • 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
  • 133. ∙ Мастер ∙ Slave IO thread ∙ Обычные проблемы с сетью ∙ mysql command line client для тестов Основные Проблемы 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
  • 137. Percona Live Europe Call for Papers & Registration! 59