Настройка 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] 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.servicesudo 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_ciinit- 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= 100 M 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_ciinit- 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= 100 M 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_ciinit- 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= 100 M 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 | 2 a4dbc40- 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 | 2 a4cb0c4- f5bd-11e5 - bef6-22e5 e4b1a794 | | 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 | 2 a4dbc40- 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