Установите MariaDB Galera Cluster в Ubuntu 20.04 с ProxySQL

Установите MariaDB Galera Cluster в Ubuntu 20.04 с ProxySQL

 

В сегодняшней статье мы расскажем, как настроить высокодоступный кластер базы данных с балансировкой нагрузки с использованием кластера MariaDB Galera и ProxySQL. Доступность базы данных является требованием для производственных сред, в которых работают системы баз данных. Балансировка нагрузки также является ключевым моментом, если вы хотите достичь высокого уровня эффективности.

Если вы ищете решение, которое гарантирует как высокую доступность, так и балансировку нагрузки, вы можете просто выбрать этот вариант.

MariaDB Galera Cluster — это синхронный кластер с несколькими мастерами для MariaDB с поддержкой  механизмов  хранения XtraDB / InnoDB . Он имеет следующие главные особенности.

  • Он обеспечивает топологию «активный-активный» с несколькими ведущими
  • Вы можете читать и писать на любой узел кластера
  • Имеет автоматическое присоединение узлов
  • Автоматический контроль членства, отказавшие узлы выпадают из кластера
  • Имеет настоящую параллельную репликацию на уровне строк
  • Прямые клиентские подключения

ProxySQL — это прокси-сервер MySQL, который используется в качестве посредника между кластером Galera и приложениями, пытающимися получить доступ к кластеру.

Настройка кластера Galera в Ubuntu 20.04

Приведенные ниже шаги расскажут, как настроить кластер galera на трех хостах Ubuntu 20.04.

Мы предполагаем, что у вас есть доступ к трем хостам с правами sudo.

Вот как выглядит моя установка:

Сервер Имя хоста Айпи адрес
DB 1 узел1 172.20.5.200
DB 2 узел2 172.20.5.201
DB3 узел3 172.20.5.202

Шаг 1. Обновите серверы

Обновите серверы и перезагрузитесь

sudo apt update && sudo apt -y upgrade
sudo reboot

Шаг 2. Настройте имена хостов

Настройте статические имена хостов на каждом из трех серверов для доступности DNS.

$ sudo vim /etc/hosts
172.20.5.200  node1.infoit.com.ua node1
172.20.5.201  node2.infoit.com.ua node2
172.20.5.202  node3.infoit.com.ua node3

Шаг 3. Установите MariaDB на все узлы

Установите последнюю версию MariaDB с помощью следующих команд:

sudo apt update
sudo apt -y install mariadb-server mariadb-client

Настройте MariaDB для первого использования, выполнив приведенную ниже команду, а затем выполните настройку соответствующим образом.

$ sudo mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): 
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] y
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

Test connection to each of the databases by running the command below:

$ mysql -u root -p

Проверьте подключение к каждой из баз данных, выполнив следующую команду:

Вам будет предложено ввести пароль, который вы установили на предыдущем шаге.

Шаг 4. Настройте кластер Galera

Следующим шагом является настройка кластера galera на наших трех хостах MariaDB. Прокомментируйте строку привязки в файле /etc/mysql/mariadb.conf.d/50-server.cnf, который связывает службу MariaDB с 127.0.0.1.

$ sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf
#bind-address            = 127.0.0.1

Шаг Настройка первого узла

Добавьте следующее содержимое в файл конфигурации MariaDB. Не забудьте изменить имя хоста в « wsrep_node_address » на имя хоста или IP-адрес вашего первого хоста.

$ sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf
[galera]
wsrep_on                 = ON
wsrep_cluster_name       = "MariaDB Galera Cluster"
wsrep_provider           = /usr/lib/galera/libgalera_smm.so
wsrep_cluster_address    = "gcomm://"
binlog_format            = row
default_storage_engine   = InnoDB
innodb_autoinc_lock_mode = 2
bind-address = 0.0.0.0
wsrep_node_address="node1"

Инициализируйте кластер galera и перезапустите MariaDB

sudo galera_new_cluster
sudo systemctl restart mariadb 

Настроить узлы Galera (node2 и node3)

Добавьте следующую конфигурацию для node2 и node3 соответственно:

Node2:

$ sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf
[galera]
wsrep_on                 = ON
wsrep_cluster_name       = "MariaDB Galera Cluster"
wsrep_provider           = /usr/lib/galera/libgalera_smm.so
wsrep_cluster_address    = "gcomm://node1,node2,node3"
binlog_format            = row
default_storage_engine   = InnoDB
innodb_autoinc_lock_mode = 2
bind-address = 0.0.0.0
wsrep_node_address="node2"

