Статьи

Подробнее о многопоточной репликации MySQL 5.6 и GTID (и 25 февраля вебинар)

Первоначально Написал Стефан Комбоудон

В предыдущем посте под названием «Многопоточная репликация с MySQL 5.6: использовать GTID» я объяснил, что использование репликации GTID является почти обязательным требованием при использовании MySQL 5.6 MTS. Давайте теперь посмотрим, как выполнять повседневные операции, когда оба MTS и GTID включены. (На следующей неделе я также представлю соответствующий вебинар под названием «Многопоточная репликация в MySQL 5.6 и 5.7»).

Видя пробелы в исполнении

Если вы посмотрите во SHOW SLAVE STATUSвремя работы ведомого, вы можете не ожидать такого вывода:

[...]
Executed_Gtid_Set: 1381aa44-9a60-11e4-b6d8-94dbc999324d:1-2520:2522:2524:2526-2528:2531-2533:2536-2538:2540-2541:2544:2546-2547:2550-2551:2555:2565-2566:2569:2575-2577:2579-2581:2584-2586:2588:2590-2591:2595-2597:2599:2602:2604-2605:2607-2610:2613:2615-2620:2622-2624:2626-2627:2629:2631:2634:2636-2639:2641-2642:2644:2646-2647:2649:2651-2653:2657-2658:2661-2662:2666-2672:2676-2678:2680:2683-2684:2686-2693:2695:2701:2704:2706-2707:2709:2711:2713-2714:2717:2720-2722:2729-2730:2735:2744:2746:2749:2751-2752:2762:2764-2765:2768-2769:2771:2774:2776:2780-2782:2784:2786-2787:2789:2791:2793:2800:2803:2805-2807:2809:2811-2814:2816-2817:2819-2820:2822-2826:2828-2834:2837-2840:2842:2844-2845:2847:2850-2851:2853:2855:2857-2859:2861-2863:2865-2868:2870-2871:2873-2874:2878:2880-2884:2886-2888:2891:2893:2895-2896:2899:2903:2906-2907:2910:2912:2915-2918:2921-2923:2925-2926:2930:2932:2934:2936:2939-2940:2943-2944:2946:2948-2957:2966:2969-2970:2974:2976:2979-2980:2982:2985:2987:2989:2994:2996-2997:2999:3001:3003:3006:3008:3011-3013
[...]

Ой! Что означает этот безумный список GTID?

Это на самом деле легко понять, если вы знаете, что GTID всей выполненной транзакции отслеживается Executed_Gtid_Setи что промежутки между выполнением допустимы с MTS.

Тогда 1-2520:2522:2524просто означает, что были выполнены транзакции # 1 — # 2520, а также транзакции # 2522 и # 2524, но не # 2521 и # 2523.

Вы также можете видеть, что разрыв в конкретной позиции не будет длиться долго. Если вы запустите SHOW SLAVE STATUSмгновение спустя, вы увидите:

[...]
Executed_Gtid_Set: 1381aa44-9a60-11e4-b6d8-94dbc999324d:1-4095:4098:4100:4103-4105[...]

На этот раз первый разрыв выполнения для транзакции # 4096.

Если вы остановите запись на главном сервере, все пробелы будут заполнены, как только репликация перехватит, и вы просто увидите:

[...]
Executed_Gtid_Set: 1381aa44-9a60-11e4-b6d8-94dbc999324d:1-20599
[...]

Работа с ошибками репликации

Скажем, репликация остановлена ​​с ошибкой, и вы хотите пропустить оскорбительное событие. Единственный вариант репликации GTID — ввести пустую транзакцию, что, в свою очередь, означает, что вы должны знать GTID транзакции, которую хотите пропустить.

Давайте посмотрим на SHOW SLAVE STATUS:

Executed_Gtid_Set: 1381aa44-9a60-11e4-b6d8-94dbc999324d:1-1052769:1052805-1052806:1052808:1052810-1052811:1052814:1052816:1052819:1052823:1052825:1052827-1052828:1052830-1052831:1052835:1052838:1052840:1052842:1052844-1052846:1052848-1052849:1052851-1052852:1052855-1052857:1052859:1052862-1052863:1052867-1052868:1052870:1052873-1052875:1052878-1052879:1052882-1052883:1052885:1052887:1052890-1052892:1052896:1052901:1052905:1052908-1052909:1052911:1052915:1052917-1052918:1052922-1052923:1052927-1052929:1052931-1052933:1052937-1052938:1052940:1052943:1052946:1052948-1052949:1052953:1052955-1052956:1052958:1052962-1052964:1052967-1052969:1052972:1052975-1052977:1052979:1052981-1052983:1052985:1052987:1052989:1052991:1052993-1052995:1052999:1053001:1053003:1053005-1053016:1053018:1053020:1053024-1053026:1053029:1053032-1053034:1053037-1053038:1053040:1053043:1053045-1053046

Так какую транзакцию мы должны пропустить: вероятно 1381aa44-9a60-11e4-b6d8-94dbc999324d:1052770, верно? Это первая транзакция, которая не может быть выполнена.

