Серверы · 8 min read · Dec 07, 2025

Как настроить высокую доступность MariaDB с Heartbeat и DRBD на Ubuntu 16.04 LTS

Heartbeat и DRBD используются для кластерного решения для любого приложения с использованием двух серверов. Оба сервера работают в активном и пассивном режиме, один сервер будет работать одновременно, а другой сервер будет резервным. DRBD (Distributed Replicated Block Device) — это служба на уровне ядра, которая синхронизирует данные между двумя серверами в реальном времени. Heartbeat — это программа с открытым исходным кодом, которая позволяет основному и резервному серверу Linux определять, жив ли другой, и если основной сервер не работает, переключать ресурсы на резервный. Она также управляет высокой доступностью IP и другими службами на ваших серверах.

В этом руководстве мы узнаем, как достичь высокой доступности MariaDB с использованием Heartbeat и DRBD на сервере Ubuntu 16.04.

Требования

  • Два узла с установленным сервером Ubuntu 16.04.
  • Две сетевые карты, установленные на каждом узле.
  • Дополнительный неразмеченный жесткий диск, установленный на каждом узле.
  • Пользователь, не являющийся root, с правами sudo, настроенный на каждом узле.

Начало работы

Перед началом вам необходимо настроить IP-адрес на каждом узле. Используйте следующие IP-адреса на каждом узле:

Узел1 :

172.16.0.1 на eth0 и 192.168.0.101 на eth1

Узел2 :

172.16.0.2 на eth0 и 192.168.0.102 на eth1

IP 192.168.0.103 будет IP с высокой доступностью.

Далее вам также необходимо настроить имя хоста и разрешение имен на каждом узле. Чтобы каждый узел мог общаться друг с другом. На первом узле откройте файл /etc/hosts и файл /etc/hostname:

sudo nano /etc/hosts

Добавьте следующие строки в конец файла:

172.16.0.1  Node1
172.16.0.2  Node2
sudo nano /etc/hostname

Измените файл, как показано ниже:

Node1

Сохраните и закройте файл, когда закончите.

На втором узле откройте файл /etc/hosts и файл /etc/hostname:

sudo nano /etc/hosts

Добавьте следующие строки в конец файла:

172.16.0.1  Node1
172.16.0.2  Node2
sudo nano /etc/hostname

Измените файл, как показано ниже:

Node2

Сохраните и закройте файл, когда закончите.

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

sudo apt-get update -y  
sudo apt-get upgrade -y

После обновления системы перезагрузите систему, чтобы применить эти изменения.

Установка DRBD и Heartbeat

Далее вам необходимо установить DRBD и Heartbeat на обоих узлах. По умолчанию оба доступны в стандартном репозитории Ubuntu 16.04. Вы можете установить их, просто выполнив следующую команду на обоих узлах:

sudo apt-get install drbd8-utils heartbeat -y

Далее запустите службу DRBD и Heartbeat и включите их для автоматического запуска при загрузке:

sudo systemctl start drbd  
sudo systemctl start heartbeat  
systemctl enable drbd  
systemctl enable heartbeat

Настройка DRBD и Heartbeat

Далее вам необходимо настроить устройство DRBD на каждом узле. Создайте один раздел на втором неразмеченном диске /dev/sdb на каждом узле.

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

sudo echo -e 'n\np\n1\n\n\nw' | fdisk /dev/sdb

Далее вам необходимо настроить DRBD на обоих узлах. Вы можете сделать это, создав файл /etc/drbd.d/r0.res на каждом узле.

sudo nano /etc/drbd.d/r0.res

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

global {
usage-count no;
}
resource r0 {
protocol C;
startup {
degr-wfc-timeout 60;
}
disk {
}
syncer {
rate 100M;
}
net {
cram-hmac-alg sha1;
shared-secret "aBcDeF";
}
on Node1 {
device /dev/drbd0;
disk /dev/sdb1;
address 172.16.0.1:7789;
meta-disk internal;
}
on Node2 {
device /dev/drbd0;
disk /dev/sdb1;
address 172.16.0.2:7789;
meta-disk internal;
}
}

