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