Node3:

$ sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf
[galera]
wsrep_on                 = ON
wsrep_cluster_name       = "MariaDB Galera Cluster"
wsrep_provider           = /usr/lib/galera/libgalera_smm.so
wsrep_cluster_address    = "gcomm://node1,node2,node3"
binlog_format            = row
default_storage_engine   = InnoDB
innodb_autoinc_lock_mode = 2
bind-address = 0.0.0.0
wsrep_node_address="node3"

Перезапустите службу MariaDB на node2 и node3

systemctl restart mariadb

Шаг 5. Подтвердите настройки Galera

Войдите на любой из трех узлов как пользователь root, затем убедитесь, что настройки кластера в порядке.

$ mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 35
Server version: 10.5.9-MariaDB-1:10.5.9+maria~focal mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

Проверь состояние

MariaDB [(none)]> show status like 'wsrep_%'; 
+-------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name                 | Value                                                                                                                                          |
+-------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------+
| wsrep_local_state_uuid        | c2e29a95-a81f-11eb-a1fc-237e9071c44f                                                                                                           |
| wsrep_protocol_version        | 10                                                                                                                                             |
| wsrep_last_committed          | 7                                                                                                                                              |
| wsrep_replicated              | 0                                                                                                                                              |
| wsrep_replicated_bytes        | 0                                                                                                                                              |
| wsrep_repl_keys               | 0                                                                                                                                              |
| wsrep_repl_keys_bytes         | 0                                                                                                                                              |
| wsrep_repl_data_bytes         | 0                                                                                                                                              |
| wsrep_repl_other_bytes        | 0                                                                                                                                              |
| wsrep_received                | 7                                                                                                                                              |
| wsrep_received_bytes          | 690                                                                                                                                            |
| wsrep_local_commits           | 0                                                                                                                                              |
| wsrep_local_cert_failures     | 0                                                                                                                                              |
| wsrep_local_replays           | 0                                                                                                                                              |
| wsrep_local_send_queue        | 0                                                                                                                                              |
| wsrep_local_send_queue_max    | 1                                                                                                                                              |
| wsrep_local_send_queue_min    | 0                                                                                                                                              |
| wsrep_local_send_queue_avg    | 0                                                                                                                                              |
| wsrep_local_recv_queue        | 0                                                                                                                                              |
| wsrep_local_recv_queue_max    | 2                                                                                                                                              |
| wsrep_local_recv_queue_min    | 0                                                                                                                                              |
| wsrep_local_recv_queue_avg    | 0.142857                                                                                                                                       |
| wsrep_local_cached_downto     | 1                                                                                                                                              |
| wsrep_flow_control_paused_ns  | 0                                                                                                                                              |
| wsrep_flow_control_paused     | 0                                                                                                                                              |
| wsrep_flow_control_sent       | 0                                                                                                                                              |
| wsrep_flow_control_recv       | 0                                                                                                                                              |
| wsrep_flow_control_active     | false                                                                                                                                          |
| wsrep_flow_control_requested  | false                                                                                                                                          |
| wsrep_cert_deps_distance      | 0                                                                                                                                              |
| wsrep_apply_oooe              | 0                                                                                                                                              |
| wsrep_apply_oool              | 0                                                                                                                                              |
| wsrep_apply_window            | 0                                                                                                                                              |
| wsrep_commit_oooe             | 0                                                                                                                                              |
| wsrep_commit_oool             | 0                                                                                                                                              |
| wsrep_commit_window           | 0                                                                                                                                              |
| wsrep_local_state             | 4                                                                                                                                              |
| wsrep_local_state_comment     | Synced                                                                                                                                         |
| wsrep_cert_index_size         | 0                                                                                                                                              |
| wsrep_causal_reads            | 0                                                                                                                                              |
| wsrep_cert_interval           | 0                                                                                                                                              |
| wsrep_open_transactions       | 0                                                                                                                                              |
| wsrep_open_connections        | 0                                                                                                                                              |
| wsrep_incoming_addresses      | AUTO,AUTO,AUTO                                                                                                                                 |
| wsrep_cluster_weight          | 3                                                                                                                                              |
| wsrep_desync_count            | 0                                                                                                                                              |
| wsrep_evs_delayed             |                                                                                                                                                |
| wsrep_evs_evict_list          |                                                                                                                                                |
| wsrep_evs_repl_latency        | 0/0/0/0/0                                                                                                                                      |
| wsrep_evs_state               | OPERATIONAL                                                                                                                                    |
| wsrep_gcomm_uuid              | e4af838d-a824-11eb-95d0-72f816b84c68                                                                                                           |
| wsrep_gmcast_segment          | 0                                                                                                                                              |
| wsrep_applier_thread_count    | 1                                                                                                                                              |
| wsrep_cluster_capabilities    |                                                                                                                                                |
| wsrep_cluster_conf_id         | 3                                                                                                                                              |
| wsrep_cluster_size            | 3                                                                                                                                              |
| wsrep_cluster_state_uuid      | c2e29a95-a81f-11eb-a1fc-237e9071c44f                                                                                                           |
| wsrep_cluster_status          | Primary                                                                                                                                        |
| wsrep_connected               | ON                                                                                                                                             |
| wsrep_local_bf_aborts         | 0                                                                                                                                              |
| wsrep_local_index             | 2                                                                                                                                              |
| wsrep_provider_capabilities   | :MULTI_MASTER:CERTIFICATION:PARALLEL_APPLYING:TRX_REPLAY:ISOLATION:PAUSE:CAUSAL_READS:INCREMENTAL_WRITESET:UNORDERED:PREORDERED:STREAMING:NBO: |
| wsrep_provider_name           | Galera                                                                                                                                         |
| wsrep_provider_vendor         | Codership Oy <[email protected]>                                                                                                              |
| wsrep_provider_version        | 4.7(ree4f10fc)                                                                                                                                 |
| wsrep_ready                   | ON                                                                                                                                             |
| wsrep_rollbacker_thread_count | 1                                                                                                                                              |
| wsrep_thread_count            | 2                                                                                                                                              |
+-------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------+
68 rows in set (0.002 sec)

