MariaDB Galera Cluster: настройка с Master-Master репликацией

MariaDB Galera Cluster — это MariaDB кластер с мастер-мастер репликацией использующий для синхронизации galera-библиотеку.

Добавим актуальный репозиторий /etc/yum.repos.d/mariadb.repo.

# MariaDB 10.4 CentOS repository list - created 2019-10-25 07:58 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

Пакет MariaDB-Galera-server доступен в версии 10.0, начиная с 10.1 он включен в MariaDB-server см. MariaDB Official Documentation

Установим необходимые пакеты.

sudo yum install MariaDB-server MariaDB-client rsync galera

Запускаем сервис и добавляем в автозагрузку.

sudo systemctl enable mariadb.service
sudo systemctl start mariadb.service

Выполняем первоначальную настройку:

mysql_secure_installation

После базовой настройки MySQL сервера приступаем к настройке кластера.

Добавим пользователя для репликации

mysql -p
GRANT USAGE ON *.* to repl_user@'%' IDENTIFIED BY 'PASS';
GRANT ALL PRIVILEGES on *.* to repl_user@'%';
FLUSH PRIVILEGES;
exit

Останавливаем сервис

sudo systemctl stop mariadb.service

Отредактируем конфигурационный файл для основного сервера /etc/my.cnf.d/server.cnf

KVM-1

[mysqld]
bind-address=0.0.0.0
collation-server = utf8_general_ci
init-connect = 'SET NAMES utf8'
character-set-server = utf8
 
[galera]
wsrep_on=ON
binlog_format=ROW
innodb_autoinc_lock_mode=2
innodb_locks_unsafe_for_binlog=1
query_cache_size=0
query_cache_type=0
default_storage_engine=InnoDB
innodb_log_file_size=100M
innodb_file_per_table
innodb_flush_log_at_trx_commit=2
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
#wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so // If conflicts 25 and 26 versions
wsrep_cluster_address="gcomm://"
wsrep_cluster_name='galera_cluster'
wsrep_node_address='192.168.2.67'
wsrep_node_name='KVM-1'
wsrep_sst_method=rsync
wsrep_sst_auth=repl_user:PASS

По аналогии выполним данные действия на других серверах кластера, но обращаем внимание на параметр wsrep_cluster_address=«gcomm:, в нем необходимо указать первым IP-адрес или хост основного сервера, затем других нод, используя в качестве разделителя запятую.

KVM-2

[mysqld]
bind-address=0.0.0.0
collation-server = utf8_general_ci
init-connect = 'SET NAMES utf8'
character-set-server = utf8
 
[galera]
wsrep_on=ON
binlog_format=ROW
innodb_autoinc_lock_mode=2
innodb_locks_unsafe_for_binlog=1
query_cache_size=0
query_cache_type=0
default_storage_engine=InnoDB
innodb_log_file_size=100M
innodb_file_per_table
innodb_flush_log_at_trx_commit=2
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
#wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so // If conflicts 25 and 26 versions
wsrep_cluster_address="gcomm://IP_ADDR_MAIN_NODE,OTHER_NODES_ADDRS"
wsrep_cluster_name='galera_cluster'
wsrep_node_address='192.168.2.68'
wsrep_node_name='KVM-2'
wsrep_sst_method=rsync
wsrep_sst_auth=repl_user:PASS

KVM-3

[mysqld]
bind-address=0.0.0.0
collation-server = utf8_general_ci
init-connect = 'SET NAMES utf8'
character-set-server = utf8
 
[galera]
wsrep_on=ON
binlog_format=ROW
innodb_autoinc_lock_mode=2
innodb_locks_unsafe_for_binlog=1
query_cache_size=0
query_cache_type=0
default_storage_engine=InnoDB
innodb_log_file_size=100M
innodb_file_per_table
innodb_flush_log_at_trx_commit=2
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
#wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so // If conflicts 25 and 26 versions
wsrep_cluster_address="gcomm://192.168.2.67,192.168.2.68,192.168.2.69"
wsrep_cluster_name='galera_cluster'
wsrep_node_address='192.168.2.69'
wsrep_node_name='KVM-3'
wsrep_sst_method=rsync
wsrep_sst_auth=repl_user:PASS

На основной ноде запускаем сервис с ключем –wsrep-new-cluster, на остальных нодах запускаем как обычно /etc/init.d/mysql start

Проверяем статус кластера:

mysql -p
SHOW STATUS LIKE 'wsrep%';

Вывод будет приблизительно следующим:

