Настройка сетевого RAID1 с DRBD на Ubuntu 11.10

Звезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активна
 

UbuntuВ этом учебнике показано, как настроить сетевое хранилище RAID1 с помощью DRBD на двух серверах под управлением Ubuntu server 11.10. DRBD (Distributed Replicated Block Device) и позволяет дублировать блочные устройства по сети. Это полезно для обеспечения высокой доступности установки (например, HA NFS сервере ), потому что, если один узел выходит из строя, все данные по-прежнему доступны на другом узле.

Предварительные замечания

Здесь я буду использовать два сервера (оба под управлением Ubuntu server 11.10):

  • server1.example.com (IP address 192.168.0.100)
  • server2.example.com (IP address: 192.168.0.101)

Оба узла имеют неразмеченный второй диск ( /dev/sdb ) с одинаковым размером (30 ГБ в данном примере), что я хочу, чтобы зеркалить по сети (сетевой RAID1) с помощью DRBD. Важно, что оба узла видили сеть между собой, либо с помощью DNS, либо через /etc/hosts . Если вы не создали DNS-записи для server1.example.com и server2.example.com , вы можете изменить /etc/hosts на обоих узлах следующим образом:

server1 / server2:

  • nano /etc/hosts
127.0.0.1       localhost.localdomain   localhost
192.168.0.100   server1.example.com     server1
192.168.0.101   server2.example.com     server2

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Я выполняю все шаги данного руководства с привилегиями root, поэтому убедитесь, что Вы вошли в систему с правами администратора:

  • sudo su

Синхронизация времени

server1 / server2:

Очень важно, что оба узла имеют то же время. Поэтому мы устанавливаем NTP пакеты:

  • apt-get install ntp ntpdate

Раздел /dev/sdb

server1 / server2:

Прямо сейчас, наши разделы выглядит следующим образом:

  • fdisk -l
root@server1:~# fdisk -l

Disk /dev/sda: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders, total 62914560 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000712c1

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      499711      248832   83  Linux
/dev/sda2          501758    62912511    31205377    5  Extended
/dev/sda5          501760    62912511    31205376   8e  Linux LVM

Disk /dev/sdb: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders, total 62914560 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/sdb doesn't contain a valid partition table

Disk /dev/mapper/server1-root: 31.4 GB, 31415336960 bytes
255 heads, 63 sectors/track, 3819 cylinders, total 61358080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/mapper/server1-root doesn't contain a valid partition table

Disk /dev/mapper/server1-swap_1: 536 MB, 536870912 bytes
255 heads, 63 sectors/track, 65 cylinders, total 1048576 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/mapper/server1-swap_1 doesn't contain a valid partition table
root@server1:~#

Как видите, /dev/sdb не разбит на разделы. Мы изменим это, созданием одного большой раздел на нем, /dev/sdb1:

  • fdisk /dev/sdb
root@server1:~# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0xf7ab5969.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): - n
Command action
   e   extended
   p   primary partition (1-4)
- p
Partition number (1-4, default 1): - 1
First sector (2048-62914559, default 2048): - ENTER
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-62914559, default 62914559): - ENTER
Using default value 62914559

Command (m for help): - t
Selected partition 1
Hex code (type L to list codes): - 83

Command (m for help): - w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
root@server1:~#

Теперь запустите:

  • fdisk -l

снова, и Вы должны найти /dev/sdb1 на выходе:

root@server1:~# fdisk -l

Disk /dev/sda: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders, total 62914560 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000712c1

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      499711      248832   83  Linux
/dev/sda2          501758    62912511    31205377    5  Extended
/dev/sda5          501760    62912511    31205376   8e  Linux LVM

Disk /dev/sdb: 32.2 GB, 32212254720 bytes
64 heads, 51 sectors/track, 19275 cylinders, total 62914560 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xf7ab5969

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    62914559    31456256   83  Linux

Disk /dev/mapper/server1-root: 31.4 GB, 31415336960 bytes
255 heads, 63 sectors/track, 3819 cylinders, total 61358080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/mapper/server1-root doesn't contain a valid partition table

Disk /dev/mapper/server1-swap_1: 536 MB, 536870912 bytes
255 heads, 63 sectors/track, 65 cylinders, total 1048576 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/mapper/server1-swap_1 doesn't contain a valid partition table
root@server1:~#

Установка и настройка DRBD

Теперь установим DRBD на обоих серверах следующим образом:

  • apt-get install drbd8-utils

Загрузите модуль ядра DRBD:

  • modprobe drbd

Чтобы проверить, его загрузку, выполните команду:

  • lsmod | grep drbd

Вывод должен быть похож на этот:

root@server1:~# lsmod | grep drbd
drbd                  273002  0
lru_cache              14896  1 drbd
root@server1:~#

Теперь создадим новые резервные копии оригинальных /etc/drbd.conf файлов на обоих узлах следующим образом:

  • cp /etc/drbd.conf /etc/drbd.conf_orig
  • cat /dev/null > /etc/drbd.conf
  • nano /etc/drbd.conf
global { usage-count no; }
common { syncer { rate 100M; } }
resource r0 {
        protocol C;
        startup {
                wfc-timeout  15;
                degr-wfc-timeout 60;
        }
        net {
                cram-hmac-alg sha1;
                shared-secret "secret";
        }
        on server1.example.com {
                device /dev/drbd0;
                disk /dev/sdb1;
                address 192.168.0.100:7788;
                meta-disk internal;
        }
        on server2.example.com {
                device /dev/drbd0;
                disk /dev/sdb1;
                address 192.168.0.101:7788;
                meta-disk internal;
        }
}

Убедитесь, что вы используете правильные имена узлов в файле (вместо server1.example.com и server2.example.com ) - пожалуйста, убедитесь, что используете имена узлов этой командой команда:

  • uname -n