MariaDB [(none)]> 

Подтвердите, что у нас есть размер кластера 3 ниже:

wsrep_cluster_size    3

Мы можем создать тестовую базу данных на любом из узлов и проверить ее доступность на других узлах.

[email protected]node1:~# mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 49
Server version: 10.5.9-MariaDB-1:10.5.9+maria~focal mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> create database test1;
Query OK, 1 row affected (0.003 sec)

# node2 and node3

[email protected]node2:~# mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 45
Server version: 10.5.9-MariaDB-1:10.5.9+maria~focal mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test1              |
+--------------------+
4 rows in set (0.001 sec)



[email protected]node3:~# mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 46
Server version: 10.5.9-MariaDB-1:10.5.9+maria~focal mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test1              |
+--------------------+
4 rows in set (0.001 sec)

Это подтверждает, что база данных, созданная на node1, реплицируется по кластеру.

Шаг 6: Установите сервер ProxySQL

При работающем кластере Galera нам необходимо настроить сервер ProxySQL, который будет равномерно распределять трафик между тремя узлами. ProxySQL может работать на сервере, на котором установлено приложение, или работать как независимый сервер. В этой статье рассказывается, как настроить его на независимом хосте Debian / CentOS, выполнив следующие действия:

Debian / Ubuntu

Добавить репозиторий ProxySQL:

sudo apt install -y lsb-release 
wget -O - 'https://repo.proxysql.com/ProxySQL/repo_pub_key' | sudo apt-key add - 
echo deb https://repo.proxysql.com/ProxySQL/proxysql-2.1.x/$(lsb_release -sc)/ ./ | tee /etc/apt/sources.list.d/proxysql.list

Установите ProxySQL:

sudo apt update
sudo apt install proxysql mysql-client

CentOS / RedHat

Добавить репозиторий ProxySQL

sudo tee /etc/yum.repos.d/proxysql.repo<<EOF
[proxysql_repo]
name= ProxySQL YUM repository
baseurl=https://repo.proxysql.com/ProxySQL/proxysql-2.1.x/centos/\$releasever
gpgcheck=1
gpgkey=https://repo.proxysql.com/ProxySQL/repo_pub_key
EOF

Установить ProxySQL

sudo yum install proxysql mysql-client

Шаг 7. Настройте ProxySQL в Ubuntu 20.04.

После успешной установки запустите и включите службу на своем хосте.