Это подтверждается, глядя на Last_SQL_Error field:

Last_SQL_Error: Worker 0 failed executing transaction '1381aa44-9a60-11e4-b6d8-94dbc999324d:1052770' [...]

Как только вы знаете, что GTID пропускается, легко перезапустить репликацию (и исправить несоответствие позже):

mysql> SET gtid_next='1381aa44-9a60-11e4-b6d8-94dbc999324d:1052770';
mysql> BEGIN;COMMIT;
mysql> SET gtid_next='AUTOMATIC';
mysql> START SLAVE;

Принимая резервные копии

При использовании репликации GTID создание резервной копии из многопоточного ведомого устройства совсем не сложно.

С Percona XtraBackup просто добавьте эту --slave-infoопцию как обычно, и вы получите список выполненных GTID в xtrabackup_slave_infoфайле:

$ less xtrabackup_slave_info
SET GLOBAL gtid_purged='1381aa44-9a60-11e4-b6d8-94dbc999324d:1-1095246:1095248-1095249:1095253-1095254:1095257-1095266:1095270-1095271:1095273:1095275:1095284-1095285:1095296:1095305:1095311-1095312:1095315-1095316:1095318:1095321:1095323-1095324:1095326-1095332:1095335:1095337-1095338:1095348-1095351:1095353-1095354:1095356:1095358-1095359:1095363-1095364:1095366:1095368-1095369:1095372:1095375-1095376:1095378:1095380-1095385:1095388:1095390-1095392:1095394-1095411:1095419:1095424-1095425:1095428:1095430-1095433:1095437-1095439:1095442:1095444-1095445:1095447:1095449:1095461-1095464:1095468:1095473:1095482-1095484:1095488-1095490:1095494:1095496-1095497:1095499-1095500:1095502:1095505:1095507:1095509:1095511-1095516:1095521:1095524-1095525:1095527:1095530-1095531:1095534-1095552:1095554:1095557:1095559-1095560:1095563:1095566:1095569:1095572-1095573:1095582:1095594-1095595:1095597:1095601-1095605:1095607-1095610:1095612-1095614:1095618:1095621-1095623:1095625-1095628:1095630:1095632:1095634:1095636:1095639-1095642:1095645:1095649:1095659:1095661:1095664-1095665:1095667-1095669:1095671:1095674';
CHANGE MASTER TO MASTER_AUTO_POSITION=1

Тогда запустить репликацию на новом экземпляре, загруженном из этой резервной копии, очень просто:

mysql> SET GLOBAL gtid_purged='...';
mysql> RESET SLAVE ALL;
mysql> CHANGE MASTER TO [...], MASTER_AUTO_POSITION=1;
mysql> START SLAVE;

С mysqldump, просто --dump-slaveотмените опцию, так как список выполненных GTID будет автоматически добавлен вверху дампа:

-- MySQL dump 10.13  Distrib 5.6.22, for linux-glibc2.5 (x86_64)
[...]
--
-- GTID state at the beginning of the backup
--
SET @@GLOBAL.GTID_PURGED='1381aa44-9a60-11e4-b6d8-94dbc999324d:1-1095246:1095248-1095249:1095253-1095254:1095257-1095266:1095270-1095271:1095273:1095275:1095284-1095285:1095296:1095305:1095311-1095312:1095315-1095316:1095318:1095321:1095323-1095324:1095326-1095332:1095335:1095337-1095338:1095348-1095351:1095353-1095354:1095356:1095358-1095359:1095363-1095364:1095366:1095368-1095369:1095372:1095375-1095376:1095378:1095380-1095385:1095388:1095390-1095392:1095394-1095411:1095419:1095424-1095425:1095428:1095430-1095433:1095437-1095439:1095442:1095444-1095445:1095447:1095449:1095461-1095464:1095468:1095473:1095482-1095484:1095488-1095490:1095494:1095496-1095497:1095499-1095500:1095502:1095505:1095507:1095509:1095511-1095516:1095521:1095524-1095525:1095527:1095530-1095531:1095534-1095552:1095554:1095557:1095559-1095560:1095563:1095566:1095569:1095572-1095573:1095582:1095594-1095595:1095597:1095601-1095605:1095607-1095610:1095612-1095614:1095618:1095621-1095623:1095625-1095628:1095630:1095632:1095634:1095636:1095639-1095642:1095645:1095649:1095659:1095661:1095664-1095665:1095667-1095669:1095671:1095674';

И затем репликация может быть запущена, как указано ранее.

Вывод

SHOW SLAVE STATUSНа первый взгляд может показаться, что разрывы выполнения в выходных данных могут вызывать беспокойство, и, конечно, вам, возможно, придется изменить несколько привычек, но в целом при использовании GTID и MTS особых проблем не возникает.

На следующей неделе я представлю бесплатный вебинар по многопоточной репликации (среда, 25 февраля, 10:00 по тихоокеанскому времени). Если вы заинтересованы в получении дополнительной информации по этой теме, не стесняйтесь зарегистрироваться . Он также будет записан — вы сможете использовать эту же ссылку для просмотра презентации и загрузки моих слайдов.