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

Автор выбрал Free и Open Source Fund, чтобы получить пожертвование как часть Write for DOnations program.

Вступление

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

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

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

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

Предпосылки

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

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

  • Чтобы настроить частную сеть на трех каплях, следуйте нашему руководству Private Networking Quickstart.

  • Чтобы получить помощь в настройке пользователя без полномочий root с привилегиями + sudo +, следуйте нашей Initial установке сервера с Debian 10 руководство.

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

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

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

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

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

Чтобы добавить репозиторий, вам сначала нужно установить пакеты + dirmngr + и + software-properties-common +. + dirmngr + - сервер для управления сертификатами и ключами репозитория. + software-properties-common + - это пакет, который позволяет легко добавлять и обновлять местоположения исходного репозитория. Установите два пакета, выполнив:

sudo apt install dirmngr software-properties-common

Вы добавите ключ репозитория 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/debian buster main'

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

sudo apt update

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

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

Шаг 2 - Установка MariaDB на всех серверах

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

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

sudo apt install mariadb-server

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

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

sudo mysql -uroot

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

set password = password("");

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

OutputQuery OK, 0 rows affected (0.001 sec)

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

quit;

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

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

sudo apt install rsync

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

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

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

Шаг 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://,,"

# Galera Synchronization Configuration
wsrep_sst_method=rsync

# Galera Node Configuration
wsrep_node_address=""
wsrep_node_name=""
  • * Первый раздел * изменяет или повторно устанавливает параметры MariaDB / MySQL, которые позволят кластеру функционировать правильно. Например, Galera не будет работать с MyISAM или подобными нетранзакционными механизмами хранения, и + mysqld + не должен быть привязан к IP-адресу для + localhost +. Вы можете узнать о настройках более подробно на странице конфигурации Galera Cluster system page.

  • * В разделе «Настройка поставщика Galera» * настраиваются компоненты MariaDB, которые предоставляют API репликации WriteSet. Это означает, что Galera в вашем случае, поскольку Galera является поставщиком wsrep (WriteSet Replication). Вы задаете общие параметры для настройки начальной среды репликации. Для этого не требуется никаких настроек, но вы можете узнать больше о Galera опциях конфигурации.

  • * Раздел «Конфигурация кластера Galera» * определяет кластер, определяя членов кластера по IP-адресу или разрешаемому имени домена и создавая имя для кластера, чтобы гарантировать, что члены присоединяются к правильной группе. Вы можете изменить + wsrep_cluster_name + на что-то более значимое, чем + test_cluster +, или оставить его как есть, но вы должны обновить + wsrep_cluster_address + частными IP-адресами ваших трех серверов.

  • * Раздел «Настройка синхронизации Galera» * определяет, как кластер будет взаимодействовать и синхронизировать данные между участниками. Это используется только для передачи состояния, которая происходит, когда узел подключается к сети. Для начальной настройки вы используете + rsync +, потому что он общедоступен и делает то, что вам нужно сейчас.

  • * Раздел «Настройка узла Galera» * уточняет IP-адрес и имя текущего сервера. Это полезно при попытке диагностировать проблемы в журналах и для ссылки на каждый сервер несколькими способами. + Wsrep_node_address + должен совпадать с адресом машины, на которой вы находитесь, но вы можете выбрать любое имя, которое хотите, чтобы помочь вам идентифицировать узел в файлах журнала.

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

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

Шаг 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=""
wsrep_node_name=""
. . .

Сохраните и выйдите из файла.

Выполнив эти шаги, повторите их на третьем узле.

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

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

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

sudo ufw status

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

OutputStatus: active

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

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

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

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

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

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

  • + 4444 + Для всех других состояний передачи снимков.

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

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

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

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

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

Шаг 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 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     |
+--------------------+-------+

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

Шаг 7 - Тестирование репликации

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

Написать в первый узел

Вы начнете с внесения изменений в базу данных на первом узле. Следующие команды создадут базу данных с именем + plays + + и таблицу внутри этой базы данных с названием + 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 создает базу данных с именем + детская площадка. Оператор + CREATE + создает таблицу с именем + equipment внутри базы данных` + площадка + , имеющую столбец идентификаторов с автоинкрементом, называемый + 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 агентов передачи снимка состояния (sst), например * xtrabackup *, который позволяет вам установить новые узлы очень быстро и без больших перерывов в ваших активных узлов. Это не влияет на фактическую репликацию, но является проблемой при инициализации узлов.

Related