sudo systemctl enable --now proxysql

Следующим шагом является настройка ProxySQL через интерфейс администратора. Интерфейс администратора позволяет сохранять конфигурацию без перезапуска прокси. Это достигается с помощью SQL-запросов к базе данных администратора.

Для подключения к административному интерфейсу ProxySQL нам понадобится mysql-клиент. Интерфейс администратора работает локально на порту 6032, а имя пользователя и пароль по умолчанию — admin / admin.

$ mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '
[email protected]:~# mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.30 (ProxySQL Admin Module)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

Admin> 

Измените пароль по умолчанию в целях безопасности:

UPDATE global_variables SET variable_value='admin:[email protected]' WHERE variable_name='admin-admin_credentials';

Не забудьте заменить « Y0urP @ ssw0rd » надежным паролем по вашему выбору.

Система конфигурации ProxySQL состоит из трех уровней:

  1. Память — изменяется при внесении изменений в командную строку.
  2. Диск — используется для постоянных изменений конфигурации
  3. Время выполнения — используется как эффективная конфигурация для ProxySQL.

Следовательно, это означает, что приведенный выше запрос был записан только в память . Чтобы сделать его постоянным, нам нужно скопировать конфигурацию во время выполнения, а затем сохранить их на диск .

Для этого выполните следующие запросы:

LOAD ADMIN VARIABLES TO RUNTIME;
SAVE ADMIN VARIABLES TO DISK;

Шаг 8: Настройте мониторинг в кластере Galera

ProxySQL необходимо взаимодействовать с узлами MariaDB в кластере Galera, чтобы знать их состояние работоспособности. Это означает, что ProxySQL должен подключаться к узлам через специального пользователя.

Мы создадим пользователя на одном из узлов MariaDB, пользователь будет автоматически реплицирован через кластер, поскольку кластер уже запущен и работает.

MariaDB [(none)]>     CREATE USER 'monitor'@'%' IDENTIFIED BY '[email protected]';
MariaDB [(none)]> flush privileges;

Измените пароль на пароль по своему усмотрению.

Шаг 9: Настройте мониторинг в ProxySQL

Настройте администратора ProxySQL для постоянного мониторинга внутренних узлов.

Добавьте учетные данные пользователя, которые мы настроили на шаге выше. Не забудьте изменить значение пароля, чтобы оно соответствовало тому, что вы использовали на предыдущем шаге.

ProxySQL Admin> UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';

ProxySQL Admin> UPDATE global_variables SET variable_value='[email protected]' WHERE variable_name='mysql-monitor_password';

Добавьте следующие параметры мониторинга для интервалов:

ProxySQL Admin> UPDATE global_variables SET variable_value='2000' WHERE variable_name IN ('mysql-monitor_connect_interval','mysql-monitor_ping_interval','mysql-monitor_read_only_interval');

Подтвердите переменные, которые мы только что настроили на предыдущем шаге:

Admin>  SELECT * FROM global_variables WHERE variable_name LIKE 'mysql-monitor_%';
+--------------------------------------------------------------+----------------+
| variable_name                                                | variable_value |
+--------------------------------------------------------------+----------------+
| mysql-monitor_enabled                                        | true           |
| mysql-monitor_connect_timeout                                | 600            |
| mysql-monitor_ping_max_failures                              | 3              |
| mysql-monitor_ping_timeout                                   | 1000           |
| mysql-monitor_read_only_max_timeout_count                    | 3              |
| mysql-monitor_replication_lag_interval                       | 10000          |
| mysql-monitor_replication_lag_timeout                        | 1000           |
| mysql-monitor_replication_lag_count                          | 1              |
| mysql-monitor_groupreplication_healthcheck_interval          | 5000           |
| mysql-monitor_groupreplication_healthcheck_timeout           | 800            |
| mysql-monitor_groupreplication_healthcheck_max_timeout_count | 3              |
| mysql-monitor_groupreplication_max_transactions_behind_count | 3              |
| mysql-monitor_galera_healthcheck_interval                    | 5000           |
| mysql-monitor_galera_healthcheck_timeout                     | 800            |
| mysql-monitor_galera_healthcheck_max_timeout_count           | 3              |
| mysql-monitor_replication_lag_use_percona_heartbeat          |                |
| mysql-monitor_query_interval                                 | 60000          |
| mysql-monitor_query_timeout                                  | 100            |
| mysql-monitor_slave_lag_when_null                            | 60             |
| mysql-monitor_threads_min                                    | 8              |
| mysql-monitor_threads_max                                    | 128            |
| mysql-monitor_threads_queue_maxsize                          | 128            |
| mysql-monitor_wait_timeout                                   | true           |
| mysql-monitor_writer_is_also_reader                          | true           |
| mysql-monitor_username                                       | monitor        |
| mysql-monitor_password                                       | [email protected]       |
| mysql-monitor_history                                        | 600000         |
| mysql-monitor_connect_interval                               | 2000           |
| mysql-monitor_ping_interval                                  | 2000           |
| mysql-monitor_read_only_interval                             | 2000           |
| mysql-monitor_read_only_timeout                              | 500            |
+--------------------------------------------------------------+----------------+
31 rows in set (0.00 sec)

