Thank you for reading this post, don't forget to subscribe!
Задача:
Настроить кластер DRBD из двух нод
Дано:
NODE1 CentOS7
NODE2 CentOS7
DRBD 9
Диск для репликации sdb1
Решение:
Установка пакета DRBD9
Подключаем репозиторий
rpm -ivh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-elrepo.org
Устанавливаем пакет
yum install drbd90-utils kmod-drbd90
Добавляем в автозагрузку модуль ядра
echo drbd > /etc/modules-load.d/drbd.conf
modprobe drbd
Проверяем, все ли подгрузилось
lsmod | grep -i drbd
drbd_transport_tcp 22144 1
drbd 553913 2
drbd_transport_tcplibcrc32c 12644 1 drbd
Настройка
Настройка файла hosts
Необходимо в файл /etc/hosts добавить имена нод, если они не могут выть определены с основного ДНС сервера
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.10.0.1 drbd01
10.10.0.2 drbd02
Создание файла ресурсов с именем /etc/drbd.d/data.res
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
resource data { protocol C; device /dev/drbd0; disk /dev/sdb1; meta-disk internal; on node1 { address 10.10.0.1:7788; } on node2 { address 10.10.0.2:7788; } } |
Инициализация и запуск ресурса (по сути создание метаданных)
Данную процедуру выполняем на обоих нодах
drbdadm create-md data
Если возникает ошибка
1 2 3 4 5 6 7 8 9 10 |
Device size would be truncated, which would corrupt data and result in 'access beyond end of device' errors. You need to either * use external meta data (recommended) * shrink that filesystem first * zero out the device (destroy the filesystem) Operation refused. Command 'drbdmeta 0 v09 /dev/sdb1 internal create-md 1' terminated with exit code 40 |
То необходимо удалить остаточные данные, например, ранее диск был отформатирован под ext4 или использовался в массиве RAID
dd if=/dev/zero of=/dev/sdb1 bs=1024k count=1024
После этого можно повторно инициализировать ресурс командой drbdadm create-md
Назначаем первичную ноду и поднимаем ее. Выполняется на первичной ноде
1 2 3 4 5 6 7 |
drbdadm primary --force data drbdadm status data data role:Secondary disk:UpToDate drbd01 role:Primary peer-disk:UpToDate |
Примечание
Файл /proc/drbd
В 9 версии нет информации в традиционном файле /proc/drbd
cat /proc/drbd
version: 9.0.16-1 (api:2/proto:86-114)
GIT-hash: ab9777dfeaf9d619acc9a5201bfcae8103e9529c build by mockbuild@, 2018-11-03 13:54:24
Transports (api:16): tcp (9.0.16-1)
Информацию можно получить по следующему пути
watch cat /sys/kernel/debug/drbd/resources/data/connections/node02/0/proc_drbd
drbdadm status data
Устранение ошибки split-brain
Ошибка может возникать в случае одновременного отключения хостов и даже кратковременной потери соединения. Первое, что необходимо, определить ноду с наиболее актуальными данными (по времени загрузки, по системе мониторинга или каким то иным способом)
На сервере 1 переводим ресурс data в состояние secondary и подключаем к data с параметром –discard-my-data,
drbdadm secondary data
drbdadm -- --discard-my-data connect data
Если выходит следующее сообщение
Failure: (125) Device has a net-config (use disconnect first)
Command 'drbdsetup 0 net 10.10.0.1:7789 10.10.0.2:7789 C --set-defaults --create-device --allow-two-primaries --discard-my-data' terminated with exit code 10
Отключаем data и повторяем операцию.
drbdadm disconnect data
drbdadm -- --discard-my-data connect data
На втором сервере запускаем
drbdadm connect data
Проверяем состояние, в случае если данные не синхронизированы начнется синхронизация разделов.
drbdadm status data
Теория
Основной файл конфигурации
minor-count — По умолчанию модуль DRBD загружается с minorcount 32, если используется много устройств и номеров не хватает их можно явно указать здесь;
dialog-refresh — Обновление экрана каждые n секунд, может быть полезно при подключение к серверу по последовательному интерфейсу;
disable-ip-verifi cation — Позволяет отключить одну из проверок drbdadm;
usage-count — Участвовать в глобальном подсчете пользователей DRBD или нет;
common {…} — Секция, опции которой наследуют все ресурсы;
syncer — Позволяет задать пропускную способность при синхронизации устройств по сети, разработчики рекомендуют использовать 30% от возможностей сети. Например, если у вас 100 Мбит сеть, то 100 * 0.3 = 30 Мб;
resource data {…} — Секция описания ресурса;
protocol — Задает протокол для DRBD, подробнее о них написано далее;
handlers {…} — Задает обработчики, например что делать в случае потери соединения первичной ноды;
startup {…} — Секция для опций используемых в процессе загрузки DRBD;
wfc-timeout — Ожидание таймаута соединения;
degr-wfc-timeout — Ожидание таймаута подключения, в случае если в кластере одна рабочая нода;
wait-after-sb — Ожидание после split brain, ситуация когда все ноды могут попытаться запустить сервис одновременно, думая что другие ноды недоступны. В свою очередь это может повлечь за собой повреждение данных;
disk {…} — Секция с настройками оповещения верхних уровней, если замечено, что происходят I/O ошибки при обращение к диску;
on-io-error detach — Нода перестает работать с носителем данных если на нем происходят I/O ошибки;
fencing — Процесс блокировки ресурсов с нод статус которых сомнителен;
net {…} — Секция задает различные опции сети, такие как размеры буфера, максимальное число запросов обрабатываемых DRBD. В обычных ситуациях значений по умолчанию достаточно;
on host {…} — Секция описания нод;
device — Указывает на устройство DRBD, они расположены в /dev/ и начинаются с 0;
disk — Физический диск или раздел, который будет задействован в работе DRBD;
address — IP-адрес и порт этой ноды, нужно указывать именно ее IP-адрес а не shared IP;
meta-disk — Meta данные могут храниться на отдельном разделе диске а могут на диске описанном в опции disk;
max-buffers — Число буферов используемых для хранения данных, пока те записываются на диск;
max-epoch-size — Максимальное число запросов на запись. Должно соответствовать max-buff ers;
timeout, ping-int — Эти значения можно повысить если наблюдаются обрывы связи;
Возможный статус соединения
StandAlone — Недоступна сетевая конфигурация. Этот ресурс еще не был подключен или был административно отключен (drbdadm disconnect), или сбросил сетевое подключение из за не пройденной аутентификации или split brain;
Disconnecting — Временное состояние пока происходит отключение,
следующее состояние StandAlone;
Unconnected — Временное состояние до попытки подключения. Следующее возможное состояние WFConnection или WFReportParams;
Timeout — Временное состояние после перерыва связи с peer-ом. Следующее возможное состояние Unconnected;
BrokenPipe — Временное состояние после потери связи с peer-ом. Следующее возможное состояние Unconnected;
NetworkFailure — Временное состояние после потери связи с партнером. Следующее возможное состояние — Unconnected;
ProtocolError — Временное состояние после потери связи с партнером. Следующее возможное состояние Unconnected;
TearDown — Временное состояние, peer закрывает соединение. Следующее возможное состояние Unconnected;
WFConnection — Нода ожидает пока peer станет виден в сети;
WFReportParams — TCP соединение было установлено, нода ожидает первый сетевой пакет от peer-ра;
Connected — DRBD соединение установлено, зеркалирование данных активно. Это нормальное состояние;
StartingSyncS — Начата полная синхронизация, выполняется администратором. Следующее возможное состояние SyncSource или PausedSyncS;
StartingSyncT — Начата полная синхронизация, выполняется администратором. Следующее возможное состояние WFSyncUUID;
WFBitMapS — Частичная синхронизация начата. Следующее возможное состояние SyncSource или PausedSyncS;
WFBitMapT — Частичная синхронизация начата. Следующее возможное состояние WFSyncUUID;
WFSyncUUID — Синхронизация скоро начнется. Следующее возможное состояние SyncTarget или PausedSyncT;
SyncSource — Синхронизация запускается, локальная нода является источником синхронизации;
SyncTarget — Синхронизация запускается, локальная нода является целью синхронизации;
PausedSyncS — Локальная нода источник синхронизации, но синхронизация находится в режиме паузы;
PausedSyncT — Локальная нода является целью синхронизации, но синхронизация находится в режиме паузы;
VerifyS — Запускается онлайн верификация, локальная нода является источником верификации;
VerifyT — Запускается онлайн верификация, локальная нода является целью верификации.
Роли ресурсов:
Primary — первичная нода;
Secondary — вторичная нода;
Unknown — роль ресурса неизвестна. Локальный ресурс не бывает в этой роли. Она отображается только для ресурса peer-ра в отключенном режиме.
Возможные состояния диска
Diskless — Драйверу DRBD не назначено блочное устройство;
Attaching — Переходное состояние пока считываются meta данные;
Failed — Переходное состояние последовавшее за I/O ошибкой локального блочного устройства, следующее возможное состояние Diskless;
Negotiating — Переходное состояние пока налаживается соединение;
Inconsistent — Данные непоследовательны. Это статус нового ресурса;
Outdated — Данные ресурса последовательны но устарели;
DUnknown — Статус используется для peer-ра если не доступно сетевое подключение;
Consistent — Последовательные данные ноды без сетевого подключения. После подключения будет решено, данные являются актуальными или устаревшими;
UpToDate — Все данные в актуальном состояние. Это нормально состояние.
Файл конфигурации ресурса
DRBD поддерживает как синхронную, так и асинхронную синхронизацию
Асинхронной репликация, протокол «A» — запись считается завершенной, как только запись завершилась на локальное устройство и данные были отправлены на удаленный узел
Промежуточный протокол репликации «B» — запись считается успешной, если она завершилась на локальный диск и удаленный узел подтвердил получение (но не локальную запись) данных
Синхронная репликация, протокол «С» — операция записи считается завершенной, когда и локальный, и сетевой диски сообщают об успешном завершении записи
on node1: состояния on on, к которым относятся вложенные операторы конфигурации
data: это имя нового ресурса
device /dev/drbd0: указывает новое виртуальное блочное устройство, управляемое DRBD
disk /dev/sdb1: это раздел блочного устройства, который является резервным устройством для устройства DRBD
meta-disk: определяет, где DRBD хранит свои метаданные. Использование Internal означает, что DRBD хранит свои метаданные на том же физическом устройстве нижнего уровня, что и фактические производственные данные
address: указывает IP-адрес и номер порта соответствующего узла
Инициализация и включение ресурса
Для взаимодействия с DRBD мы будем использовать следующие инструменты администрирования, которые взаимодействуют с модулем ядра для настройки и администрирования ресурсов DRBD:
drbdadm: инструмент администрирования высокого уровня DRBD
drbdsetup: инструмент администрирования более низкого уровня для подключения устройств DRBD к их устройствам резервного блока, для настройки пар устройств DRBD для зеркалирования их устройств резервного блока и для проверки конфигурации работающих устройств DRBD
drbdmeta: инструмент управления метаданными
Увеличение скорости синхронизации DRDB
При синхронизации идет нагрузка как на диски, так и на сеть, поэтому параметры необходимо подбирать исходя из ваших скоростей. Так у меня на 10Гб сети, стоит ограничение по нагрузке на диски в 350Мб\с, что составляет примерно 3Гб\с по трафику
1 2 3 4 5 6 7 8 9 10 |
Every 2,0s: cat /sys/kernel/debug/drbd/resources/maildata/connections/node02/0/proc_drbd Tue Sep 17 14:42:34 2019 0: cs:SyncSource ro:Secondary/Secondary ds:UpToDate/Inconsistent C r----- ns:1756942336 nr:0 dw:0 dr:1756944440 al:0 bm:0 lo:0 pe:[0;3] ua:0 ap:[0;0] ep:1 wo:1 oos:8003072084 [==>.….….….….] sync'ed: 18.1% (7815500/9531260)M <strong>finish: 5:55:44 speed: 374,952 (457,384 -- 372,624) K/sec</strong> 0% sector pos: 0/19520022696 resync: used:0/61 hits:3447618 misses:26810 starving:0 locked:0 changed:13405 act_log: used:0/1237 hits:0 misses:0 starving:0 locked:0 changed:0 blocked on activity log: 0/0/0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
ATOP - node02 2019/09/17 14:44:16 -------------- 10s elapsed PRC | sys 1.82s | user 0.06s | #proc 174 | #trun 3 | #tslpi 194 | #tslpu 0 | #zombie 0 | #exit 0 | CPU | sys 12% | user 1% | irq 4% | idle 83% | wait 0% | ipc notavail | curf 2.20GHz | curscal ?% | CPL | avg1 0.04 | avg5 0.17 | avg15 0.21 | | csw 14638 | intr 43454 | | numcpu 1 | MEM | tot 2.0G | free 1.3G | cache 146.3M | buff 19.0M | slab 46.3M | shmem 46.8M | vmbal 0.0M | hptot 0.0M | SWP | tot 3.0G | free 3.0G | | | | | vmcom 413.7M | vmlim 4.0G | LVM | 5--02--MAILS | busy 48% | read 0 | write 7024 | KiB/w 510 | MBr/s 0.0 | MBw/s 350.0 | avio 0.67 ms | LVM | os_node-root | busy 0% | read 0 | write 1 | KiB/w 4 | MBr/s 0.0 | MBw/s 0.0 | avio 0.00 ms | DSK | sdb | busy 48% | read 0 | write 7024 | KiB/w 510 | MBr/s 0.0 | MBw/s 350.0 | avio 0.67 ms | DSK | sda | busy 0% | read 0 | write 1 | KiB/w 4 | MBr/s 0.0 | MBw/s 0.0 | avio 0.00 ms | NET | transport | tcpi 67949 | tcpo 42788 | udpi 82 | udpo 55 | tcpao 0 | tcppo 0 | tcprs 0 | NET | network | ipi 68034 | ipo 42846 | ipfrw 0 | deliv 68034 | | icmpi 3 | icmpo 0 | <strong>NET | ens192 29% | pcki 68044 | pcko 42846 | sp 10 Gbps | si 2939 Mbps | so 2490 Kbps | erri 0 | erro 0 |</strong> PID SYSCPU USRCPU VGROW RGROW RDDSK WRDSK RUID EUID ST EXC THR S CPUNR CPU CMD 1/1 1421 1.63s 0.00s 0K 0K 0K 0K root root -- - 1 R 0 17% drbd_r_maildat 1180 0.02s 0.05s 0K 0K 0K 0K root root -- - 2 S 0 1% corosync 419 0.04s 0.00s 0K 0K 0K 0K root root -- - 1 S 0 0% kworker/u2:29 1412 0.04s 0.00s 0K 0K 0K 0K root root -- - 1 S 0 0% drbd_s_maildat 1959 0.04s 0.00s 0K 0K 0K 0K root root -- - 1 S 0 0% kworker/u2:0 1559 0.02s 0.00s 0K 0K 0K 0K root root -- - 1 R 0 0% atop 3 0.02s 0.00s 0K 0K 0K 0K root root -- - 1 S 0 0% ksoftirqd/0 802 0.00s 0.01s 0K 0K 0K 0K root root -- - 2 S 0 0% vmtoolsd 515 0.01s 0.00s 0K 0K 0K 0K root root -- - 1 S 0 0% kworker/0:1H 1145 0.00s 0.00s 0K 0K 0K 0K zabbix zabbix -- - 1 S 0 0% zabbix_agentd |
В файле/etc/drbd.d/global_common.conf заданы следующие параметры
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
disk { # size on-io-error fencing disk-barrier disk-flushes # disk-drain md-flushes resync-rate resync-after al-extents # c-plan-ahead c-delay-target c-fill-target c-max-rate # c-min-rate disk-timeout on-io-error detach; no-disk-flushes ; no-disk-barrier; c-plan-ahead 10; c-fill-target 24M; c-min-rate 30M; c-max-rate 350M; } net { # protocol timeout max-epoch-size max-buffers # connect-int ping-int sndbuf-size rcvbuf-size ko-count # allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri # after-sb-1pri after-sb-2pri always-asbp rr-conflict # ping-timeout data-integrity-alg tcp-cork on-congestion # congestion-fill congestion-extents csums-alg verify-alg # use-rle # max-epoch-size 20000; max-buffers 36k; sndbuf-size 1024k ; rcvbuf-size 2048k; } |