1. НАСТРОЙКА DRBD9

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

 

 

 

Ини­ци­а­ли­за­ция и запуск ресур­са (по сути созда­ние метаданных)
Дан­ную про­це­ду­ру выпол­ня­ем на обо­их нодах

drbdadm create-md data

Если воз­ни­ка­ет ошибка

 

 

 

То необ­хо­ди­мо уда­лить оста­точ­ные дан­ные, напри­мер, ранее диск был отфор­ма­ти­ро­ван под ext4 или исполь­зо­вал­ся в мас­си­ве RAID

dd if=/dev/zero of=/dev/sdb1 bs=1024k count=1024

После это­го мож­но повтор­но ини­ци­а­ли­зи­ро­вать ресурс коман­дой drbdadm create-md

Назна­ча­ем пер­вич­ную ноду и под­ни­ма­ем ее. Выпол­ня­ет­ся на пер­вич­ной ноде

 

 

При­ме­ча­ние
Файл /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Гб\с по трафику

 

 

 

 

В файле/etc/drbd.d/global_common.conf зада­ны сле­ду­ю­щие параметры