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

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

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

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

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

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

Требования

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

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

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

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

Примечание: Данный репозиторий поддерживается компанией Codership, которая разрабатывает Galera. Однако стоит учитывать, что далеко не все сторонние репозитории и пакеты безопасны. Устанавливайте пакеты только из надёжных источников.

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

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv  44B7345738EBDE52594DAD80D669017EBC19DDBA

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

sudo add-apt-repository 'deb [arch=amd64,i386] http://releases.galeracluster.com/ubuntu/ xenial main'
sudo apt-get update

На экране может появиться предупреждение:

uses weak digest algorithm (SHA1)

Чтобы устранить эту проблему, обратитесь к GitHub.

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

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

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

Запустите следующие команды, чтобы установить MySQL, Galera и несколько зависимостей:

sudo apt-get install galera-3 galera-arbitrator-3 mysql-wsrep-5.6

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

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

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

sudo apt-get install rsync

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

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

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

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

Первый раздел изменяет или повторно задаёт настройки MySQL, необходимые для корректной работы кластера. К примеру, Galera Cluster не будет работать с MyISAM и подобными нетранзакционными системами хранения. Также mysqld нельзя связывать с IP локального хоста. Подробную информацию о настройках Galera можно найти здесь.

Раздел Galera Provider Configuration настраивает компоненты MySQL, которые предоставляют интерфейс репликации WriteSet. Укажите общие параметры для настройки базовой среды репликации.

Примечание: Больше о параметрах Galera можно найти здесь.

Раздел Galera Cluster Configuration задаёт ноды, входящие в кластер, с помощью IP-адреса или доменного имени, а также устанавливает имя кластера (благодаря чему все члены кластера входят в одну группу). Замените условные данные, выделенные красным, своими данными; вместо wsrep_cluster_address укажите адреса нод кластера. Если у серверов есть внутренние IP-адреса, используйте их.

Раздел Galera Synchronization Configuration определяет, как кластер будет взаимодействовать и синхронизировать данные между нодами, которые находятся в сети. Для этого в руководстве используется rsync.

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

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

В файле /etc/mysql/my.cnf указан связующий адрес – 127.0.0.1. Его обязательно нужно закомментировать, чтобы потом задать правильный адрес в файле galera.cnf:

sudo nano /etc/mysql/my.cnf
. . .
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
# bind-address          = 127.0.0.1
. . .

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"
. . .

Сохраните и закройте файл. Теперь нужно закомментировать связующий адрес на остальных нодах:

sudo nano /etc/mysql/my.cnf
. . .
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
# bind-address          = 127.0.0.1
. . .

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

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

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

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

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

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: Запуск кластера

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

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

sudo systemctl stop mysql

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

sudo systemctl status mysql

Команда вернёт:

. . .
Sep 02 22:17:56 galera-02 systemd[1]: Stopped LSB: start and stop MySQL.

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

Согласно настройкам кластера каждая запущенная нода будет пытаться подключиться хотя бы к одной из нод, указанных в файле galera.cnf. Команда systemctl start mysql вернёт ошибку, потому что на данный момент нет ни одной запущенной ноды, к которой можно подключиться. Чтобы запустить первую ноду, нужно использовать флаг wsrep-new-cluster, но ни systemd, ни service не может его правильно обработать.

Примечание: Больше об этой проблеме можно узнать здесь.

Чтобы запустить первую ноду, используйте специальный загрузочный сценарий /etc/init.d. После этого вы сможете запустить остальные ноды с помощью обычной команды.

Примечание: Если вы хотите запустить все ноды с помощью systemd, запустите первую ноду с помощью сценария, затем запустите остальные ноды, а потом остановите первую ноду и перезапустите её с systemd.

sudo /etc/init.d/mysql start --wsrep-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 выполняют рутинную поддержку MySQL (например, ротацию логов) с помощью специального пользователя. При установке MySQL учетные данные для такого пользователя были сгенерированы случайным образом, они хранятся в /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 комментарий

  • Igor Anatolyevich Belykh says:

    sudo apt-get install mysql-wsrep-5.6
    Чтение списков пакетов… Готово
    Построение дерева зависимостей
    Чтение информации о состоянии… Готово
    E: Не удалось найти пакет mysql-wsrep-5.6
    E: Не удалось найти пакет с помощью glob «mysql-wsrep-5.6»
    E: Не удалось найти пакет с помощью regex «mysql-wsrep-5.6»

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