Настройка кластера Galera на MariaDB в CentOS 7

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

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

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

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

Требования

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

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

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

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

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

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

Сначала добавьте ключ репозитория MariaDB. Создайте файл для него:

sudo vi /etc/yum.repos.d/mariadb.repo

Добавьте в файл следующие строки:

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

Нажмите клавишу esc, чтобы вернуться в обычный режим, затем введите: wq, чтобы сохранить и выйти из файла.

Читайте также: Установка и использование текстового редактора Vim

Активируйте репозиторий:

sudo yum makecache --disablerepo='*' --enablerepo='mariadb'

Команда makecache кэширует метаданные репозитория, чтобы менеджер пакетов мог установить MariaDB с помощью файлов —disablerepo и —enablerepo, направляющих команду на файл репозитория mariadb, который вы только что создали.

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

Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
mariadb                                                                 | 2.9 kB  00:00:00
(1/3): mariadb/primary_db                                               |  43 kB  00:00:00
(2/3): mariadb/other_db                                                 | 8.3 kB  00:00:00
(3/3): mariadb/filelists_db                                             | 238 kB  00:00:00
Metadata Cache Created

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

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

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

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

sudo yum install MariaDB-server MariaDB-client

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

Когда установка будет завершена, запустите сервис mariadb:

sudo systemctl start mariadb

Добавьте его в автозагрузку:

sudo systemctl enable mariadb

Начиная с версии 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 и policycoreutils-python (для поддержки SELinux):

sudo yum install rsync policycoreutils-python

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

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

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

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

sudo vi /etc/my.cnf.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/lib64/galera-4/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 vi /etc/mysql/my.cnf.d/galera.cnf

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

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

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

Повторите эти действия на остальных нодах.

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

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

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

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

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

sudo firewall-cmd --list-all

Команда вернула:

public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh dhcpv6-client http https
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

В данном случае он поддерживает SSH, DHCP, HTTP и HTTPS. Если вы попытаетесь запустить кластер, вы не сможете этого сделать, потому что брандмауэр его заблокирует. Чтобы исправить это, нужно добавить правила, которые откроют трафик между MariaDB и Galera.

Galera может использовать четыре порта:

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

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

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

sudo firewall-cmd --permanent --zone=public --add-port=3306/tcp
sudo firewall-cmd --permanent --zone=public --add-port=4567/tcp
sudo firewall-cmd --permanent --zone=public --add-port=4568/tcp
sudo firewall-cmd --permanent --zone=public --add-port=4444/tcp
sudo firewall-cmd --permanent --zone=public --add-port=4567/udp

Читайте также: Настройка брандмауэра FirewallD в CentOS 7

Используя —zone = public и —add-port =, firewall-cmd открывает эти порты для публичного трафика. Флаг —permanent сохраняет эти правила для дальнейших сессий.

Теперь добавьте каждый сервер в зону public, выполнив следующие команды. Замените условные адреса соответствующими внутренними IP-адресами ваших нод.

sudo firewall-cmd --permanent --zone=public --add-source=galera-node-1-ip/32
sudo firewall-cmd --permanent --zone=public --add-source=galera-node-2-ip/32
sudo firewall-cmd --permanent --zone=public --add-source=galera-node-3-ip/32

Перезапустите брандмауэр:

sudo firewall-cmd --reload

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

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

6: Настройка политики SELinux

Политика SELinux позволит всем нодам обмениваться данными и выполнять операции кластера.

SELinux – это модуль ядра Linux, который повышает безопасность операционных систем благодаря поддержке обязательных политик контроля доступа. Он включен в CentOS 7 по умолчанию и запрещает демону MariaDB выполнять множество потенциально опасных действий.

Чтобы создать политику, нужно выполнить в кластере ряд действий с разрешающим режимом SELinux для MySQL. Затем вы создадите политику из зарегистрированных событий и, наконец, установите принудительное выполнение SELinux после установки политики.

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

sudo semanage port -a -t mysqld_port_t -p tcp 4567
sudo semanage port -a -t mysqld_port_t -p udp 4567
sudo semanage port -a -t mysqld_port_t -p tcp 4568
sudo semanage port -a -t mysqld_port_t -p tcp 4444

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

В этих командах используется инструмент управления semanage с флагом –a, он добавит порты и будет игнорировать сервер базы данных.

Затем выполните следующую команду на всех трех серверах. Она временно переводит домен MySQL SELinux в разрешительный режим.

sudo semanage permissive -a mysqld_t

Обработка этой команды может занять минуту и не выведет никаких выходных данных.

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

sudo systemctl stop mariadb

Запустите кластер для генерации событий взаимодействия между нодами, которые будут добавлены в политику SELinux. На первой ноде загрузите кластер, выполнив:

sudo galera_new_cluster

Создайте базу данных и таблицу для регистрации событий SST, выполнив на первой ноде такую команду:

mysql -u root -p -e 'CREATE DATABASE selinux;
CREATE TABLE selinux.selinux_policy (id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(id));
INSERT INTO selinux.selinux_policy VALUES ();'

Теперь запустите сервер на второй ноде:

sudo systemctl start mariadb

Затем сделайте то же самое на третьей ноде:

sudo systemctl start mariadb

Вы не увидите вывод от предыдущих команд. Чтобы сгенерировать события IST, выполните следующее на всех трех серверах:

mysql -u root -p -e 'INSERT INTO selinux.selinux_policy VALUES ();'

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

sudo grep mysql /var/log/audit/audit.log | sudo audit2allow -M Galera

Первая команда ищет сгенерированные события в файле audit.log и передает их в модуль Galera.pp, созданный инструментом audit2allow. Это приведет к следующему выводу:

******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i Galera.pp

Далее следуйте инструкциям в выходных данных и используйте следующую команду для установки сгенерированного модуля:

sudo semodule -i Galera.pp

Теперь, когда политика активна, отключите разрешающий режим для сервера MariaDB:

sudo semanage permissive -d mysqld_t

Вы успешно создали и включили политику SELinux.

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

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

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

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

Сначала выполните следующую команду на третьей ноде:

sudo systemctl stop mariadb

Затем остановите сервис на второй ноде:

sudo systemctl stop mariadb

Наконец, остановите сервис на первой ноде:

sudo systemctl stop mariadb

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

sudo systemctl status mariadb

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

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

Как только вы закроете mariadb на всех серверах, вы можете продолжить работу.

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

Чтобы запустить первую ноду, используйте специальный загрузочный сценарий. Согласно настройкам кластера каждая запущенная нода будет пытаться подключиться хотя бы к одной из нод, перечисленных в файле 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     |
+--------------------+-------+

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

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

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

sudo systemctl start mariadb

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

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

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

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

sudo systemctl start mariadb

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

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

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

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

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

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

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

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

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

Создайте на первой ноде новую базу данных. Следующие команды создадут БД 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 в Ubuntu 18.04

Tags: , , , ,