Автор выбрал фонд Free and Open Source Fund для получения пожертвования в рамках программы Write for DOnations.

Введение

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

Существует две стандартные конфигурации кластеров: активный-пассивный и активный-активный. В кластерах вида «активный-пассивный» все операции записи выполняются на одном активном сервере, а затем копируются на один или несколько пассивных серверов, которые активируются только в случае неисправности активного сервера. Некоторые кластеры вида «активный-пассивный» также поддерживают выполнение операций SELECT на пассивных узлах. В кластерах вида «активный-активный» каждый узел используется для чтения и записи, и изменения на одном узле воспроизводятся на всех остальных узлах.

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

В этом обучающем руководстве мы настроим кластер MySQL Galera вида «активный-активный». Для демонстрационных целей мы выполним настройку и тестирование трех дроплетов Ubuntu 18.04, которые будут выступать в качестве узлов кластера. Такое количество узлов представляет собой наименьший настраиваемый кластер.

Предварительные требования

Для этого вам потребуется учетная запись DigitalOcean, а также следующее:

  • Три дроплета Ubuntu 18.04 с включенной поддержкой частных сетей, на каждом имеется пользователь sudo без привилегий root.

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

Шаг 1 — Добавление репозиториев MySQL на все серверы

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

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

В этом обучающем руководстве мы будем использовать MySQL версии 5.7. Вначале мы добавим внешний репозиторий Ubuntu, обслуживаемый проектом Galera, на все три ваших сервера.

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

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

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

Через несколько секунд вы увидите следующее:

Output
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

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

/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

Сохраните и закройте файлы на каждом сервере (нажмите CTRL + X, Y, а затем ENTER).

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

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

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

/etc/apt/preferences.d/galera.pref
# Prefer Codership repository
Package: *
Pin: origin releases.galeracluster.com
Pin-Priority: 1001

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

  • sudo apt update

Мы успешно добавили репозиторий пакетов на все три сервера и можем переходить к установке MySQL.

Шаг 2 — Установка MySQL на все серверы

На этом шаге мы выполним установку пакета MySQL на все три сервера.

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

  • sudo apt install galera-3 mysql-wsrep-5.7

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

После установки MySQL мы отключим профиль AppArmor по умолчанию, чтобы обеспечить надлежащую работу Galera. Данное требование содержится в официальной документации по 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 на первом сервере следует повторить эти шаги для двух других серверов.

Мы успешно установили MySQL на каждом из трех серверов и теперь можем перейти к настройке конфигурации.

Шаг 3 — Настройка конфигурации первого узла

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

По умолчанию СУБД MySQL настроена для проверки директории /etc/mysql/conf.d для получения дополнительных параметров конфигурации из файлов с расширением .cnf. Создайте в этой директории на первом сервере файл со всеми директивами для вашего кластера:

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

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