Сохраните и закройте файл, когда закончите, затем откройте другой файл конфигурации на каждом узле:

sudo nano /etc/ha.d/ha.cf

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

# Интервал проверки
keepalive 1
# Время, прежде чем сервер будет объявлен мертвым
deadtime 10
# Задержка ожидания вторичного узла при загрузке
initdead 60
# Авто-восстановление
auto_failback off
# Интерфейс Heartbeat
bcast eth1
# Узлы для мониторинга
node Node1
node Node2

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

Далее откройте файл ресурсов /etc/ha.d/haresources на каждом узле:

sudo nano /etc/ha.d/haresources

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

Node1 192.168.0.103/24 drbddisk::r0 Filesystem::/dev/drbd0::/var/lib/mysql::ext4::noatime

Здесь Node1 — это имя хоста вашего основного активного узла, 192.168.0.103 — это плавающий IP-адрес, /var/lib/mysql — это точка монтирования, а /dev/drbd0 — это устройство DRBD.

Далее вам необходимо определить и сохранить идентичные ключи авторизации на обоих узлах. Вы можете сделать это, открыв файл /etc/ha.d/authkeys на каждом узле:

sudo nano /etc/ha.d/authkeys

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

auth1
1 sha1 ваш-защищенный-пароль

Здесь ваш-защищенный-пароль — это ваш защищенный пароль. Используйте один и тот же пароль на обоих узлах.

Далее создайте и запустите DRBD, выполнив следующую команду на узле Node1:

sudo drbdadm create-md r0  
sudo systemctl restart drbd  
sudo drbdadm outdate r0  
sudo drbdadm -- --overwrite-data-of-peer primary all  
sudo drbdadm primary r0  
sudo mkfs.ext4 /dev/drbd0  
sudo chmod 600 /etc/ha.d/authkeys  
sudo mkdir /var/lib/mysql

После создания диска DRBD на узле Node1 создайте диск DRBD на узле Node2 с помощью следующей команды:

sudo drbdadm create-md r0  
sudo systemctl restart drbd  
sudo chmod 600 /etc/ha.d/authkeys  
sudo mkdir /var/lib/mysql

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

sudo cat /proc/drbd

Если все в порядке, вы должны увидеть следующий вывод:

version: 8.4.5 (api:1/proto:86-101)
srcversion: F446E16BFEBS8B115AJB14H
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
ns:210413 nr:0 dw:126413 dr:815311 al:35 bm:0 lo:0 pe:11 ua:0 ap:0 ep:1 wo:f oos:16233752
[>....................] sync'ed: 3.3% (14752/14350)M
finish: 0:12:23 speed: 12,156 (16,932) K/sec

Далее запустите heartbeat на обоих узлах, чтобы включить часть переключения в вашей настройке.

sudo systemctl start heartbeat

Далее проверьте смонтированный раздел DRBD с помощью следующей команды на узле Node1:

sudo mount | grep drbd

Вы должны увидеть следующий вывод:

/dev/drbd0 on /var/lib/mysql type ext4 (rw,noatime,data=ordered)

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

sudo ip addr show | grep 192.168.0.103

Вы должны увидеть следующий вывод:

inet 192.168.0.103/24 brd 192.168.0.255 scope global secondary eth1:0

Установка и настройка MariaDB

После того как все правильно настроено на обоих узлах, пришло время установить сервер MariaDB на обоих узлах.

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

sudo apt-get install mariadb-server -y

Далее вам необходимо отключить службу MariaDB на обоих узлах:

sudo systemctl disable mysql

Здесь мы будем использовать узел Node1 в качестве основного, а базы данных на узле Node2 должны быть созданы и заполнены через синхронизацию с узлом Node1. Поэтому вам необходимо остановить службу MariaDB и удалить содержимое внутри /var/lib/mysql на узле Node2. Вы можете сделать это с помощью следующей команды:

sudo systemctl stop mysql  
sudo rm -rf /var/lib/mysql/*

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

sudo scp /etc/mysql/debian.cnf [email protected]:/etc/mysql/debian.cnf

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

Вы можете сделать это, выполнив следующую команду на узле Node1:

mysql -u root -p

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

MariaDB [(none)]> CREATE USER 'root'@'192.168.0.%' IDENTIFIED BY 'password';  
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.0..%' WITH GRANT OPTION;  
MariaDB [(none)]> FLUSH PRIVILEGES;  
MariaDB [(none)]> QUIT;

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

sudo sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mysql/mariadb.conf.d/*.cnf

Инициация Heartbeat для службы MariaDB

Далее вам необходимо добавить службу MariaDB в ваши экземпляры heartbeat на обоих узлах. Вы можете сделать это, отредактировав файл /etc/ha.d/haresources:

sudo nano /etc/ha.d/haresources

Измените следующие строки:

Node1 192.168.0.103/24 drbddisk::r0 Filesystem::/dev/drbd0::/var/lib/mysql::ext4::noatime mysql

Сохраните и закройте файл, когда закончите.

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

Сначала перезапустите heartbeat на узле Node1:

sudo systemctl restart heartbeat

Далее подождите 50 секунд, затем перезапустите службу heartbeat на узле Node2:

sudo systemctl restart heartbeat

Тестирование Heartbeat и DRBD

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

Сначала проверьте, что узел Node1 является основным узлом drbd с помощью следующей команды на узле Node1:

sudo cat /proc/drbd

Вы должны увидеть следующий вывод:

version: 8.4.5 (api:1/proto:86-101)
srcversion: F446E16BFEBS8B115AJB14H
O cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:22764644 nr:256 dw:529232 dr:22248299 al:111 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

Далее мы проверим, что диск DRBD смонтирован с помощью следующей команды:

sudo mount | grep drbd
/dev/drbd0 on /var/lib/mysql type ext4 (rw,noatime,data=ordered)

Далее проверьте службу MariaDB с помощью следующей команды:

sudo systemctl status mysql

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

mysql -h 192.168.0.103 -u root -p
MariaDB [(none)]> create database test;  
MariaDB [(none)]> quit

Далее перезапустите heartbeat на узле Node1:

sudo systemctl restart heartbeat

Теперь heartbeat интерпретирует этот перезапуск как сбой MariaDB на узле Node1 и должен инициировать переключение, чтобы сделать узел Node2 основным сервером.

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

sudo cat /proc/drbd

Вы должны увидеть следующий вывод:

version: 8.4.5 (api:1/proto:86-101)
srcversion: F446E16BFEBS8B115AJB14H
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
ns:22764856 nr:388 dw:529576 dr:22248303 al:112 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

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

sudo cat /proc/drbd

Вы должны увидеть следующий вывод:

version: 8.4.5 (api:1/proto:86-101)
srcversion: F446E16BFEBS8B115AJB14H
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:412 nr:20880892 dw:20881304 dr:11463 al:7 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

Далее проверьте, что MariaDB работает на узле Node2:

sudo systemctl status mysql

Теперь подключитесь к серверу MariaDB, используя плавающий IP на узле Node2 от удаленного пользователя.

mysql -h 192.168.0.103 -u root -p

Далее просмотрите тестовую базу данных, которую мы создали ранее, пока узел Node1 был основным сервером.

MariaDB [(none)]> show databases;

Вы должны увидеть следующий вывод:

 +--------------------+
| База данных |
+--------------------+
| test |
| information_schema |
| lost+found |
| mysql |
| performance_schema |
+--------------------+
5 строк в наборе (0.04 сек)
Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.