Настройка кластера Galera на MariaDB 10.1 в Ubuntu 16.04

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

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

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

Данное руководство поможет настроить активно-активный кластер Galera на основе БД MariaDB.

Примечание: Примеры демонстрируются на трёх нодах – это самый маленький доступный кластер.

Требования

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

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

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

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

Примечание: MariaDB – надёжный провайдер, однако не всем сторонним репозиториям можно доверять. Используйте только надёжные, проверенные источники.

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

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

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

sudo add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.1/ubuntu xenial main'
sudo apt-get update

Примечание: Обязательно обновите индекс пакетов. Иначе вы установите версию 10.0, которая не поддерживает Galera.

Добавив репозиторий на каждый сервер кластера, установите MariaDB.

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

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

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

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

sudo apt-get install mariadb-server

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

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

Для дальнейшей работы нужно установить rsync.

sudo apt-get install rsync

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

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

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

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

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

[mysqld] query_cache_size=0
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
query_cache_type=0
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_ip,second_ip,third_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 можно найти здесь.

Раздел Galera Cluster Configuration задаёт ноды, входящие в кластер, с помощью IP-адреса или доменного имени, а также устанавливает имя кластера (благодаря чему все члены кластера входят в одну группу). Замените условные данные, выделенные красным, своими данными; вместо 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 можно узнать в статье Основы UFW: общие правила и команды фаервола.

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

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

Для начала нужно остановить сервис MariaDB.

sudo systemctl stop mysql

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

sudo systemctl status mysql

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

. . .
Aug 19 02:55:15 galera-01 systemd[1]: Stopped MariaDB 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:

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'"
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+

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

7: Настройка специального пользователя Debian

На данный момент системы Ubuntu и Debian выполняют рутинную поддержку MariaDB (например, ротацию логов) с помощью специального пользователя. При установке MariaDB учетные данные для такого пользователя были сгенерированы случайным образом, они хранятся в /etc/mysql/debian.cnf и были добавлены в БД mysql.

После запуска кластера пароль первой ноды был реплицирован на другие ноды кластера. Потому значение в файле debian.cnf больше не совпадает с паролем из БД. Это значит, что на данный момент все операции по поддержке невозможно завершить успешно, поскольку при подключении к БД пароли не совпадут.

Чтобы исправить эту ошибку, нужно скопировать файл debian.cnf первой ноды на остальные ноды кластера.

Откройте файл debian.cnf первой ноды в редакторе:

sudo nano /etc/mysql/debian.cnf

Он выглядит так:

[client] host     = localhost
user     = debian-sys-maint
password = 03P8rdlknkXr1upf
socket   = /var/run/mysqld/mysqld.sock
[mysql_upgrade] host     = localhost
user     = debian-sys-maint
password = 03P8rdlknkXr1upf
socket   = /var/run/mysqld/mysqld.sock
basedir  = /usr

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

Перейдите на вторую ноду и откройте этот же файл:

sudo nano /etc/mysql/debian.cnf

Несмотря на предупреждение «DO NOT TOUCH!» в верхней части файла, файл нужно откорректировать, иначе кластер не сможет работать. Удалите текущее содержимое файла и вставьте скопированное содержимое конфигурационного файла первой ноды. Сохраните и закройте файл.

Перейдите на третью ноду и откройте файл:

sudo nano /etc/mysql/debian.cnf

Удалите содержимое файла и вставьте в него скопированные параметры из файла первой ноды. Сохраните и закройте файл.

Примечание: После этого можно проверить, может ли специальный пользователь создать подключение с помощью пароля из debian.conf:

sudo cat /etc/mysql/debian.cnf

Скопируйте пароль. Подключитесь к mysql:

mysql -u debian-sys-maint -p

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

update mysql.user set password=PASSWORD('password_from_debian.cnf') where User='debian-sys-maint';

Снова попробуйте создать подключение.

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");'

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

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. Вы можете самостоятельно расширить его, добавив новые ноды.

Примечание: Рекомендуемое число нод – 5.

Если ноды работают вне частной сети, вы должны защитить их с помощью SSL.

Tags: , , , ,

1 комментарий

  • haginarovitch says:

    Приветствую! Кто сталкивался с проблемой после перезагрузки сервера кластер не работает
    Nov 11 17:18:46 ih1272092.vds.myihor.ru mysqld[903]: at gcomm/src/pc.cpp:connect():158
    Nov 11 17:18:46 ih1272092.vds.myihor.ru mysqld[903]: 2018-11-11 17:18:46 0 [ERROR] WSREP: gcs/src/gcs_core.cpp:gcs_core_open():209: Failed to open backend connection: -110 (Connection timed out)
    Nov 11 17:18:46 ih1272092.vds.myihor.ru mysqld[903]: 2018-11-11 17:18:46 0 [ERROR] WSREP: gcs/src/gcs.cpp:gcs_open():1458: Failed to open channel ‘test_cluster’ at ‘gcomm://10.128.2.192,10.128.2.193,10.128.2.194’: -110 (Connection timed o
    Nov 11 17:18:46 ih1272092.vds.myihor.ru mysqld[903]: 2018-11-11 17:18:46 0 [ERROR] WSREP: gcs connect failed: Connection timed out
    Nov 11 17:18:46 ih1272092.vds.myihor.ru mysqld[903]: 2018-11-11 17:18:46 0 [ERROR] WSREP: wsrep::connect(gcomm://10.128.2.192,10.128.2.193,10.128.2.194) failed: 7
    Nov 11 17:18:46 ih1272092.vds.myihor.ru mysqld[903]: 2018-11-11 17:18:46 0 [ERROR] Aborting
    Nov 11 17:18:47 ih1272092.vds.myihor.ru systemd[1]: mariadb.service: Main process exited, code=exited, status=1/FAILURE
    Nov 11 17:18:47 ih1272092.vds.myihor.ru systemd[1]: Failed to start MariaDB 10.3.10 database server.
    Nov 11 17:18:47 ih1272092.vds.myihor.ru systemd[1]: mariadb.service: Unit entered failed state.
    Nov 11 17:18:47 ih1272092.vds.myihor.ru systemd[1]: mariadb.service: Failed with result ‘exit-code’.

Добавить комментарий