DRBD (Distributed Remote Block Device) - розповсюдження блокового пристрою через мережу для операційної системи GNU/Linux. Спеціально розроблений для побудови високонадійних та продуктивних кластерів. Це здійснюється з допомогою дзеркального відображення всього блочного пристрою через (виділену) мережу. Подібно до raid-1, тільки через мережу.

Версія 1 (альфа)

Вступ

Опис роботи DRBD

DRBD бере дані, записує їх на локальний диск і пересилає до іншого комп'ютера. На іншому вузлі DRBD приймає дані і записує там на диск.

Інші компоненти необхідні для реалізації: сервіс членства у кластері, наприклад, hearbeat і деякі звичні програми, що працюють з блоковими пристроями: файлова система і fsck, журналізована файлова система, база даних з здатністю до відновлення.

Кожний пристрій (DRBD може працювати з декількома) має два стани: 'основний' чи 'другорядний'. На основному вузлі працюють програми з пристроєм /dev/drbdX. Кожний запис надсилається на "локальний низькорівневий блоковий пристрій" і до вузла з пристроєм у стані 'другорядний'. На другорядному вузлі дані просто записуються на низькорівневий блоковий пристрій. Зчитування даних завжди ведеться локально.

Коли основний вузол стає недоступним, heartbeat автоматично перемикає другорядний вузол в стан ’основний’ і запускає програми там (якщо ви використовуєте файлову систему без журналювання, то запуститься fsck).

Якщо сервер, що зупинявсь, знов стає доступним, він появляється як новий ’другорядний’, і мусить синхронізувати свій вміст з ’основним’. Звичайно, все це відбувається без переривання роботи сервісів, і синхронізуються тільки ті частини блочного пристрою що змінились за час простою.

DRBD завжди робить доцільну десинхронізацію, коли це можливо. Ви можете визначити певний розмір "active set". Це дозволить мати загальний час десинхронізації 1-3 хвилини, незалежно від розміру пристрою (зараз максимальний розмір 4TB), навіть при виході з ладу заліза на основному вузлі.

Відношення до високонадійних та продуктивних кластерних систем (HA clusters)

Більшість кластерів HA використовують спільні масиви збереження даних, тобто масиви збереження даних (диски), одночасно підключені до більш ніж до одного вузла (через спільні SCSI шини чи Fibre Channel).

DRBD має таку ж поведінку, як спільні масиви даних, але не потребує додаткового заліза. Воно працює поверх звичайної мережі IP, що набагато дешевше ніж спеціальні масиви даних.

Поки що DRBD гарантує запис-зчитування тільки на одному вузлі одночасно, що, фактично, реалізує тільки надійний кластер HA. Для глобальних файлових систем корисно мати одночасний запис/зчитування на обидвої вузлах.

Встановлення DRBD

DRBD є складовою багатьох дистрибутивів Лінукс. Якщо у вашому немає, беріть тут: http://www.drbd.org або тут: http://www.linbit.com/support/drbd-current. Для встановлення мусять бути актуальними сирці ядра. По суті цей пакет розділений на два: модуль ядра та користувацькі утиліти. В Gentoo DRBD встановлюється наступною командою:

# emerge sys-cluster/drbd

В Debian DRBD встановлюємо командами:

# apt-get install drbd0.7-module-source
# apt-get install drbd0.7-utils
# apt-get install dpatch
# cd /usr/src
# tar -zxf drbd0.7.tar.gz
# cd /usr/src/modules/drbd
# module-assistant prepare
# module-assistant automatic-install drbd0.7-module-source
# cd /usr/src
# dpkg -i drbd0.7-module-2.4.27-2-k7_0.7.10-3+2.4.27-8_i386.deb

Інструкція по встановленню в Debian: http://www.linux-ha.org/DRBD_2fInstallDebianPackages07.

При бажанні, DRBD можна включити в монолітне ядро вручну. Для цього потрібно пропатчити джерельні коди ядра:

# cd /usr/src
# tar -xvzf where/you/downloaded/it/drbd-0.7.10.tar.gz
# cd drbd-0.7.10
# make KDIR=/usr/src/linux-2.6.x kernel-patch

Отримаємо patch-linux-2.6.x-drbd-0.7_whatever.

# cd /usr/src/linux-2.6.x
# patch -p1 < /usr/src/drbd-0.7.10/drbd/patch-linux-2.6.x-drbd-0.7_whatever

Детальнішу інформацію про компіляцю ядра можна почерпнути тут: Компіляція ядра GNU/Linux Додатково додайте підтримку DRBD:

Device Drivers --->
      Block Device --->
           [*] DRBD suport

Програма drbsetup

Програма drbsetup є низькорівневим інструментом для налаштування DRBD. З його допомогою можна встановити зв'язок між пристроєм drbd та низькорівневим блоковим пристроєм, визначити пару пристроїв DRBD для дзеркального відображення їх низькорівневих блокових пристроїв (дисків) і перевірити налаштування працюючих пристроїв DRBD. Детальніше дивіться drbdsetup.8. На практиці, замість drbsetup використовують drbdadm, перед тим налаштувавши /etc/drbd.conf. Отож, наступні команди можна пропустити.

На вузлі 2 виконуємо:

$ insmod drbd.o
$ drbdsetup /dev/drbd0 disk /dev/sdb6
$ drbdsetup /dev/drbd0 net 10.0.0.11 10.0.0.10 C

На вузлі 1 виконуємо:

