Серверы · 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 -pMariaDB [(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 сек)Get new posts in your inbox
No spam. Unsubscribe anytime.