====== MariaDB Galera Cluster: настройка с Master-Master репликацией ====== MariaDB Galera Cluster — это MariaDB кластер с мастер-мастер репликацией использующий для синхронизации galera-библиотеку. ==== Установка MariaDB ==== Добавим актуальный репозиторий ''/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 [[https://mariadb.com/kb/en/mariadb/getting-started-with-mariadb-galera-cluster/|см. 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 | | 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 |