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

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

Roman Bogachev VMware Specialist | Drone Pilot | Traveler

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

Установка MariaDB

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

1
2
3
4
5
6
7
# 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

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

1
sudo yum install MariaDB-server MariaDB-client rsync galera

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

1
2
sudo systemctl enable mariadb.service
sudo systemctl start mariadb.service

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

1
mysql_secure_installation

Настраиваем кластер

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

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

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

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

1
sudo systemctl stop mariadb.service

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

KVM-1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[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

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

1
2
mysql -p
SHOW STATUS LIKE 'wsrep%';

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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, чтобы остальные ноды смогли прореплицировать с нее информацию.

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

1
2
3
4
5
6
7
8
9
10
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: Значение указывает, что узел подключен к кластеру и способен обрабатывать транзакции.

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

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

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

1
2
[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

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

1
systemctl restart mariadb.service

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

1
2
3
4
5
6
7
8
9
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