Настройка кластера Galera на MariaDB в Debian 10

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

Кластеры делятся на два типа: активно-пассивные (active-passive) и активно-активные (active-active).

В первом случае все операции записи происходят на одном активном (ведущем) сервере, после чего обновления копируются пассивными (или ведомыми) серверами. В случае сбоя активного сервера один из пассивных серверов занимает его место. Некоторые кластеры типа active-passive поддерживают операцию SELECT на пассивных нодах. В кластерах второго типа все ноды могут выполнять операции чтения и записи; изменение, внесённое на один из серверов, скопируется остальными серверами.

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

Данный мануал поможет настроить активно-активный кластер Galera на БД MariaDB. для демонстрации мы используем три простых сервера Debian 10 – это наименьший кластер, который можно настроить.

Требования

  • Три сервера Debian 10 (мануал по настройке серверов можно найти здесь).
  • Пользователь с доступом к sudo на каждом сервере кластера.
  • Настроенная частная сеть.

1: Добавление репозитория MariaDB

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

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

Стоит отметить, что MariaDB возникла как замена MySQL, поэтому во многих конфигурационных файлах и сценариях запуска вы увидите mysql, а не mariadb. Для согласованности и целостности кода мы будем использовать mysql.

Мы хотим установить версию MariaDB 10.4. Поскольку эта версия не включена в стандартные репозитории Ubuntu, сначала нужно добавить на все три ваших сервера внешний репозиторий, поддерживаемый проектом MariaDB.

Сейчас нужно установить два пакета: dirmngr и software-properties-common. Пакет dirmngr – это сервер для управления сертификатами и ключами репозитория. Пакет software-properties-common позволяет легко добавлять и обновлять расположения репозиториев исходного кода.

sudo apt install dirmngr software-properties-common

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

Сначала мы добавим ключ репозитория MariaDB с помощью команды apt-key, которую менеджер пакетов APT будет использовать для проверки подлинности пакета:

sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8

Теперь можно добавить репозиторий и обновить индекс пакетов.

sudo add-apt-repository 'deb [arch=amd64] http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.4/debian buster main'

Затем запустите команду, которая обновит сервер и добавит манифесты пакетов из нового репозитория:

sudo apt update

Не забудьте повторить эти действия на остальных серверах кластера.

2: Установка MariaDB

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

Начиная с версии 10.1, MariaDB объединяет пакеты MariaDB Server и MariaDB Galera Server в один пакет. Потому достаточно установить mariadb-server, а Galera и несколько зависимостей установятся автоматически.

sudo apt install mariadb-server

Сначала нужно подтвердить установку, для этого введите yes.

Начиная с версии MariaDB 10.4, root-пользователь MariaDB поставляется без пароля по умолчанию. Чтобы создать пароль, нужно войти в MariaDB:

sudo mysql -uroot

В оболочке MariaDB запустите следующую команду:

set password = password("your_password");

Вы получите такой вывод:

Query OK, 0 rows affected (0.001 sec)

Выйдите из MariaDB:

quit;

Читайте также: Базовое руководство MySQL

Теперь у вас есть все необходимые компоненты для настройки кластера, нужно только убедиться, что на сервере есть rsync:

sudo apt install rsync

Это установит новейшую версию rsync или предложит обновить до нее вашу текущую установку.

 3: Настройка первой ноды

Все ноды кластера будут использовать почти одинаковые настройки. Потому сначала можно настроить одну машину, а затем просто скопировать её конфигурации на остальные ноды.

По умолчанию MariaDB проверяет каталог /etc/mysql/conf.d, чтобы получить дополнительные конфигурации из файлов .cnf. Создайте такой файл в этом каталоге:

sudo nano /etc/mysql/conf.d/galera.cnf

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

