В этом учебнике показано, как настроить сетевое хранилище 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:
|
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, поэтому убедитесь, что Вы вошли в систему с правами администратора:
|
Синхронизация времени
server1 / server2:
Очень важно, что оба узла имеют то же время. Поэтому мы устанавливаем NTP пакеты:
|
Раздел /dev/sdb
server1 / server2:
Прямо сейчас, наши разделы выглядит следующим образом:
|
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:
|
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:~#
Теперь запустите:
|
снова, и Вы должны найти /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 на обоих серверах следующим образом:
|
Загрузите модуль ядра DRBD:
|
Чтобы проверить, его загрузку, выполните команду:
|
Вывод должен быть похож на этот:
root@server1:~# lsmod | grep drbd drbd 273002 0 lru_cache 14896 1 drbd root@server1:~#
Теперь создадим новые резервные копии оригинальных /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 ) - пожалуйста, убедитесь, что используете имена узлов этой командой команда:
|
показывает, на обоих узлах. Также убедитесь, что вы заполните правильные IP адреса в строку address и правильный диск в строку disk (если вы не используете /dev/sdb1).
Теперь мы инициализируем хранилище метаданных. На обоих узлах выполнив команду:
|
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 на обоих узлах:
|
root@server1:~# /etc/init.d/drbd start * Starting DRBD resources [ d(r0) s(r0) n(r0) ] [ OK ] root@server1:~#
Следующий шаг должен осуществляться только на server1:
server1:
Теперь сделайте server1 основным узлом:
|
После этого запустится синхронизация данных между server1 и server2.
server2:
Посмотрим на:
|
чтобы увидеть процесс синхронизации:
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:~#
(Вы можете запустить
|
, чтобы получить текущую вывод процесса. Чтобы выйти из режима просмотра оставшегося времени, нажмите CTRL+C).
Фрагмент ro:Secondary/Primary говорит Вам, что этот узел вторичного узла.
server1:
На server1, выход:
|
выглядит следующим образом (после окончания синхронизации):
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!
|
После этого вы должны увидеть /dev/drbd0 на выходы ...
|
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:~#
... а также:
|
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.
|
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:
|
Затем необходимо назначить вторичную роль server1:
|
server2:
Сначала мы назначим первичную роль server2:
|
Проверим выход:
|
... и вы увидите, что сейчас 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 к нему:
|
Давайте проверим содержание /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:
Теперь, когда мы поменялись ролями, выход
|
на 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:~#