Как настроить кластер Galera с MariaDB на серверах Ubuntu 18.04

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

Вступление

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

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

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

В этом руководстве вы настроите активно-активный кластер MariaDB Galera. В демонстрационных целях вы настроите и протестируете три капли Ubuntu 18.04, которые будут действовать как узлы в кластере. Это самый маленький настраиваемый кластер.

Предпосылки

Чтобы продолжить, вам понадобитсяDigitalOcean account в дополнение к следующему:

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

    • Для настройки частной сети на трех каплях следуйте нашему руководствуPrivate Networking Quickstart.

    • Для получения помощи в настройке пользователя без полномочий root с привилегиямиsudo, следуйте нашему руководствуInitial Server Setup with Ubuntu 18.04.

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

[[step-1 -—- add-the-mariadb-repositories-to-all-servers]] == Шаг 1 - Добавление репозиториев MariaDB на все серверы

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

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

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

[.note] #Note: MariaDB - уважаемый провайдер, но не все внешние репозитории надежны. Обязательно устанавливайте только из проверенных источников.
#

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

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

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

sudo add-apt-repository 'deb [arch=amd64] http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.4/ubuntu bionic main'

После добавления репозитория запуститеapt update, чтобы включить манифесты пакетов из нового репозитория:

sudo apt update

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

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

[[step-2 -—- install-mariadb-on-all-servers]] == Шаг 2 - Установка MariaDB на всех серверах

На этом шаге вы установите фактические пакеты MariaDB на своих трех серверах.

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

sudo apt install mariadb-server

Вам будет предложено подтвердить, хотите ли вы продолжить установку. Введитеyes, чтобы продолжить установку.

Начиная с версии MariaDB10.4, пользователь MariaDBroot по умолчанию не имеет пароля. Чтобы установить пароль для пользователяroot, начните с входа в MariaDB:

sudo mysql -uroot

Как только вы окажетесь внутри оболочки MariaDB, измените пароль, выполнив следующую инструкцию:

set password = password("your_password");

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

OutputQuery OK, 0 rows affected (0.001 sec)

Выйдите из оболочки MariaDB, выполнив следующую команду:

quit;

Если вы хотите узнать больше о SQL или немного освежить в памяти, ознакомьтесь с нашимMySQL tutorial.

Теперь у вас есть все части, необходимые для начала настройки кластера, но, поскольку на последующих этапах вы будете полагаться наrsync, убедитесь, что он установлен:

sudo apt install rsync

Это подтвердит, что новейшая версияrsync уже доступна, или предложит обновить или установить ее.

После того, как вы установили MariaDB и установили пароль root на своем первом сервере, повторите эти шаги для двух других серверов.

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

[[step-3 -—- configuring-the-first-node]] == Шаг 3 - Настройка первого узла

На этом шаге вы настроите свой первый узел. Каждый узел в кластере должен иметь почти идентичную конфигурацию. Из-за этого вы выполните всю конфигурацию на своем первом компьютере, а затем скопируете ее на другие узлы.

По умолчанию MariaDB настроен на проверку каталога/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"
  • The first section изменяет или повторно утверждает настройки MariaDB / MySQL, которые позволят кластеру работать правильно. Например, Galera не будет работать с MyISAM или аналогичными механизмами хранения без транзакций, аmysqld не должен быть привязан к IP-адресу дляlocalhost. Вы можете узнать о настройках более подробно на Galera Clustersystem configuration page.

  • The “Galera Provider Configuration” section настраивает компоненты MariaDB, которые предоставляют API репликации WriteSet. В вашем случае это означает Galera, поскольку Galera является поставщикомwsrep (WriteSet Replication). Вы задаете общие параметры для настройки начальной среды репликации. Это не требует настройки, но вы можете узнать больше оGalera configuration options.

  • The “Galera Cluster Configuration” section определяет кластер, идентифицируя членов кластера по IP-адресу или разрешаемому имени домена и создавая имя для кластера, чтобы гарантировать, что члены присоединятся к правильной группе. Вы можете изменитьwsrep_cluster_name на что-то более значимое, чемtest_cluster, или оставить его как есть, но вы должны обновитьwsrep_cluster_address с частными IP-адресами ваших трех серверов.

  • The “Galera Synchronization Configuration” section определяет, как кластер будет обмениваться данными и синхронизировать данные между участниками. Это используется только для передачи состояния, которая происходит, когда узел подключается к сети. Для начальной настройки вы используетеrsync, потому что он общедоступен и делает то, что вам нужно сейчас.

  • The “Galera Node Configuration” section уточняет IP-адрес и имя текущего сервера. Это полезно при попытке диагностировать проблемы в журналах и для ссылки на каждый сервер несколькими способами. wsrep_node_address должен соответствовать адресу компьютера, на котором вы находитесь, но вы можете выбрать любое имя, которое поможет вам идентифицировать узел в файлах журнала.

Когда вы будете удовлетворены файлом конфигурации кластера, скопируйте его содержимое в буфер обмена, сохраните и закройте файл. В текстовом редакторе nano вы можете сделать это, нажавCTRL+X, набравy и нажавENTER.

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

[[шаг-4 -—- настройка-оставшихся-узлов]] == Шаг 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 -—- открытие-брандмауэр-на-каждом-сервере]] == Шаг 5 - Открытие брандмауэра на каждом сервере

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

sudo ufw status

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

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

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

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

  • 3306 Для клиентских подключений MySQL и передачи моментальных снимков состояния, использующих методmysqldump.

  • 4567 Для трафика репликации Galera Cluster. Многоадресная репликация использует как транспорт UDP, так и TCP на этом порту.

  • 4568 для инкрементальной передачи состояния.

  • 4444 Для всех остальных передач снимков состояния.

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

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

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

[.note] #Note: В зависимости от того, что еще работает на ваших серверах, вы можете сразу же ограничить доступ. В этом может помочь руководствоUFW Essentials: Common Firewall Rules and Commands.
#

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

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

[[step-6 -—- start-the-cluster]] == Шаг 6. Запуск кластера

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

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

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

sudo systemctl stop mysql

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

sudo systemctl status mysql

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

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

После того, как вы выключитеmysql на всех серверах, вы готовы продолжить.

Подними первый узел

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

sudo galera_new_cluster

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

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     |
+--------------------+-------+

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

[[step-7 -—- testing-replication]] == Шаг 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 в производственной ситуации, рекомендуется начинать с не менее пяти узлов.

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

Вам также могут быть интересны другие решения для кластеризации, такие как кластер MySQL, и в этом случае вы можете ознакомиться с нашим учебным пособиемHow To Create a Multi-Node MySQL Cluster on Ubuntu 18.04.

Related