Оглавление
Необходимо настроить синхронизацию между несколькими серверами баз данных MariaDB . В нашем случае это два хоста под управлением CentOS7 и пакет Galera
Установка MariaDB
Добавляем репозиторий
1 2 3 4 5 6 7 |
vi /etc/yum.repos.d/mariadb.repo [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.2/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDBgpgcheck=1 |
Установка необходимых пакетов
1 2 3 |
sudo yum install MariaDB-server MariaDB-client rsync galera |
Запускаем сервис и добавляем в автозагрузку
1 2 3 4 |
sudo systemctl enable mariadb.service sudo systemctl start mariadb.service |
Выполняем первоначальную настройку
1 2 3 |
mysql_secure_installation |
Настраиваем кластер
Добавим пользователя для репликации
1 2 3 4 5 6 |
mysql -p GRANT USAGE ON *.* to repl_user@'%' IDENTIFIED BY 'PASS'; GRANT ALL PRIVILEGES on *.* to repl_user@'%'; FLUSH PRIVILEGES;exit |
Останавливаем сервис
1 2 3 |
sudo systemctl stop mariadb.service |
Отредактируем конфигурационный файл для основного сервера
vi /etc/my.cnf.d/server.cnf
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 |
[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_cluster_address="gcomm://100.201.203.54,100.201.203.55" wsrep_cluster_name='galera_cluster' wsrep_node_address='100.201.203.54' wsrep_node_name='node1' wsrep_sst_method=rsync wsrep_sst_auth=repl_user:PASS |
По аналогии выполним данные действия на других серверах кластера, но обращаем внимание на параметр wsrep_cluster_address=»gcomm://, в нем необходимо указать первым IP-адрес или хост основного сервера, затем других нод, используя в качестве разделителя запятую.
Настройка второй ноды
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 |
[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_cluster_address="gcomm://100.201.203.54,100.201.203.55" wsrep_cluster_name='galera_cluster' wsrep_node_address='100.201.203.55' wsrep_node_name='node1' wsrep_sst_method=rsync wsrep_sst_auth=repl_user:PASS |
Запускаем кластер
На основной ноде запускаем сервис с ключом —wsrep-new-cluster (/etc/init.d/mysql start —wsrep-new-cluster), на остальных нодах запускаем как обычно /etc/init.d/mysql start
Проверяем статус кластера
1 2 3 4 5 6 7 8 9 10 11 12 |
mysql -u root -p --execute="SHOW GLOBAL STATUS WHERE Variable_name IN ('wsrep_ready', 'wsrep_cluster_size', 'wsrep_cluster_status', 'wsrep_connected');" +----------------------+---------+ | Variable_name | Value | +----------------------+---------+ | wsrep_cluster_size | 2 | | wsrep_cluster_status | Primary | | wsrep_connected | ON | | wsrep_ready | ON | +----------------------+---------+ |
1 2 3 4 5 6 7 8 9 10 11 |
mysql -u root -p --execute="SHOW GLOBAL STATUS WHERE Variable_name IN('wsrep_cluster_size', 'wsrep_cluster_status', 'wsrep_incoming_addresses');" +--------------------------+---------------------------------------+ | Variable_name | Value | +--------------------------+---------------------------------------+ | wsrep_cluster_size | 2 | | wsrep_cluster_status | Primary | | wsrep_incoming_addresses |00.201.203.55:3306,100.201.203.54:3306 | +--------------------------+---------------------------------------+ |
1 2 3 |
mysql -u root -p -e "show status like 'wsrep%'" |
wsrep_cluster_size — значение указывает на количество узлов в кластере.
wsrep_ready — значение указывает, что узел подключен к кластеру и способен обрабатывать транзакции.
Устранение неполадок
Поведение некоторых команд
Вывод команды
1 2 3 4 |
service mysql status ERROR! MariaDB is not running |
1 2 3 4 5 |
/etc/init.d/mysql status ERROR! MariaDB is not running |
При этом systemctl status mariadb.service
1 2 3 4 5 6 7 8 9 |
systemctl status mariadb.service ● mariadb.service - MariaDB 10.2.22 database server Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled) Drop-In: /etc/systemd/system/mariadb.service.d └─migrated-from-my.cnf-settings.conf Active: active (running) since Ср 2019-03-06 17:52:12 MSK; 18min ago |
Ошибки в логе
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[Warning] WSREP: last inactive check more than PT1.5S ago (PT3.50162S), skipping check [Note] WSREP: view((empty)) [ERROR] WSREP: failed to open gcomm backend connection: 110: failed to reach primary view: mysqld[6291]: at gcomm/src/pc.cpp:connect():158 [ERROR] WSREP: gcs/src/gcs_core.cpp:gcs_core_open():209: Failed to open backend connection [ERROR] WSREP: gcs/src/gcs.cpp:gcs_open():1458: Failed to open channel 'galera_cluster' at [ERROR] WSREP: gcs connect failed: Connection timed out [ERROR] WSREP: wsrep::connect(gcomm://100.201.203.54,100.201.203.55) failed: 7 mysqld[6291]: 2019-03-06 13:48:38 140455129581760 [ERROR] Aborting systemd[1]: mariadb.service: main process exited, code=exited, status=1/FAILURE systemd[1]: Failed to start MariaDB 10.2.22 database server. |
то выполняем команду
1 2 3 |
sudo /usr/bin/galera_new_cluster |
Для сброса кворума на любом из серверов введите команду
1 2 3 |
SET GLOBAL wsrep_provider_options='pc.bootstrap=1'; |
Если в процессе работы получили ошибку
1 2 3 |
[ERROR] WSREP: failed to open gcomm backend connection: 131: invalid UUID: 00000000 (FATAL) at gcomm/src/pc.cpp:PC():271 |
Выполняем
1 2 3 |
mv /var/lib/mysql/grastate.dat /var/lib/mysql/grastate.dat.bak |
И перезагружаем сервис:
1 2 3 |
systemctl restart mariadb.service |
Добавляем правила на Firewalld для Galera
1 2 3 4 5 6 7 8 9 10 11 |
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 |
Обеспечение высокой доступности
Для распределения запросов по сервера рекомендуется использовать балансировщики, например mysql-proxy, HAproxy, GLB (Galera Load Balancer)
Я же использую Pacemaker and Corosync HA, в простой конфигурации, которая переносит IP на второй сервер, при выходе из строя первого сервера. Так же есть вариант с DRBD, но его я использую для синхронизации сетевого хранилища и больше доверяю механизмам MariaDB.