MariaDB [(none)]> SHOW STATUS LIKE 'wsrep%';
+------------------------------+-------------------------------------------------------+
| Variable_name                | Value                                                 |
+------------------------------+-------------------------------------------------------+
| wsrep_apply_oooe             | 0.000000                                              |
| wsrep_apply_oool             | 0.000000                                              |
| wsrep_apply_window           | 0.000000                                              |
| wsrep_causal_reads           | 0                                                     |
| wsrep_cert_deps_distance     | 0.000000                                              |
| wsrep_cert_index_size        | 0                                                     |
| wsrep_cert_interval          | 0.000000                                              |
| wsrep_cluster_conf_id        | 3                                                     |
| wsrep_cluster_size           | 3                                                     |
| wsrep_cluster_state_uuid     | 2a4dbc40-f5bd-11e5-b2a9-ded6b93d45c9                  |
| wsrep_cluster_status         | Primary                                               |
| wsrep_commit_oooe            | 0.000000                                              |
| wsrep_commit_oool            | 0.000000                                              |
| wsrep_commit_window          | 0.000000                                              |
| wsrep_connected              | ON                                                    |
| wsrep_evs_delayed            |
| wsrep_evs_evict_list         |
| wsrep_evs_repl_latency       | 0/0/0/0/0                                             |
| wsrep_evs_state              | OPERATIONAL                                           |
| wsrep_flow_control_paused    | 0.000000                                              |
| wsrep_flow_control_paused_ns | 0                                                     |
| wsrep_flow_control_recv      | 0                                                     |
| wsrep_flow_control_sent      | 0                                                     |
| wsrep_gcomm_uuid             | 2a4cb0c4-f5bd-11e5-bef6-22e5e4b1a794                  |
| wsrep_incoming_addresses     | 192.168.2.67:3306,192.168.2.68:3306,192.168.2.69:3306 |
| wsrep_last_committed         | 0                                                     |
| wsrep_local_bf_aborts        | 0                                                     |
| wsrep_local_cached_downto    | 18446744073709551615                                  |
| wsrep_local_cert_failures    | 0                                                     |
| wsrep_local_commits          | 0                                                     |
| wsrep_local_index            | 0                                                     |
| wsrep_local_recv_queue       | 0                                                     |
| wsrep_local_recv_queue_avg   | 0.000000                                              |
| wsrep_local_recv_queue_max   | 1                                                     |
| wsrep_local_recv_queue_min   | 0                                                     |
| wsrep_local_replays          | 0                                                     |
| wsrep_local_send_queue       | 0                                                     |
| wsrep_local_send_queue_avg   | 0.000000                                              |
| wsrep_local_send_queue_max   | 1                                                     |
| wsrep_local_send_queue_min   | 0                                                     |
| wsrep_local_state            | 4                                                     |
| wsrep_local_state_comment    | Synced                                                |
| wsrep_local_state_uuid       | 2a4dbc40-f5bd-11e5-b2a9-ded6b93d45c9                  |
| wsrep_protocol_version       | 7                                                     |
| wsrep_provider_name          | Galera                                                |
| wsrep_provider_vendor        | Codership Oy <info@codership.com>                     |
| wsrep_provider_version       | 25.3.15(r3578)                                        |
| wsrep_ready                  | ON                                                    |
| wsrep_received               | 10                                                    |
| wsrep_received_bytes         | 760                                                   |
| wsrep_repl_data_bytes        | 0                                                     |
| wsrep_repl_keys              | 0                                                     |
| wsrep_repl_keys_bytes        | 0                                                     |
| wsrep_repl_other_bytes       | 0                                                     |
| wsrep_replicated             | 0                                                     |
| wsrep_replicated_bytes       | 0                                                     |
| wsrep_thread_count           | 2                                                     |
+------------------------------+-------------------------------------------------------+
57 rows in set (0.01 sec)

ВНИМАНИЕ! В случае если все ноды будут выключенны в одно и тоже время, MySQL не поднимется сам. Необходимо будет выбрать наиболее актуальную ноду, и запустить сервис с опцией –wsrep-new-cluster, чтобы остальные ноды смогли прореплицировать с нее информацию.

Проверяем состояние кластера

SHOW STATUS LIKE 'wsrep_%';
 
 +---------------------------+------------+
| Variable_name   | Value      |
 +---------------------------+------------+
 ...
| wsrep_local_state_comment | Synced (6) |
| wsrep_cluster_size        | 3          |
| wsrep_ready               | ON         |
 +---------------------------+------------+

wsrep_local_state_comment: Значение Synced указывает на то, что узел подключен к кластеру и функционирует. wsrep_cluster_size: Значение указывает на количество узлов в кластере. wsrep_ready: Значение указывает, что узел подключен к кластеру и способен обрабатывать транзакции.

Для сброса кворума на любом из серверов введите команду

SET GLOBAL wsrep_provider_options='pc.bootstrap=1';

Если в процессе работы получили ошибку:

[ERROR] WSREP: failed to open gcomm backend connection: 131: invalid UUID: 00000000 (FATAL)
at gcomm/src/pc.cpp:PC():271

Решение:

Переименовываем /var/lib/mysql/gvwstate.dat на /var/lib/mysql/gvwstate.dat.bak

И перезагружаем сервис:

systemctl restart mariadb.service

Добавляем правила на Firewalld для Galera

firewall-cmd --permanent --zone=public --add-service=mysql
...
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="XX.XX.XX.XX" port port=4567 protocol="tcp" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="XX.XX.XX.XX" port port=4567 protocol="udp" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="XX.XX.XX.XX" port port=4568 protocol="tcp" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="XX.XX.XX.XX" port port=4444 protocol="tcp" accept'
 
firewall-cmd --add-rich-rule 'rule family="ipv4" source address="AA.AA.AA.AA" service name="mysql" accept' --permanent
firewall-cmd --add-rich-rule 'rule family="ipv4" source address="BB.BB.BB.BB" service name="mysql" accept' --permanent