Настройка кластера Galera на MySQL в Ubuntu 18.04

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

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

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

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

Читайте также: Краткий справочник по управлению базой данных SQL

Этот мануал поможет настроить активно-активный кластер Galera на БД MySQL. Для работы мы используем три простых сервера Ubuntu 18.04 – это наименьший кластер, который можно настроить.

Требования

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

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

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

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

Примечание: Codership, компания, разрабатывающая Galera Cluster, поддерживает специальный  репозиторий Galera. Но имейте в виду, что не все внешние репозитории так же надежны. Устанавливайте программы только из надежных источников.

Мы установим версию MySQL 5.7. Сначала нужно добавить внешний репозиторий Ubuntu для Galera на все три ваших сервера.

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

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv BC19DDBA

Вы получите такой результат спустя несколько секунд:

Executing: /tmp/apt-key-gpghome.RG5cTZjQo0/gpg.1.sh --keyserver keyserver.ubuntu.com --recv BC19DDBA
gpg: key D669017EBC19DDBA: public key "Codership Oy <info@galeracluster.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1

Теперь можно добавить репозиторий и обновить индекс пакетов. Для этого создайте файл galera.list в каталоге /etc/apt/sources.list.d/ на каждом сервере:

sudo nano /etc/apt/sources.list.d/galera.list

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

deb http://releases.galeracluster.com/mysql-wsrep-5.7/ubuntu bionic main
deb http://releases.galeracluster.com/galera-3/ubuntu bionic main

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

Репозитории Codership доступны на всех трех нодах кластера. Теперь нужно настроить apt – он должен отдавать предпочтение репозиториям Codership (это обеспечит своевременную установку исправлений программного обеспечения, необходимого для создания кластера Galera). Для этого создайте еще один файл, galera.pref, в каталоге /etc/apt/preferences.d/ на каждом сервере:

sudo nano /etc/apt/preferences.d/galera.pref

Вставьте в него такие строки:

# Prefer Codership repository
Package: *
Pin: origin releases.galeracluster.com
Pin-Priority: 1001

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

sudo apt update

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

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

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

Запустите следующую команду, чтобы установить версию MySQL с патчами для Galera, а также пакет Galera.

sudo apt install galera-3 mysql-wsrep-5.7

Сначала нужно подтвердить установку, для этого введите Y. Также во время установки вам будет предложено выбрать пароль администратора MySQL. Введите сложный пароль и нажмите Enter.

После установки MySQL нужно отключить профиль AppArmor по умолчанию, чтобы обеспечить правильную работу Galera (согласно официальной документации). AppArmor – это модуль ядра Linux, который предоставляет контроль доступа к сервисам через профили безопасности.

Отключите AppArmor, выполнив эту команду:

sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/

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

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

sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld

После того как вы установили MySQL и отключили профиль AppArmor на своем первом сервере, повторите эти действия на других нодах.

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

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

По умолчанию MySQL проверяет каталог /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"

  • Первый раздел меняет или повторно задаёт настройки MySQL/MySQL, необходимые для корректной работы кластера. Например, Galera не сможет работать с MyISAM и подобными нетранзакционными системами хранения. Также mysqld нельзя связывать с IP-адресом localhost. Подробную информацию о настройках Galera можно найти по этой ссылке.
  • Раздел Galera Provider Configuration настраивает компоненты MySQL, которые предоставляют интерфейс репликации 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: Запуск кластера Galera

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

Автозагрузка сервиса MySQL

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

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

sudo systemctl enable mysql

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

Created symlink /etc/systemd/system/multi-user.target.wants/mysql.service → /lib/systemd/system/mysql.service.

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

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

sudo mysqld_bootstrap

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

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

На остальных нодах можно использовать стандартную команду 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 в Ubuntu 18.04

Tags: , ,