/etc/mysql/conf.d/galera.cnf
[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, обеспечивающие правильную работу кластера. Например, Galera не работает с MyISAM и другими системами хранения без транзакций, а mysqld не следует привязывать к IP-адресу для узла localhost. Дополнительную информацию о настройках можно найти на странице по конфигурации системы Galera Cluster.
  • Раздел «Galera Provider Configuration» настраивает компоненты MySQL, которые обеспечивают API репликации WriteSet. В данном случае это означает Galera, поскольку Galera является поставщиком wsrep (репликации WriteSet). Мы зададим общие параметры настройки начальной среды репликации. Для этого не требуется персонализация, но вы можете узнать дополнительную информацию о параметрах конфигурации Galera в документации.
  • Раздел «Galera Cluster Configuration» определяет кластер, идентифицируя узлы кластера по IP-адресу или полному доменному имени и создавая имя кластера, чтобы участники присоединялись к правильной группе. Вы можете изменить значение параметра wsrep_cluster_name на любое другое имя или оставить имя test_cluster, но для параметра 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-адрес или доменное имя узла, который вы настраиваете. Затем измените название узла так, чтобы вам было легко распознавать его в файлах журнала:

/etc/mysql/conf.d/galera.cnf
. . .
# Galera Node Configuration
wsrep_node_address="This_Node_IP"
wsrep_node_name="This_Node_Name"
. . .

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

После выполнения этих шагов повторите их для третьего узла.

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

Шаг 5 — Открытие портов брандмауэра на каждом сервере

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

  • sudo ufw status

В данном случае разрешен только трафик SSH:

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

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

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

  • 3306 для подключения клиентов MySQL и передачи снимков состояния с использованием метода mysqldump.
  • 4567 для трафика репликации кластера Galera. При репликации мультивещания на этом порту используются транспорт UDP и TCP.
  • 4568 для инкрементной передачи состояния.
  • 4444 для передачи всех других снимков состояния.

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

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

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

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

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

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

Шаг 6 — Запуск кластера

На этом шаге мы запустим наш кластер MySQL Galera. Вначале нужно включить службу MySQL systemd, чтобы обеспечить автоматический запуск MySQL при перезагрузке сервера.

Активация MySQL для запуска при загрузке на всех трех серверах

Используйте следующую команду для включения службы MySQL systemd на всех трех серверах:

  • sudo systemctl enable mysql

Вы увидите экран следующего вида, подтверждающий добавление службы в список автозагрузки:

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

Мы активировали автозагрузку mysql на всех трех серверах и теперь можем запускать кластер.

Включение первого узла

Для запуска первого узла нам потребуется специальный скрипт. При нашей конфигурации кластера каждый активируемый узел будет пытаться подключиться хотя бы к одному узлу, указанному в файле galera.cnf, для получения его начального состояния. Без использования скрипта mysqld_bootstrap, который позволяет systemd передавать параметр --wsrep-new-cluster, обычная команда systemctl start mysql не будет выполняться, поскольку первый узел не сможет подключиться ни к какому другому узлу.

Запустите на первом сервере следующую команду:

  • sudo mysqld_bootstrap

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

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

После ввода пароля вы увидите следующий экран, показывающий, что в кластере содержится один узел:

Output
+--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 1 | +--------------------+-------+

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

Включение второго узла

Теперь мы можем запустить второй узел. Запустите mysql:

  • sudo systemctl start mysql

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

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

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

Output
+--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 2 | +--------------------+-------+

Включение третьего узла

Настало время запустить третий узел. Запустите mysql:

  • sudo systemctl start mysql

Запустите следующую команду для определения размера кластера:

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

Вы увидите следующий экран, показывающий, что к кластеру подключился третий узел и что всего кластер содержит три узла.

Output
+--------------------+-------+ | 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 в базе данных playground. Эта таблица содержит столбец идентификации id с инкрементным увеличением идентификатора, а также другие столбцы. Столбец type, столбец quant и столбец color определяют тип, количество и цвет оборудования. Выражение INSERT вставляет запись с типом slide, количеством 2 и цветом blue.

Теперь наша таблица содержит одно значение.

Чтение и запись на втором узле

Посмотрим на второй узел, чтобы проверить работу репликации:

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

Если репликация работает, введенные на первом узле данные будут видны здесь, на втором узле:

Output
+----+-------+-------+-------+ | 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;'

Вы увидите следующий экран, содержащий две строки:

Output
+----+-------+-------+--------+ | 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;'

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

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

Мы подтвердили возможность записи на всех узлах и успешное выполнение репликации.

Заключение

Теперь у нас имеется работающий и настроенный тестовый кластер Galera с тремя узлами. Если вы планируете использовать кластер Galera в рабочей среде, рекомендуем начать как минимум с пяти узлов.

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

Возможно вас также заинтересуют другие решения кластеризации для MySQL, и в этом случае мы рекомендуем ознакомиться с обучающим руководством Создание кластера MySQL с несколькими узлами в Ubuntu 18.04. Если вам требуется решение управляемой базы данных, ознакомьтесь с документацией по управляемым базам данных DigitalOcean.

0 Comments

Creative Commons License