[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Galera Cluster Configuration
wsrep_cluster_name="test_cluster"
wsrep_cluster_address="gcomm://First_Node_IP,Second_Node_IP,Third_Node_IP"
# Galera Synchronization Configuration
wsrep_sst_method=rsync
# Galera Node Configuration
wsrep_node_address="This_Node_IP"
wsrep_node_name="This_Node_Name"

  • Первый раздел изменяет или повторно задаёт настройки MariaDB/MySQL, необходимые для корректной работы кластера. Например, Galera Cluster не сможет работать с MyISAM и подобными нетранзакционными системами хранения. Также mysqld нельзя связывать с IP-адресом локального хоста. Подробную информацию о настройках Galera можно найти по этой ссылке.
  • Раздел Galera Provider Configuration настраивает компоненты MariaDB, которые предоставляют интерфейс репликации WriteSet. Укажите эти параметры для настройки базовой среды репликации. Этот раздел не нужно перенастраивать, но если вам нужна дополнительная информация, вы найдете ее здесь.
  • Раздел Galera Cluster Configuration определяет ноды, входящие в кластер, с помощью IP-адреса или доменного имени, а также задает имя кластера (благодаря чему все члены кластера входят в одну группу). Замените условные данные своими данными; вместо wsrep_cluster_name укажите более описательное имя (или оставьте все как есть). Вместо wsrep_cluster_address укажите внутренние IP-адреса нод кластера.
  • Раздел Galera Synchronization Configuration указывает, как кластер будет взаимодействовать и синхронизировать данные между нодами, которые находятся в сети. Для этого в данном мануале используется rsync.
  • Раздел Galera Node Configuration задаёт IP-адрес и имя текущего сервера. Это помогает при диагностике проблем в логах и позволяет ссылаться на сервер. Вместо wsrep_node_address укажите адрес текущей машины, а затем присвойте ей уникальное имя.

Скопируйте содержимое этого файла в буфер обмена, сохраните и закройте   файл.

Когда конфигурационный файл кластера будет готов, скопируйте его содержимое в буфер обмена, сохраните и закройте файл.

Теперь, когда вы успешно настроили свою первую ноду, вы можете перейти к настройке оставшихся нод.

 4: Настройка остальных нод

Теперь нужно создать конфигурационный файл на других нодах кластера. Откройте файл:

sudo nano /etc/mysql/conf.d/galera.cnf

Вставьте в него скопированные параметры. Откорректируйте раздел Galera Node Configuration, укажите в нем IP-адрес или доменное имя текущей ноды, а также выберите для неё уникальное имя.

. . .
# Galera Node Configuration
wsrep_node_address="This_Node_IP"
wsrep_node_name="This_Node_Name"
. . .

Сохраните и закройте файл.

Повторите эти действия на оставшейся ноде.

Кластер почти готов, осталось только открыть порты в брандмауэре.

5: Настройка брандмауэра

Примечание: Данный раздел нужно выполнить на каждой ноде кластера.

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

Проверьте состояние брандмауэра:

sudo ufw status

В данном случае команда вернула:

Status: active
To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Правила брандмауэра на вашем сервере могут отличаться. В данном случае он поддерживает только ssh. Если вы попытаетесь запустить кластер, вы не сможете этого сделать, потому что брандмауэр его заблокирует.

Galera использует четыре порта:

  • 3306: для соединения с клиентами MySQL и для State Snapshot Transfer (работает через метод mysqldump).
  • 4567: для репликации Galera Cluster и для многоадресной репликации по UDP и TCP.
  • 4568: Incremental State Transfer.
  • 4444: остальные операции State Snapshot Transfer.

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

Чтобы открыть порты, используйте:

sudo ufw allow 3306,4567,4568,4444/tcp
sudo ufw allow 4567/udp

Читайте также: Основы UFW: общие правила и команды фаервола

Не забудьте повторить это на остальных нодах.

Теперь можно запустить кластер.

6: Запуск кластера

Запустите кластер MariaDB. Но для начала вам нужно остановить текущий сервис MariaDB.

Остановка сервиса MariaDB

Примечание: Сделайте это на всех нодах кластера.

Сейчас нужно остановить сервис MariaDB.

sudo systemctl stop mysql

Команда systemctl не отображает результаты некоторых команд. Чтобы убедиться, что сервис остановлен, введите:

sudo systemctl status mysql

На экране появится:

. . .
Apr 26 03:34:23 galera-node-01 systemd[1]: Stopped MariaDB 10.4.4 database server.

Запуск первой ноды

Чтобы запустить первую ноду, используйте специальный загрузочный скрипт. Согласно настройкам кластера каждая запущенная нода будет пытаться подключиться хотя бы к одной из нод, перечисленных в файле galera.cnf. Без сценария galera_new_cluster, который позволяет системе systemd отправить флаг —wsrep-new-cluster, обычная команда запуска кластера не сработает, потому что на данный момент не существует нод, к которым можно подключиться.

sudo galera_new_cluster

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

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 1     |
+--------------------+-------+

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

Запуск второй ноды

Чтобы запустить вторую ноду, запустите  mysql:

sudo systemctl start mysql

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

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 2     |
+--------------------+-------+

Запуск третьей ноды

Запустите команду mysql:

sudo systemctl start mysql

Если нода запущена успешно, размер кластера увеличится:

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"

Вы увидите следующий вывод, который указывает, что третья нода присоединилась к кластеру и что общее количество нод в кластере- 3.

+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+

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

7: Тестирование репликации

Теперь нужно убедиться, что ноды кластера успешно реплицируют данные.

Внесите изменения в БД на первой ноде.

Запись данных на первой ноде

Создайте на первой ноде новую базу данных. Следующие команды создадут БД playground и таблицу equipment.

mysql -u root -p -e 'CREATE DATABASE playground;
CREATE TABLE playground.equipment ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id));
INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue");'

