mariadb

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

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

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

MariaDB – это открытая система управления реляционными базами данных, полностью совместимая с популярной системой MySQL. Galera – это средство для кластеризации баз данных, которое позволяет настраивать кластеры с несколькими мастерами и синхронной репликацией. Galera автоматически выполняет синхронизацию данных на разных нодах, позволяя отправлять запросы на чтение и запись на любую ноду в кластере.

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

Установка MariaDB

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

Существуют следующие основные пакеты связанные с mariadb:

apt install mariadb-server

В Debian и его производных, таких как Ubuntu, распространена практика автоматического запуска и включения демонов через systemd сразу после их установки. То же самое относится и к сервису MariaDB. Вы можете проверить, работает ли служба MariaDB, с помощью следующей команды.

systemctl status mariadb

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

systemctl start mariadb
systemctl restart mariadb
systemctl stop mariadb
systemctl reload mariadb

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

sudo apt install rsync

Это установит новейшую версию rsync или предложит обновить до нее вашу текущую установку.

Настройка MariaDB

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

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

mysql_secure_installation

Запустится скрипт, с запросами на то или иное действие. Вот ответы:

  1. Skip root password for root
    Мы еще не устанавливали пароль для root, поэтому при запуске скрипта и запросе пароля для root, просто нажмите Enter.
  2. Install new password for root: security
    А вот тут можно установить пароль для root
  3. Do remove an anonymous user
    На вопрос о том, удалить ли анонимного пользователя, отвечаем да
  4. Do not disallow remote connections
    Не запрещаем коннект к нашему северу с удаленных серверов (если, конечно, эта опция вам нужна, в другом случае, запретите ее)
  5. Do remove a test database
    Тестовая база нам не нужна — удаляйте ее
  6. Do reload the privileges
    Перегрузим привилегии для их активации

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

mysql -u root -p
MariaDB [(none)]> exit;

Настройка hosts

nano /etc/hosts 

127.0.0.1 localhost nameserver 
10.0.0.1    n1 
10.0.0.2    n2 
10.0.0.3    n3 
10.0.0.4    n4
10.0.0.254  db

на всех нодах.

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

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

nano /etc/mysql/mariadb.conf.d/60-galera.cnf

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

[galera]
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="db_cluster"
wsrep_cluster_address="gcomm://n2, n3, n4"
# Galera Synchronization Configuration
wsrep_sst_method=rsync
# Galera Node Configuration
wsrep_node_address="10.0.0.1"
wsrep_node_name="n1"

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

 

Настройка остальных нод

Теперь нужно создать конфигурационный файл на других нодах кластера. Откройте файл:

nano /etc/mysql/mariadb.conf.d/60-galera.cnf
[galera] 
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="db_cluster"
wsrep_cluster_address="gcomm://n1, n3, n4"
# Galera Synchronization Configuration
wsrep_sst_method=rsync
# Galera Node Configuration
wsrep_node_address="10.0.0.2"
wsrep_node_name="n2"

Повторите эти действия на оставшейся ноде.

Кластер почти готов, осталось только открыть порты в брандмауэре.

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

Galera использует четыре порта:

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

Чтобы открыть порты, используйте:

ufw allow from ip_address_nodes to any port 3306
ufw allow from ip_address_nodes to any port 4567
ufw allow from ip_address_nodes to any port 4568
ufw allow from ip_address_nodes to any port 4444/tcp
ufw allow from ip_address_nodes to any port 4567/udp

Не забудьте повторить это на остальных нодах.

Теперь можно запустить кластер.

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

Запустите кластер MariaDB. Но для начала вам нужно остановить текущий сервис MariaDB.

systemctl stop mysql

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

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

sudo galera_new_cluster

sudo systemctl start mysql

После успешного выполнения скрипта нода регистрируется как часть кластера. Чтобы убедиться в этом, запустите:
sudo mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 1     |
+--------------------+-------+

 

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

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

Чтобы запустить вторую ноду, запустите  mysql:

sudo systemctl start mysql

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

sudo mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 2     |
+--------------------+-------+

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

Запустите команду mysql:

sudo systemctl start mysql

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

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

+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+

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

Тестирование репликации

Теперь нужно убедиться, что ноды кластера успешно реплицируют данные.

Внесите изменения в БД на первой ноде.

Запись данных на первой ноде

Создайте на первой ноде новую базу данных. Следующие команды создадут БД 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, в которой есть столбец id с автоинкрементом и другие столбцы. Столбцы type, quant и color нужны для хранения типа, количества и цвета оборудования. Оператор INSERT вставляет запись type slide, quantity 2, color 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_new_cluster не работает.

проблема решена путем редактирования файла /var/lib/mysql/grastate.dat и изменения safe_to_bootstrap на 1.

после этого galera_new_cluster работает.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *