17.1.1.2 Групповая репликация
Групповая репликация — это техника, которая может использоваться для реализации отказоустойчивых систем. Группа репликации — это набор серверов, каждый из которых имеет свою полную копию данных (схема репликации shared-nothing), и взаимодействуют друг с другом посредством обмена сообщениями. Слой коммуникации обеспечивает набор гарантий, таких как атомарная доставка сообщений и доставка сообщений в полном порядке. Эти свойства являются очень мощными, что приводит к очень полезным абстракциям, которые можно использовать для построения более продвинутых решений для репликации баз данных.
MySQL Групповая репликация основана на таких свойствах и абстракциях и реализует протокол репликации многоисточниковых обновлений повсюду. Группа репликации формируется из нескольких серверов, и каждый сервер в группе может выполнять транзакции независимо в любое время. Однако все транзакции чтения/записи выполняются только после их утверждения группой. Другими словами, для любой транзакции чтения/записи группа должна принять решение о ее подтверждении или отказе, поэтому операция подтверждения не является односторонним решением исходного сервера. Транзакции только для чтения не требуют координации в группе и выполняются немедленно.
Когда транзакция чтения/записи готова к подтверждению на исходном сервере, сервер атомарно транслирует значения записи (строки, которые были изменены) и соответствующий набор записи (уникальные идентификаторы строк, которые были обновлены). Поскольку транзакция передается через атомарное транслирование, все серверы в группе либо получают транзакцию, либо нет. Если они ее получают, то все получают ее в том же порядке относительно других транзакций, которые были отправлены ранее. Таким образом, все серверы получают один и тот же набор транзакций в одном и том же порядке, и устанавливается глобальный полный порядок для транзакций.
Однако могут возникнуть конфликты между транзакциями, которые выполняются одновременно на разных серверах. Такие конфликты обнаруживаются путем проверки и сравнения наборов записи двух разных и одновременных транзакций в процессе, называемом сертификацией. Во время сертификации обнаружение конфликтов выполняется на уровне строки: если две одновременные транзакции, выполненные на разных серверах, обновляют одну и ту же строку, то возникает конфликт. Процедура разрешения конфликтов заключается в том, что транзакция, которая была заказана первой, подтверждается на всех серверах, а транзакция, заказанная второй, прерывается и, следовательно, откатывается на исходном сервере и отбрасывается другими серверами в группе. Например, если t1 и t2 выполняются одновременно в разных узлах, оба изменяя одну и ту же строку, и t2 заказана раньше t1, то t2 выигрывает конфликт, а t1 откатывается. Это фактически правило распределенного «первое подтверждение выигрывает». Обратите внимание, что если две транзакции часто склонны к конфликтам, то лучшим вариантом является запуск их на одном и том же сервере, где они могут синхронизироваться с локальным менеджером блокировок вместо отката в результате сертификации.
Для применения и внешней обработки сертифицированных транзакций Group Replication разрешает серверам отклоняться от согласованного порядка транзакций, если это не нарушает согласованность и валидность. Group Replication — это система с конечной согласованностью, что означает, что как только входящий трафик замедляется или останавливается, все члены группы имеют одинаковое содержимое данных. Пока трафик течет, транзакции могут быть внешне обработаны в немного другом порядке или внешне обработаны на некоторых членах группы раньше, чем на других. Например, в режиме многократного первичного сервера локальная транзакция может быть внешне обработана сразу после сертификации, хотя удаленная транзакция, которая стоит раньше в глобальном порядке, еще не была применена. Это разрешается, когда процесс сертификации установил, что между транзакциями нет конфликта. В режиме единого первичного сервера на первичном сервере существует небольшая вероятность того, что одновременные неконфликтные локальные транзакции могут быть подтверждены и внешне обработаны в другом порядке по сравнению с глобальным порядком, согласованным Group Replication. На вторичных серверах, которые не принимают записи от клиентов, транзакции всегда подтверждаются и внешне обрабатываются в согласованном порядке.
На рисунке показан протокол MySQL Group Replication, и сравнение его с MySQL Replication (или даже MySQL полусинхронной репликацией) выявляет некоторые различия. Обратите внимание, что для большей ясности некоторые основанные на консенсусе и Paxos сообщения отсутствуют на этом рисунке.
Рисунок 17.3 Протокол MySQL Group Replication
© 2025 Oracle
Licensed under the GPLv2 License.