Производительность репликации в кластере MySQL Galera

Администраторы часто настраивают кластер Galera с тремя и более узлами в сетях с пропускной способностью 1 Гбит/с. Кажется, что 1 Гбит/с это довольно много? Фактически, не так уж и много, если задуматься о том, как происходит репликация данных между серверами кластера.

Galera поддерживает два режима репликации — с использованием одноадресной рассылки (ip unicast), либо с использованием многоадресной рассылки, для работы которого может требоваться поддержка на уровне инфраструктуры провайдера или вашего сетевого оборудования, если используется собственная инфраструктура.

Одноадресная репликация

По умолчанию, для репликации Galera использует одноадресную рассылку TCP. Синхронная репликация, используемая в Galera, предполагает репликацию на все узлы сразу, это значит, что 1 копия репликационного сообщения рассылается на остальные узлы кластера.

Чем больше узлов в кластере, тем более высокая пропускная способность необходима для обеспечения репликации. В кластере с пятью узлами, один узел рассылает отдельные репликационные потоки каждому из оставшихся 4 узлов, поэтому пропускная способность должна быть разделена на 4, соответственно, для сети 1 Gbit/s на каждый узел максимальный трафик составит 250 Мбит/c, а с учетом практических реалий — можно ориентироваться на 200 Мбит/c, что составляет около 25 МБ/c. Чем больше в кластере узлов, тем меньшая пропускная способность может быть выделена на 1 узел.

Рассмотрим этот эффект в действии. Возьмем простой скрипт, который каждую секунду выводит пропускную способность сети на интерфейс. Тест sysbench и измерение исходящей (UP) пропускной способности производится на одном и том же узле.

Важно! Особенность, которая существенно отличает кластер Galera от кластера с асинхронной Master-Slave репликацией, заключается в том что в случае Galera транзакция блокирует сервер до завершения репликации. Если пропускной способности канала связи недостаточно для пропуска данных без задержки, данные будут ожидать в очереди, а все операции, связанные с ними, будут блокироваться, даже если вычислительных ресурсов и ресурсов файловой системы будет достаточно.

Многоадресная репликация

Один из способов решения проблемы ограниченной пропускной способности в Galera — подключение многоадресной репликации. Сделать это довольно просто.

Суть многоадресной рассылки в том, что все серверы, участвующие в многоадресной группе подписываются на пакеты, адрес назначения которых соответствует данной группе. В простом случае это чем-то напоминает ограниченный broadcast, позволяя гибко определять группы получателей.

Необходимо убедиться, что среда поддерживает многоадресную рассылку, если это так, то необходимо выбрать адрес многоадресной группы, которая будет использоваться для осуществления репликации. Обычно, вы можете выбрать любой адрес из сети 224.0.0.0/4, если вы используете чужую инфраструктуру, обратитесь за советом к администратору сети.

Для примера будем использовать 224.33.0.6. Внесем необходимые изменения в my.cnf:

wsrep_provider_options   = "gmcast.mcast_addr=224.33.0.6"
wsrep_cluster_address    = gcomm://224.33.0.6

Если параметр wsrep_provider_options уже задан, добавьте для него вышеуказаное свойство в список, отделив его от других значений с помощью ;. Если кластер уже запущен, остановите его, настройте адрес mcast и перезапустите кластер:

[root@node3 mysql]$ sudo systemctl stop mysql
[root@node2 mysql]$ sudo systemctl stop mysql
[root@node1 mysql]$ sudo systemctl stop mysql

[root@node1 mysql]$ sudo galera_new_cluster
[root@node2 mysql]$ sudo systemctl start mysql
[root@node3 mysql]$ sudo systemctl start mysql

Используя многоадресную репликацию, можно легко подключать к кластеру дополнительные узлы без необходимости изменения параметра wsrep_cluster_address.

IST и SST по-прежнему будут использовать одноадресную рассылку по протоколу TCP, поэтому следует убедиться, что для каждого узла корректно задан параметр wsrep_node_address.