Сохраняем изменения на диск:

Admin> LOAD MYSQL VARIABLES TO RUNTIME;
Query OK, 0 rows affected (0.00 sec)

Admin> SAVE MYSQL VARIABLES TO DISK;
Query OK, 140 rows affected (0.01 sec)

Шаг 10: Добавьте серверные узлы

Следующим шагом является добавление трех узлов MariaDB, которые существуют в нашем кластере Galera. ProxySQL использовал группы хостов для категоризации внутренних узлов. Группа хостов — это набор узлов, идентифицируемых положительным числом, например 1 или 2. Целью наличия групп хостов является помощь ProxySQL в маршрутизации запросов к различным наборам хостов с использованием маршрутизации запросов ProxySQL.

ProxySQL имеет следующие логические группы хостов:

  1. Writers – это узлы MySQL, которые могут принимать запросы, которые могут записывать / изменять данные — первичные узлы.
  2. Readers – Nodes, которые могут принимать только запросы на чтение — Подчиненные узлы.

Мы назначим следующие идентификаторы групп хостов вышеуказанным группам хостов:

Writers – 1, readers – 2. Writers тоже по умолчанию читатели.

Настройте таблицу mysql_replication_hostgroupв основной базе данных и укажите группы хостов для чтения и записи.

SHOW CREATE TABLE main.mysql_replication_hostgroups\G
Admin> INSERT INTO main.mysql_replication_hostgroups (writer_hostgroup,reader_hostgroup,comment) VALUES (1,2,'galera_cluster');

Добавьте узлы кластера Galera:

INSERT INTO main.mysql_servers(hostgroup_id,hostname,port) VALUES (1,'172.20.5.200',3306);
INSERT INTO main.mysql_servers(hostgroup_id,hostname,port) VALUES (1,'172.20.5.201',3306);
INSERT INTO main.mysql_servers(hostgroup_id,hostname,port) VALUES (1,'172.20.5.202',3306);

Сохранить изменения на диск;

LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;

Подтвердите, что серверы доступны:

Admin> SELECT * FROM monitor.mysql_server_connect_log ORDER BY time_start_us DESC LIMIT 3;
+--------------+------+------------------+-------------------------+---------------+
| hostname     | port | time_start_us    | connect_success_time_us | connect_error |
+--------------+------+------------------+-------------------------+---------------+
| 172.20.5.201 | 3306 | 1619703478153182 | 1062                    | NULL          |
| 172.20.5.202 | 3306 | 1619703478130560 | 923                     | NULL          |
| 172.20.5.200 | 3306 | 1619703478108016 | 984                     | NULL          |
+--------------+------+------------------+-------------------------+---------------+
3 rows in set (0.00 sec)

Admin> SELECT * FROM monitor.mysql_server_ping_log ORDER BY time_start_us DESC LIMIT 3;
+--------------+------+------------------+----------------------+------------+
| hostname     | port | time_start_us    | ping_success_time_us | ping_error |
+--------------+------+------------------+----------------------+------------+
| 172.20.5.200 | 3306 | 1619703506146573 | 358                  | NULL       |
| 172.20.5.202 | 3306 | 1619703506123187 | 431                  | NULL       |
| 172.20.5.200 | 3306 | 1619703504166074 | 253                  | NULL       |
+--------------+------+------------------+----------------------+------------+
3 rows in set (0.00 sec)

Admin> 

Шаг 11. Создайте пользователей MySQL

Последний шаг — создать пользователей MySQL, которые будут подключаться к кластеру через экземпляр ProxySQL.

