DRBD (Distributed Replicated Block Device — распределённое реплицируемое блочное устройство) представляет собой распределенное, гибкое и универсально реплицируемое решение хранения данных для Linux.
DRBD имеет поверхностное сходство с RAID-1 в том, что он включает в себя копию данных на двух устройствах хранения, так что в случае сбоя данные на другом могут быть использованы. Однако оно работает совсем иначе, чем RAID и даже сетевой RAID.
В этой статье я поделюсь опытом как создать репликацию drbd локально, не используя drbdadm, а используя drbdsetup и drbdmeta.
drbdadm: инструмент администрирования высокого уровня DRBD. Он используется поверх drbdsetup и drbdmeta
drbdsetup: инструмент администрирования более низкого уровня для подключения устройств DRBD к их устройствам резервного копирования, настройки пар устройств DRBD для отражения их устройств резервного копирования и для проверки конфигурации работающих устройств DRBD.
drbdmeta: инструмент управления метаданными.
Тестовая среда
Ubuntu 18.04, версия ядра 4.19 и выше
Шаг 1. Установка и загрузка модуля
Ванильные ядра содержат только восьмую версию DRBD, желательно пересобрать ядра без этого модуля, и установить девятую версию из репозитория.
Добавляем репозитории в ваш sources.list
deb http://ppa.launchpad.net/linbit/linbit-drbd9-stack/ubuntu bionic main
deb-src http://ppa.launchpad.net/linbit/linbit-drbd9-stack/ubuntu bionic main
Обновляем кэш и устанавливаем пакеты drbd
apt update
apt install drbd-dkms drbd-utils
Проверяем версию модуля и загружаем его с параметрами
modinfo drbd
modprobe drbd usermode_helper=/bin/true minor_count=36
Шаг 2. Настройка global_common.conf
Я использую следующие параметры конфига, все остальные можно будет задавать при настройке ресурса
# DRBD is the result of over a decade of development by LINBIT.
# In case you need professional services for DRBD or have
# feature requests visit http://www.linbit.com
global {
usage-count no;
}
common {
disk {
c-delay-target 50;
c-fill-target 0;
}
net {
csums-alg hash-alg;
}
}
Обо всех параметрах более подробно можно почитать здесь
Шаг 3. Настройка ресурса DRBD9
Что потребуется:
Два блочных устройства(источник и приемник)
Два логических тома под метаданные(я использовал по 2 гб)
Процесс создания:
Создаем два ресурса
drbdsetup new-resource drbdres0 0
drbdsetup new-resource drbdres1 1
где:
drbdres0 и drbdres1 - имя ресурса
0 и 1 - peer node id
Создаем девайсы drbd
drbdsetup new-minor drbdres0 0 0
drbdsetup new-minor drbdres1 1 0
где:
drbdres0 и drbdres1 - ресурсы созданные ранее
второй аргумент(minor) - номер созданного девайса, т.е. drbd0, drbd1
третий аргумент - номер тома
Создаем метаданные на томах для метаданных
drbdmeta --force 0 v09 '/dev/zd0' flex-external create-md 1
drbdmeta --force 1 v09 '/dev/zd16' flex-external create-md 1
Добавляем диски к ранее созданным drbd устройствам
drbdsetup attach 0 '/dev/zd32' '/dev/zd0' flexible --disk-flushes=no --disk-barrier=no --al-extents=3389
drbdsetup attach 1 '/dev/zd64' '/dev/zd16' flexible --disk-flushes=no --disk-barrier=no --al-extents=3389
где:
первый аргумент (0 и 1) - это номер созданного девайса(minor)
'/dev/zd32' и '/dev/zd64' - источник и приемник
'/dev/zd0' и '/dev/zd16' - ранее созданные тома для метаданных и дальше идут параметры
Создаем новых peer'ов
drbdsetup new-peer drbdres0 1 --protocol=C --max-buffers=36K --max-epoch-size=36K --sndbuf-size=1024K --rcvbuf-size=2048K
drbdsetup new-peer drbdres1 0 --protocol=C --max-buffers=36K --max-epoch-size=36K --sndbuf-size=1024K --rcvbuf-size=2048K
где:
drbdres0 и drbdres1 - ранее созданные ресурсы
второй параметр (1 и 0) - это peer node id и далее идут параметры соединения
Создаем конечные точки подключения
drbdsetup new-path drbdres0 1 127.0.0.1:7788 127.0.0.1:7789
drbdsetup new-path drbdres1 0 127.0.0.1:7789 127.0.0.1:7788
Примечание: Если захотите создать еще больше ресурсов локально, то нужно будет использовать другие порты. например: 127.0.0.1:7790 127.0.0.1:7791 и так далее
Добавляем опции
drbdsetup peer-device-options drbdres1 0 0 --c-plan-ahead=0 --resync-rate=80M
drbdsetup peer-device-options drbdres0 1 0 --c-plan-ahead=0 --resync-rate=80M
resync-rate - это максимальная скорость синхронизации. Имейте ввиду, что если поставите высокую скорость, то drbd будет использовать весь ресурс диска или логического тома, и если на нем используется какое то приложение, то оно не получит доступ к диску пока не закончится синхронизация.
Делаем роль primary для первого ресурса
drbdsetup primary drbdres0 --force
Выполняем подключение
drbdsetup connect drbdres0 1
drbdsetup connect drbdres1 0
После выполненных действий при выводе статуса
drbdsetup status -v
должна начаться синхронизация, после окончания синхронизации у обоих ресурсов должно быть UpToDate. Прочитать больше о статусах можно здесь в разделе "Теория". Официальный сайт с документацией. Дальше использовать для работы необходимо новосозданные девайсы drbd0/drbd1 в зависимости какой primary.
Комментарии (9)
akhkmed
24.04.2022 00:57Спасибо.
Расскажите, пожалуйста, подробнее, про использование --disk-flushes=no и --disk-barrier=no.
В каких ситуациях это приведёт к развалу всей конфигурации после аварии электропитания?
Nnnnoooo
24.04.2022 02:04Ну и неплохо бы сравнение производительности или хотя бы описание как оно работает под разными нагрузками. Т.е. какой именно юзкейс подходит, а какой идет фтопку.
maksasila
24.04.2022 13:14Тестировал DRBD9 с ProxMox. Работает хорошо только если нужно синхронизировать маленькие объёмы.
creker
24.04.2022 16:24В подобных системах мне всегда непонятен один вопрос - split-brain эта штука как будет решать? С двумя пирами то? Как будут разрешаться конфликты, когда новая запись есть и там, и там? Это самый главный вопрос во всех распределенных системах - failure modes. А то эдак можно rsync поднять в кроне. А че, синхронизирует же.
edo1h
такое многообещающее начало, но в итоге вместо текста для людей статья свалилась в очередную инструкцию «введи непонятные буковки в чёрное окно и должно заработать».
у меня после прочтения (точнее, пролистывания, не буду же я и правда читать команды) осталась куча вопросов:
да и использование ubuntu 18 в 2022 году вызывает вопросы
13werwolf13
могу ответить только на последний вопрос:
потому что убунта, несвежая, lts..
по остальным вопросам я бы сам хотел хорошую статейку почитать (ради чего тут и оказался) но увы