показывает, на обоих узлах. Также убедитесь, что вы заполните правильные IP адреса в строку address и правильный диск в строку disk (если вы не используете /dev/sdb1).

Теперь мы инициализируем хранилище метаданных. На обоих узлах выполнив команду:

  • drbdadm create-md r0
root@server1:~# drbdadm create-md r0
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
root@server1:~#

Теперь запустим DRBD на обоих узлах:

  • /etc/init.d/drbd start
root@server1:~# /etc/init.d/drbd start
 * Starting DRBD resources [ d(r0) s(r0) n(r0) ] [ OK ]
root@server1:~#

Следующий шаг должен осуществляться только на server1:

server1:

Теперь сделайте server1 основным узлом:

  • drbdadm -- --overwrite-data-of-peer primary all

После этого запустится синхронизация данных между server1 и server2.

server2:

Посмотрим на:

  • cat /proc/drbd

чтобы увидеть процесс синхронизации:

root@server2:~# cat /proc/drbd
version: 8.3.11 (api:88/proto:86-96)
srcversion: DA5A13F16DE6553FC7CE9B2
 0: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r-----
    ns:0 nr:10166400 dw:10166400 dr:0 al:0 bm:620 lo:1 pe:7407 ua:0 ap:0 ep:1 wo:f oos:21288860
        [=====>..............] sync'ed: 32.4% (20788/30716)Mfinish: 0:03:53 speed: 91,180 (86,152) want: 102,400 K/sec
root@server2:~#

(Вы можете запустить

  • watch cat /proc/drbd

, чтобы получить текущую вывод процесса. Чтобы выйти из режима просмотра оставшегося времени, нажмите CTRL+C).

Фрагмент ro:Secondary/Primary говорит Вам, что этот узел вторичного узла.

server1:

На server1, выход:

  • cat /proc/drbd

выглядит следующим образом (после окончания синхронизации):

root@server1:~# cat /proc/drbd
version: 8.3.11 (api:88/proto:86-96)
srcversion: DA5A13F16DE6553FC7CE9B2
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:31455260 nr:0 dw:0 dr:31455924 al:0 bm:1920 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
root@server1:~#

Фрагмент ro:Primary/Secondary говорит Вам, что этот узел вторичного узла.

Теперь, когда у нас есть новая сеть RAID1 блочного устройства /dev/drbd0 (которое состоит из /dev/sdb1 от server1 и server2 ), давайте создадим его файловую систему ext4 и смонтировать его в /data директорию. Это должно быть сделано только на server1!

  • mkfs.ext4 /dev/drbd0
  • mkdir /data
  • mount /dev/drbd0 /data

После этого вы должны увидеть /dev/drbd0 на выходы ...

  • mount
root@server1:~# mount
/dev/mapper/server1-root on / type ext4 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
udev on /dev type devtmpfs (rw,mode=0755)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none on /run/shm type tmpfs (rw,nosuid,nodev)
/dev/sda1 on /boot type ext2 (rw)
/dev/drbd0 on /data type ext4 (rw)
root@server1:~#

... а также:

  • df -h
root@server1:~# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/server1-root
                       29G 1017M   27G   4% /
udev                  238M  4.0K  238M   1% /dev
tmpfs                  99M  228K   99M   1% /run
none                  5.0M  4.0K  5.0M   1% /run/lock
none                  247M     0  247M   0% /run/shm
/dev/sda1             228M   24M  193M  11% /boot
/dev/drbd0             30G  172M   28G   1% /data
root@server1:~#

Тест

server1:

Теперь давайте создадим несколько файлов или каталогов в /data категории и проверим, как они реплицируются на server2.

  • touch /data/test1.txt
  • touch /data/test2.txt
  • ls -l /data/
root@server1:~# ls -l /data/
total 16
drwx------ 2 root root 16384 2011-10-28 14:12 lost+found
-rw-r--r-- 1 root root     0 2011-10-28 14:13 test1.txt
-rw-r--r-- 1 root root     0 2011-10-28 14:13 test2.txt
root@server1:~#

Теперь давайте размонтируем /data каталог на server1:

  • umount /data

Затем необходимо назначить вторичную роль server1:

  • drbdadm secondary r0

server2:

Сначала мы назначим первичную роль server2:

  • drbdadm primary r0

Проверим выход:

  • cat /proc/drbd

... и вы увидите, что сейчас server2 является основным узлом:

root@server2:~# cat /proc/drbd
version: 8.3.11 (api:88/proto:86-96)
srcversion: DA5A13F16DE6553FC7CE9B2
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:0 nr:31691444 dw:31691444 dr:664 al:0 bm:1909 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
root@server2:~#

Далее мы создадим /data каталог и смонтируем /dev/drbd0 к нему:

  • mkdir /data
  • mount /dev/drbd0 /data

Давайте проверим содержание /data каталога:

  • ls -l /data/

Если все прошло хорошо, он должен содержать файлы / каталоги, которые мы создали на server1 :

root@server2:~# ls -l /data/
total 16
drwx------ 2 root root 16384 2011-10-28 14:12 lost+found
-rw-r--r-- 1 root root     0 2011-10-28 14:13 test1.txt
-rw-r--r-- 1 root root     0 2011-10-28 14:13 test2.txt
root@server2:~#

server1:

Теперь, когда мы поменялись ролями, выход

  • cat /proc/drbd

на server1 должен показать вам, что server1 имеет второстепенную роль:

root@server1:~# cat /proc/drbd
version: 8.3.11 (api:88/proto:86-96)
srcversion: DA5A13F16DE6553FC7CE9B2
 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
    ns:31691444 nr:185568 dw:421752 dr:31457005 al:83 bm:1920 lo:1 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
root@server1:~#