Балансировка трафика в кластере Galera

Балансировщики нагрузки используются для распределения трафика между пулом серверов для повышения производительности и доступности. Хотя многие приложения обмениваются данными через HTTP или HTTPS, существует большое количество приложений, которые взаимодействуют по TCP.

В этом мануале вы узнаете, как настроить балансировщик нагрузки в кластере Galera на БД MariaDB.

Примечание: Инструкции мануала применимы к более широкому спектру программного обеспечения.

Требования

Для работы вам нужен кластер Galera, создать который вам поможет мануал Настройка кластера Galera на MariaDB 10.1 в Ubuntu 16.04.

В результате у вас должны быть:

  • Кластер Galera из трех серверов.
  • Образец БД playground с таблицей equipment.
  • Брандмауэр, который поддерживает взаимодействие между нодами кластера.

Вам также понадобится клиентская машина для подключения к кластеру через балансировщик нагрузки. Для этого будет использоваться сервер Ubuntu 16.04. Настройте пользователя sudo на этом компьютере (вам поможет этот мануал).

Настройка удаленного пользователя БД

Для начала нужно настроить удаленный доступ к базе данных. Добавьте удаленного пользователя в БД playground.

Подключитесь к одной из нод кластера Galera как пользователь sudo.

Запустите интерактивную оболочку MariaDB:

mysql -u root -p

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

Убедитесь, что база данных playground  доступна:

SHOW DATABASES;

В списке будет БД playground:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| playground         |
+--------------------+
4 rows in set (0.00 sec)

Затем нужно создать нового удаленного пользователя с полным доступом к этой базе данных.

Создайте аккаунт remoteuser и предоставьте ему доступ к БД playground. Выберите надежный пароль.

GRANT ALL ON playground.* TO 'remoteuser'@'%' IDENTIFIED BY 'strong_password';
Query OK, 0 rows affected (0.01 sec)

Затем сбросьте привилегии, чтобы обновить настройки:

FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

Закройте сессию MariaDB

exit
Bye

Теперь в кластере есть удаленный пользователь с доступом к БД playground.

Настройка клиентского сервера MariaDB

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

Установите клиентское программное обеспечение MariaDB из репозитория Ubuntu по умолчанию, чтобы иметь возможность подключаться к нодам в кластере. Обновите локальный индекс и установите клиент, набрав:

sudo apt-get update
sudo apt-get install mariadb-client

По завершении установки нужно убедиться, что удаленный пользователь, настроенный в кластере Galera, работает должным образом.

Подключитесь к базе данных playground с помощью внешнего IP-адреса одного из серверов Galera с клиента MariaDB:

mysql -u remoteuser -p -h galera_server_IP playground

Вам будет предложено ввести пароль удаленного пользователя remoteuser. После этого вы попадете в интерактивный сеанс.

Отобразите содержимое таблицы equipment, чтобы убедиться, что все работает правильно:

SELECT * FROM equipment;
+----+--------+-------+--------+
| id | type   | quant | color  |
+----+--------+-------+--------+
|  4 | slide  |     2 | blue   |
|  8 | swing  |    10 | yellow |
| 12 | seesaw |     3 | green  |
+----+--------+-------+--------+
3 rows in set (0.00 sec)

Закройте оболочку:

exit
Bye

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

Настройка балансировки нагрузки

Выберите средство для балансировки нагрузки и настройте его в кластере. В этом вам помогут наши мануалы:

  • Что такое балансировка нагрузки?
  • Основы работы с HAProxy и базовые понятия балансировки нагрузки
  • 5 вариантов использования балансировщиков нагрузки
  • Настройка балансировки нагрузки Nginx и SSL-терминации
  • Балансировка нагрузки MySQL при помощи HAProxy
  • Балансировка нагрузки с помощью round robin DNS
  • Балансировка нагрузки с помощью round robin DNS

После настройки балансировщика вы сможете с его помощью подключиться к кластеру Galera. Для этого вам нужен внешний IP-адрес балансировщика.

После этого вам нужно выполнить еще пару проверок.

Проверка взаимодействия кластера с балансировщиом

Подключитесь к внешнему IP-адресу балансировщика с клиента MariaDB. Для примера можно снова подключиться к БД playground:

mysql -u remoteuser -p -h load_balancer_IP playground

Вам будет предложено ввести пароль удаленного пользователя. После этого вы попадете в интерактивную сессию MariaDB.

Убедитесь, что вы можете запросить содержимое таблицы equipment так же, как ранее, при непосредственном подключении к нодам Galera:

SELECT * FROM equipment;
+----+--------+-------+--------+
| id | type   | quant | color  |
+----+--------+-------+--------+
|  4 | slide  |     2 | blue   |
|  8 | swing  |    10 | yellow |
| 12 | seesaw |     3 | green  |
+----+--------+-------+--------+
3 rows in set (0.00 sec)

Закройте сессию MariaDB:

exit
Bye

Если у вас получилось подключиться к внешнему IP-адресу балансировщика и запросить содержимое таблицы, значит, все настроено правильно.

Проверка ротации бэкэнда

Затем нужно убедиться, что балансировщик нагрузки правильно распределяет запросы среди доступных бэкенд-серверов.

Для этого нужно несколько раз подключиться к IP-адресу балансировщика и отображатьноду, которая обрабатывает текущий запрос. Если балансировщик нагрузки передает запросы правильно, запросы будут обрабатывать разные бэкэнды.

Параметры wsrep_node_address и wsrep_node_name содержат имя и IP-адрес каждой ноды Galera. Запросить эту информацию можно с помощью этой команды:

mysql -u remoteuser -p -h load_balancer_IP playground -e 'SHOW VARIABLES LIKE "wsrep_node%";'

Будет запрошен пароль пользователя remoteuser. После этого вы увидите такой вывод:

+-----------------------------+------------------+
| Variable_name               | Value            |
+-----------------------------+------------------+
| wsrep_node_address          | node2_IP_address |
| wsrep_node_incoming_address | AUTO             |
| wsrep_node_name             | node2            |
+-----------------------------+------------------+

Параметры wsrep_node_address и wsrep_node_name будут отражать данные ноды кластера Galera, которая ответила на запрос.

Чтобы убедиться, что балансировщик нагрузки распространяет запросы среди серверов бэкэнда, выполните запрос еще раз:

mysql -u remoteuser -p -h load_balancer_IP playground -e 'SHOW VARIABLES LIKE "wsrep_node%";'

Введите пароль remoteuser. В этот раз в выводе будет информация о другой ноде:

+-----------------------------+------------------+
| Variable_name               | Value            |
+-----------------------------+------------------+
| wsrep_node_address          | node3_IP_address |
| wsrep_node_incoming_address | AUTO             |
| wsrep_node_name             | node3            |
+-----------------------------+------------------+

Повторите команду:

mysql -u remoteuser -p -h load_balancer_IP playground -e 'SHOW VARIABLES LIKE "wsrep_node%";'

Введя пароль, вы должны увидеть информацию о третьей ноде кластера:

+-----------------------------+------------------+
| Variable_name               | Value            |
+-----------------------------+------------------+
| wsrep_node_address          | node1_IP_address |
| wsrep_node_incoming_address | AUTO             |
| wsrep_node_name             | node1            |
+-----------------------------+------------------+

Эта последовательность будет повторяться по мере поступления новых запросов. Теперь вы убедились, что балансировщик нагрузки распределяет данные между серверами бэкэнда.

Tags: ,