В предыдущей команде оператор CREATE DATABASE создает базу данных playground. Оператор CREATE создает в ней таблицу equipment, в которой есть столбец id с автоинкрементом и другие столбцы. Столбцы type, quant и color нужны для хранения типа, количества и цвета оборудования. Оператор INSERT вставляет запись type slide, quantity 2, color blue.

Чтение и запись на второй ноде

Теперь перейдите на вторую ноду и убедитесь, что кластер выполняет репликацию:

mysql -u root -p -e 'SELECT * FROM playground.equipment;'

Если репликация работает правильно, данные, введённые на первой ноде, появятся в БД второй ноды.

+----+-------+-------+-------+
| id | type  | quant | color |
+----+-------+-------+-------+
|  1 | slide |     2 | blue  |
+----+-------+-------+-------+

Добавьте в кластер новые данные:

mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");'

Чтение и запись на третьей ноде

Затем перейдитена третью ноду и просмотрите БД. Теперь она должна содержать новые данные, добавленные на первой и второй ноде.

mysql -u root -p -e 'SELECT * FROM playground.equipment;'
+----+-------+-------+--------+
| id | type  | quant | color  |
+----+-------+-------+--------+
|  1 | slide |     2 | blue   |
|  2 | swing |    10 | yellow |
+----+-------+-------+--------+

Добавьте в таблицу еще одно новое значение:

mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");'

Чтение на первой ноде

Теперь вернитесь на первую ноду. Запросите данные БД:

mysql -u root -p -e 'SELECT * FROM playground.equipment;'

Вы увидите такой вывод, в котором будут содержаться все новые данные, добавленные со всех нод кластера:

+----+--------+-------+--------+
| id | type   | quant | color  |
+----+--------+-------+--------+
|  1 | slide  |     2 | blue   |
|  2 | swing  |    10 | yellow |
|  3 | seesaw |     3 | green  |
+----+--------+-------+--------+

Как видите, репликация данных успешно работает в кластере.

Заключение

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

Перед запуском в производство рекомендуем взглянуть на другие средства sst, такие как xtrabackup, который позволяет очень быстро настраивать новые ноды без больших перерывов в работе активных нод. Это не влияет на фактическую репликацию, но является проблемой при инициализации нод.

Читайте также: Создание многоузлового кластера MySQL

Tags: , , ,