Создать удаленного пользователя в кластере Galera

Создайте пользователя MySQL на одном из узлов кластера galera, который пользователи будут использовать для подключения.

MariaDB [(none)]> create user 'testuser'@'%' identified by 'testpassword';

Назначение пользователю необходимых ролей, например, доступа к определенной базе данных.

MariaDB [(none)]> grant all privileges on testdb.* to 'testuser'@'%' with grant option;
MariaDB [(none)]> flush privileges;

Создать удаленного пользователя в ProxySQL Admin

Это делается путем добавления записей в mysql_usersтаблицу в основной базе данных.

Admin> SHOW CREATE TABLE mysql_users\G
*************************** 1. row ***************************
       table: mysql_users
Create Table: CREATE TABLE mysql_users (
    username VARCHAR NOT NULL,
    password VARCHAR,
    active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1,
    use_ssl INT CHECK (use_ssl IN (0,1)) NOT NULL DEFAULT 0,
    default_hostgroup INT NOT NULL DEFAULT 0,
    default_schema VARCHAR,
    schema_locked INT CHECK (schema_locked IN (0,1)) NOT NULL DEFAULT 0,
    transaction_persistent INT CHECK (transaction_persistent IN (0,1)) NOT NULL DEFAULT 1,
    fast_forward INT CHECK (fast_forward IN (0,1)) NOT NULL DEFAULT 0,
    backend INT CHECK (backend IN (0,1)) NOT NULL DEFAULT 1,
    frontend INT CHECK (frontend IN (0,1)) NOT NULL DEFAULT 1,
    max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 10000,
    attributes VARCHAR CHECK (JSON_VALID(attributes) OR attributes = '') NOT NULL DEFAULT '',
    comment VARCHAR NOT NULL DEFAULT '',
    PRIMARY KEY (username, backend),
    UNIQUE (username, frontend))
1 row in set (0.00 sec)

Таблица обычно пуста, и пользователи добавляются путем изменения таблицы. Вы указываете имя пользователя, пароль и группу хостов по умолчанию.

Admin> INSERT INTO mysql_users(username,password,default_hostgroup) VALUES ('testuser','testpassword',1);
SELECT * FROM mysql_users; 

Сохранить изменения:

LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;

Шаг 12. Проверьте подключение клиента.

Клиент ProxySQL работает на порту 6033. Мы можем попробовать подключиться к прокси-клиенту, используя пользователя, которого мы создали в galera и proxysql.

mysql -utestuser -h 127.0.0.1 -P6033 -ptestpassword
[email protected]:~# mysql -utestuser1 -h 127.0.0.1 -P6033 -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 5.5.30 (ProxySQL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>

Теперь мы можем попробовать запускать запросы в кластере.


mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| testdb             |
+--------------------+
2 rows in set (0.00 sec)

mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| node3      |
+------------+
1 row in set (0.00 sec)

mysql> 

Мы видим, что у нас есть видимость testdb базы данных, права на которую мы назначили в настройке galera. Мы также можем подтвердить, что получаем ответы от узла 3 кластера galera.

Шаг 13: имитируйте отказ узла

Наконец, нам нужно проверить, что происходит, когда узел отключается. Выключите службу MariaDB на одном из узлов и проверьте статус в интерфейсе администратора ProxySQL:

Admin>  SELECT hostgroup,srv_host,status FROM stats.stats_mysql_connection_pool;
+-----------+--------------+---------+
| hostgroup | srv_host     | status  |
+-----------+--------------+---------+
| 1         | 172.20.5.200 | ONLINE  |
| 1         | 172.20.5.201 | ONLINE  |
| 1         | 172.20.5.202 | SHUNNED |
+-----------+--------------+---------+
3 rows in set (0.00 sec)

Состояние одного из узлов — ЗАПРЕЩЕНО, что означает, что узел временно недоступен. После перезапуска службы MariaDB на узле статус снова меняется на онлайн в интерфейсе управления ProxySQL. Это означает, что теперь вы можете снова отправлять запросы чтения / записи на узел.

Заключение

В этой статье мы смогли установить и настроить MariaDB Galera Cluster на серверах Ubuntu 20.04. Мы также подтвердили, что у нас есть рабочий кластер Galera с балансировкой нагрузки и высокой доступностью, которая гарантируется через ProxySQL. Я надеюсь, что это помогает вам. Ваше здоровье!