$ insmod drbd.o
$ drbdsetup /dev/drbd0 disk /dev/sdb6
$ drbdsetup /dev/drbd0 net 10.0.0.10 10.0.0.11 C
$ drbdsetup /dev/drbd0 primary

Тепер /dev/drbd0 можна використовувати як і будь-який інший пристрій.

Налаштування в drbd.conf

Конфігураційним файлом DRBD, що використовується різними скриптами та програмою drbdadm є /etc/drdb.conf. Хороший приклад drdb.conf можна знайти в /usr/src/drbd-0.7.10/scripts/drbd.conf, чи в /usr/share/doc/drbd-0.7.10/drbd.conf.gz. Детальну інформацію щодо синтаксису файлу та різних параметрів з прикладами, можна прочитати в drbd.conf.5

Приклад /etc/drbd.conf

Налаштування на обох вузлах кластеру мають бути ідентичними.

resource diskless {
  protocol C;
  incon-degr-cmd "halt -f";  # killall heartbeat буде хорошою альтернативою :->

  disk {
    on-io-error panic;
  }

  syncer {
    rate 5M;                 # Note: 'M' is MegaBytes, not MegaBits
  }

  on primarydhcp {
    device    /dev/drbd0;
    disk      /dev/sdb6;
    address   10.0.0.10:7789;
    meta-disk  internal;
  }

  on secondarydhcp {
    device    /dev/drbd0;
    disk      /dev/sdb6;
    address   10.0.0.11:7789;
    meta-disk  internal;
  }
} 

drbdadm

Високорівневий інтерфейс до DRBD, бажано користуватись саме ним. Детальна інформація є тут: drbdadm.8

Запуск DRBD

Запустити DRBD можна за допомогою ініціалізаційного скрипта:

# /etc/init.d/drbd start

Скрипт може задати питання: «Do you want to abort waiting for other server and make this one primary?». Відповідайте «yes» тільки у випадку коли впевнені, що інший вузол кластеру відновити не можна. Встановлення одного з вузлів у основний режим:

# drbdadm primary all

або насильно

# drbdsetup /dev/drbd0 primary --do-what-I-say

Налаштування файлової системи

Створення і монтування файлової системи на новоствореному віртуальному блоковому пристрої DRBD здійснюється на основному вузлі:

# mkreiserfs /dev/drbd0  (чи mke3fs, чи xfs,...)
# mkdir /share/spool0
# mount /dev/drbd0 /share/spool0

Створюємо директорії:

# mkdir /share/spool0/data

Створені директорії можна експортувати через NFS.

NFS поверх DRDB

Опис мережевої файлової системи NFS знаходиться тут: NFS - мережева файлова система. Звичайно директорії для експорту повинні знаходитись на файловій системі, що працює поверх віртуального пристрою DRBD. Потрібно виконати все ідентично на обох вузлах, крім завантаження NFS та налаштування автоматичного запуску NFS при включені комп'ютера.

Файлова система, що працює поверх DRBD може бути одночасно примонтована тільки на одному з вузлів. Тому ми мусимо віддати повний контроль heartbeat над віртуальною файловою системою DRBD та мережевою NFS, ось чому не можна запускати сервіс NFS на обох вузлах. В Gentoo це забезпечується командою:

# rc-update -d nfsd default

В Debian:

# update-rc.d -f nfs-kernel-server remove

NFS звично зберігає свої дані в /var/lib/nfs. Ці дані для управління мусять знаходитись на віртуальному пристрої DRBD щоб бути доступними на активному вузлі після відключення партнера. Для розміщення файлів для керування NFS на томі DRBD виконайте наступну команду (її можна виконати тільки на основному вузлі де примонтована файлова система):

# mv /var/lib/nfs /share/spool0/varlibnfs
# ln -s /share/spool0/varlibnfs /var/lib/nfs

Статистичний сервіс NFS асоціює ім'я комп'ютера зі звичайним інформаційним станом. Отже ми не будемо мати те саме ім'я після відключення основного вузла, тобто потрібно вказати статистичному сервісу використовувати одне кластерне ім'я (будь-яке постійне ім'я) замість імен вузлів. В Gentoo для цього встановлюємо опцію RPCSTATDOPTS="diskclaster"

# cat /etc/conf.d/nfs
# /etc/conf.d/nfs
# $Header: /var/cvsroot/gentoo-x86/net-fs/nfs-utils/files/nfs.confd,v 1.9 2005/03/18 07:22:00 vapier Exp $

# Config file for /etc/init.d/nfs

# If you wish to set the port numbers for lockd,
# please see /etc/sysctl.conf

# Number of servers to be started up by default
RPCNFSDCOUNT=8

# Options to pass to rpc.mountd
# ex. RPCMOUNTDOPTS="-p 32767
RPCMOUNTDOPTS=""

# Options to pass to rpc.statd
# ex. RPCSTATDOPTS="-p 32765 -o 32766"
RPCSTATDOPTS="diskclaster"

# Options to pass to rpc.idmapd
RPCIDMAPDOPTS=""

# Timeout (in seconds) for exportfs
EXPORTFSTIMEOUT=30

В Debian потрібно визначити змінну STATDOPTS в /etc/default/nfs-common. Для цього виконуємо:

# echo 'STATDOPTS="-n diskclaster"' >> /etc/default/nfs-common

heartbeat - серце кластеру

Опис забезпечення прозорого переключення клієнтів з відключеного основного вузла на другорядний наводиться в розділі "heartbeat для NFS поверх DRDB" на сторінці heartbeat - серце кластеру

Література

--Svyat 18:49, 1 жов 2005 (EEST)