Сначала настроим общие разделы узлов кластера средствами DRBD. Установка DRBD производится штатным для ALT Linux способом. Cмотрим, какие пакеты имеются в наличии:
[root@m1 ~]# apt-cache search drbd drbd-tools - Distributed Redundant Block Device utilities kernel-modules-drbd-ovz-smp - Linux drbd kernel modules for DRBD. kernel-modules-drbd-std-smp - Linux drbd kernel modules for DRBD. kernel-modules-drbd-wks-smp - Linux drbd kernel modules for DRBD. kernel-source-drbd-0.7.22 - Kernel source for DRBD
Затем определяем, какое у нас ядро:
[root@m1 ~]# uname -a Linux m1.mydomain.com 2.6.18-std-smp-alt7 #1 SMP Sat Aug 4 01:05:35 MSD 2007 x86_64 GNU/Linux
На основании этой информации (std-smp) решаем, какие именно пакеты нам нужны, и устанавливаем их:
[root@m1 ~]# apt-get install kernel-modules-drbd-std-smp drbd-tools
Первый установленный нами пакет содержит модуль ядра, необходимый для работы DRBD, второй "-- userspace"=инструменты для управления DRBD. Конфигурирование DRBD сводится к редактированию файла /etc/drbd.conf. Минимальная, но вполне работоспособная конфигурация будет выглядеть так:
resource r0 { # протокол передачи # C: запись считается завершенной, если данные записаны на локальный и удаленный диск # подходит для критически важных транзакций и в большинстве остальных случаев # B: запись считается завершенной, если данные записаны на локальный диск # и удаленный буферный кэш # A: запись считается завершенной, если данные записаны на локальный диск # и локальный буфер tcp для отправки # подходит для для сетей с высокой задержкой protocol C; # параметры синхронизации syncer { # скорость синхронизации (Mbyte/sec) rate 125M; # большего из GigaBit Ethernet не выжать } # описание узла m1 on m1.mydomain.com { device /dev/drbd0; # имя drbd-устройства disk /dev/sda3; # раздел диска, поверх которого оно работает address 192.168.200.1:7788; # адрес и порт демона drbd meta-disk internal; # хранить метаданные drbd на том же разделе диска } # описание узла m2 on m2.mydomain.com { device /dev/drbd0; # имя drbd-устройства disk /dev/sda3; # раздел диска, поверх которого оно работает address 192.168.200.2:7788; # адрес и порт демона drbd meta-disk internal; # хранить метаданные drbd на том же разделе диска } }
В комплекте с DRBD поставляется очень детальный пример конфигурационного файла, в котором все параметры прокомментированы.
Последний шаг настройки "-- обеспечить запуск сервиса drbd при загрузке узла:
[root@m1 ~]# chkconfig --level 2345 drbd on
Эти операции необходимо повторить на узле m2, а затем на обоих узлах запустить сервис drbd:
[root@m1 ~]# service drbd start Starting Starting DRBD resources: service: [ d0 s0 n0 ]. ...
После чего на обоих узлах кластера мы должны увидеть следующее:
[root@m1 ~]# service drbd status drbd driver loaded OK; device status: version: 0.7.22 (api:79/proto:74) SVN Revision: 2554 build by builder@hint1.office.altlinux.org, 2007-08-04 01:47:10 0: cs:Connected st:Secondary/Secondary ld:Consistent ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0
Итак, устройство /dev/drbd0 уже работает, но содержимое разделов /dev/sda3, лежащих уровнем ниже, еще не синхронизировано. Первый раз синхронизацию необходимо произвести вручную, выполнив на узле m1:
[root@m1 ~]# drbdadm -- --do-what-I-say primary all
После выполнения этой команды мы можем проследить за процесом синхронизации:
[root@m1 ~]# service drbd status drbd driver loaded OK; device status: version: 0.7.22 (api:79/proto:74) SVN Revision: 2554 build by builder@hint1.office.altlinux.org, 2007-08-04 01:47:10 0: cs:SyncSource st:Primary/Secondary ld:Consistent ns:1972 nr:0 dw:0 dr:10164 al:0 bm:0 lo:0 pe:30 ua:2048 ap:0 [>...................] sync'ed: 0.2% (3158696/3160552)K finish: 0:26:19 speed: 1,856 (1,856) K/sec
После окончания синхронизации на узле m1 мы увидим:
[root@m1 ~]# service drbd status drbd driver loaded OK; device status: version: 0.7.22 (api:79/proto:74) SVN Revision: 2554 build by builder@hint1.office.altlinux.org, 2007-08-04 01:47:10 0: cs:Connected st:Primary/Secondary ld:Consistent ns:731068 nr:1052796 dw:1782732 dr:193337 al:20 bm:356 lo:0 pe:0 ua:0 ap:0
По строке Primary/Secondary можно определить, что сейчас узел m1 является ведущим. На ведомом узле m2 в выводе той же самой команды мы увидим Secondary/Primary. Все операции с устройством /dev/drbd0 необходимо выполнять только на ведущем узле, при этом все изменения будут автоматически применены к разделам /dev/sda3 на обоих узлах кластера.
Создадим на устройстве /dev/drbd0 файловую систему и смонтируем ее:
[root@m1 ~]# mkfs.ext3 /dev/drbd0 mke2fs 1.39 (29-May-2006) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) 395200 inodes, 790138 blocks 39506 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=809500672 25 block groups 32768 blocks per group, 32768 fragments per group 15808 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912 Writing inode tables: done Creating journal (16384 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 25 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. [root@m1 ~]# mkdir /d0 [root@m1 ~]# mount /dev/drbd0 /d0
Если теперь мы попытаемся смонтировать устройство /dev/drbd0 на узле m2, мы получим следующее сообщение об ошибке:
[root@m2 ~]# mkdir /d0 [root@m2 ~]# mount /dev/drbd0 /d0 /dev/drbd0: Input/output error mount: block device /dev/drbd0 is write-protected, mounting read-only /dev/drbd0: Input/output error mount: /dev/drbd0 already mounted or /d0 busy
Такое (вполне разумное) поведение гарантируется только для ядер 2.6, в 2.4 была возможность смонтировать устройство /dev/drbd0 на обоих узлах кластера одновременно, что, в свою очередь, могло привести к повреждению файловой системы.
Чтобы все-таки смонтировать раздел /dev/drbd0 на узле m2, необходимо сделать его ведущим, выполнив на узлах m1 и m2 следующие команды:
[root@m1 ~]# umount /d0 [root@m1 ~]# drbdadm secondary all [root@m2 ~]# drbdadm primary all [root@m2 ~]# mount /dev/drbd0 /d0
В случае отказа узла m1 достаточно выполнить только те команды, которые приведены выше для узла m2.