xg-scale

annotate drbd.tex @ 4:253d66dd74bb

Добавлено подробное описание управления памятью домена и выделением устройств домену
author Igor Chubin <igor@chub.in>
date Sun Jul 06 23:27:46 2008 +0300 (2008-07-06)
parents
children
rev   line source
igor@0 1 \section{Реплицируемое блочное устройство DRBD}
igor@0 2
igor@0 3
igor@0 4 Здесь детально рассматривается процедура
igor@0 5 подготовки двух систем для синхронизации одного
igor@0 6 из своих дисковых разделов с помощью DRBD.
igor@0 7
igor@0 8 Может применяться для организации отказоустойчивых систем
igor@0 9 хранения данных и отказоустойчивых кластерных систем.
igor@0 10
igor@0 11 \subsection{Что такое DRBD?}
igor@0 12 \textbf{DRBD} (англ. \textit{Distributed Replicated Block Device}, распределённое реплицируемое блочное устройство) --- это блочное устройство,
igor@0 13 предназначенное для построения отказоустойчивых кластерных систем на операционной системе Linux. DRBD занимается полным отражением (mirroring) по сети всех операций с блочным устройством. Можно считать, что DRBD это сетевой RAID-1.
igor@0 14
igor@0 15 DRBD берёт данные, записывает их на локальный диск и пересылает на другой хост.
igor@0 16 На другом хосте они тоже записываются на диск.
igor@0 17
igor@0 18 Помимо DRBD в кластере должно быть ещё два важных компонента:
igor@0 19 \begin{enumerate}
igor@0 20 \item Служба кластера (Cluster membership service), (в качестве которого чаще всего выступает \textit{heartbeat};
igor@0 21 \item Приложение, работающее поверх распределённого блочного устройства.
igor@0 22 \end{enumerate}
igor@0 23
igor@0 24 Примеры приложений:
igor@0 25 \begin{itemize}
igor@0 26 \item Файловая система c fsck;
igor@0 27 \item Журналируемая файловая система;
igor@0 28 \item СУБД;
igor@0 29 \item домен Xen.
igor@0 30 \end{itemize}
igor@0 31
igor@0 32 \subsection{Как работает DRBD?}
igor@0 33 Каждое DRBD-устройство (а DRBD-устройств одновременно может быть много)
igor@0 34 находится в одном из двух состояний:
igor@0 35 \begin{itemize}
igor@0 36 \item primary — главном (первичном);
igor@0 37 \item secondary — резервном (вторичном).
igor@0 38 \end{itemize}
igor@0 39 На узле, на котором DRBD-устройство находится в основном состоянии,
igor@0 40 операционная система или процессы могут работать
igor@0 41 с DRBD-устройством (оно доступно через файл-устройства \texttt{/dev/drbdX}).
igor@0 42
igor@0 43 Каждое обращение на запись к DRBD-устройству
igor@0 44 отправляется локальном к нижележащему устройству
igor@0 45 и на узел, на котором находится реплика устройства.
igor@0 46 Резервное устройство, получившее запрос, выполняет запись.
igor@0 47
igor@0 48 Чтение выполняется всегда только локально.
igor@0 49
igor@0 50 \begin{center} \resizebox{10cm}{!}{\includegraphics{/var/lib/mediawiki/images/d/da/Drbd.png}}\\ \textit{}\end{center}
igor@0 51
igor@0 52 \begin{verbatim}
igor@0 53
igor@0 54 \end{verbatim}
igor@0 55 Если основной узел падает, heartbeat переключает запасной узел в
igor@0 56 состояние ведущего и запускает приложения на нём
igor@0 57 (если используется нежурналируемая файловая система,
igor@0 58 кроме всего прочего ещё выполнится fsck).
igor@0 59
igor@0 60 Когда сбойный узел поднимается, DRBD-устройство на нём находится в состоянии
igor@0 61 второстепенного (secondary), и оно начинается синхронизироваться с основным устройством.
igor@0 62 Конечно же, это происходит в фоне, без нарушения работы системы.
igor@0 63
igor@0 64 Синхронизируются только те части устройства,
igor@0 65 которые подверглись изменению.
igor@0 66 DRBD старается выполнять ресинхронизацию максимально эффективным способом.
igor@0 67 Начиная с DRBD-0.7 существует возможность
igor@0 68 создания так называемых \textit{активных множеств} (active set)
igor@0 69 определённого размера.
igor@0 70 Что позволяет выполнять ресинхронизацию на 1—3 минуты, независимо от размера устройства (сегодня до 4TB) даже после падения активного узла.
igor@0 71
igor@0 72 \subsubsection{Какое отношение DRBD имеет к HA-кластерам?}
igor@0 73 Сегодня HA-кластеры (отказоуйстойчивые кластеры) используют в своей работе внешние хранилища, которые подключаюся сразу к нескольким узлам.
igor@0 74 Обычно это делается с помощью шин SCSI или Fibre Channel (но не обязательно).
igor@0 75
igor@0 76 DRBD позволяет делать похожие вещи, только оно не использует никакого специального оборудования, а работает поверх обычных IP-сетей.
igor@0 77
igor@0 78 \subsubsection{DRBD и кластерные файловые системы}
igor@0 79 Как уже говорилось, обычно
igor@0 80 DRBD-устройство работает на одном из узлов в режиме главного (primary role),
igor@0 81 а на других — в режиме второстепенного или резервного (secondary role).
igor@0 82 Запись идёт на устройство, которое находится в режиме главного,
igor@0 83 а на остальные просто выполняется репликация.
igor@0 84 Такой режим применим для классических отказоустойчивых кластеров,
igor@0 85 его следует использовать, если на DRBD-устройстве непосредственно
igor@0 86 находятся традиционные, не кластерные файловые системы (ext3, XFS, JFS и т.д.).
igor@0 87
igor@0 88 Начиная с DRBD-8.0.08 можно заставить работать оба узла в режиме primary.
igor@0 89 Это даёт возможность монтировать кластерную ФС сразу на двух узлах
igor@0 90 одновременно. Примеры таких кластерных файловых систем: \textit{GFS}, \textit{OCFS2}.
igor@0 91
igor@0 92 Кроме того, эта возможность DRBD позволяет выполнять живую миграцию
igor@0 93 доменов Xen, которые используют эти устройства.
igor@0 94 В этом случае использование кластерных систем в домене Xen
igor@0 95 не является обязательным, можно обойтись традиционными системами,
igor@0 96 такими как \textit{ext3}, \textit{XFS}, \textit{JFS}.
igor@0 97
igor@0 98 \subsection{DRBD: подготовка модуля ядра Linux}
igor@0 99 Процедуры подготовки DRBD
igor@0 100 для различных дистрибутивов Linux описаны здесь \htmladdnormallinkfoot{Howto Build and Install DRBD}{http://www.linux-ha.org/DRBD/HowTo/Install} (англ.).
igor@0 101
igor@0 102 В Debian GNU/Linux подготовка выполняется очень просто:
igor@0 103
igor@0 104 1) Найти пакет с модулем ядра:
igor@0 105 \begin{verbatim}
igor@0 106 %# apt-cache search drbd
igor@0 107 drbd0.7-module-source - RAID 1 over tcp/ip for Linux module source
igor@0 108 drbd0.7-utils - RAID 1 over tcp/ip for Linux utilities
igor@0 109 drbd8-module-source - RAID 1 over tcp/ip for Linux module source
igor@0 110 drbd8-utils - RAID 1 over tcp/ip for Linux utilities
igor@0 111 drbdlinks - Manages symlinks into a shared DRBD partition
igor@0 112 \end{verbatim}
igor@0 113
igor@0 114 2) Установить этот пакет:
igor@0 115 \begin{verbatim}
igor@0 116 %# apt-get install drbd8-module-source
igor@0 117 \end{verbatim}
igor@0 118
igor@0 119 3) Собрать и загрузить модуль ядра:
igor@0 120 \begin{verbatim}
igor@0 121 %# module-assistant auto-install drbd8
igor@0 122 \end{verbatim}
igor@0 123
igor@0 124 \subsection{Настройка DRBD}
igor@0 125 Если инсталляция выполняется из архива исходных текстов,
igor@0 126 нужно прочитать \texttt{README}, \texttt{INSTALL}
igor@0 127 и \htmladdnormallinkfoot{DRBD/HowTo/Install}{http://www.linux-ha.org/DRBD/HowTo/Install}.
igor@0 128 Нужно также ознакомится с файлами \texttt{upgrade\(\ast{}\).txt}
igor@0 129 в каталоге \texttt{src/} drbd или непосредственно в репозитории проекта.
igor@0 130
igor@0 131 В дистрибутив входит хорошо прокомментированный конфигурационный файл-пример.
igor@0 132 В архиве исходных текстов он находится в \texttt{./scripts/drbd.conf};
igor@0 133 в пакетах может быть в одном из каталогов:
igor@0 134 \texttt{/usr/\{shared/,\}doc/packages/drbd}.
igor@0 135
igor@0 136 Нужно отредактировать этот файл в соответствии с вашими требованиями,
igor@0 137 а потом скопировать его на оба узла. Затем убедиться, что meta-disk\rq{}и
igor@0 138 находятся в правильных местах.
igor@0 139 Если вы настраиваете синхронизацию нескольких ресурсов,
igor@0 140 убедитесь, что в файле \texttt{/etc/drbd.conf}
igor@0 141 указаны разные порты (или разные IP) для этих ресурсов.
igor@0 142
igor@0 143 Пример фрагмента конфигурационного файла:
igor@0 144 \begin{verbatim}
igor@0 145 resource dns {
igor@0 146 protocol C;
igor@0 147 net {
igor@0 148 allow-two-primaries;
igor@0 149 after-sb-0pri discard-least-changes;
igor@0 150 after-sb-1pri call-pri-lost-after-sb;
igor@0 151 after-sb-2pri call-pri-lost-after-sb;
igor@0 152 }
igor@0 153 syncer {
igor@0 154 rate 5M;
igor@0 155 }
igor@0 156 on dom0
igor@0 157 {
igor@0 158 device /dev/drbd1;
igor@0 159 disk /dev/XEN/dns;
igor@0 160 address 192.168.1.190:7792;
igor@0 161 meta-disk /dev/XEN/meta[1];
igor@0 162 }
igor@0 163 on dom0m
igor@0 164 {
igor@0 165 device /dev/drbd1;
igor@0 166 disk /dev/XEN/dns;
igor@0 167 address 192.168.1.191:7792;
igor@0 168 meta-disk /dev/XEN/meta[1];
igor@0 169 }
igor@0 170 }
igor@0 171 \end{verbatim}
igor@0 172
igor@0 173
igor@0 174 Нужно обратить особое внимание на местоположение метадиска.
igor@0 175 Если DRBD не найдёт метаданных там, где он их ождиает, он создаст новые.
igor@0 176 Если вы укажите на неверное место, будут переписаны несколько килобайтов
igor@0 177 или даже несколько мегабайтов возможно полезных данных!
igor@0 178 Если использовать внутренний метадиск (\texttt{meta-disk=internal}),
igor@0 179 нужно обязательно уменьшить файловую систему раздела (если она там есть).
igor@0 180
igor@0 181 В настоящий момент метаданные DRBD забирают 128M,
igor@0 182 независимо от настоящего размера физических данных.
igor@0 183 В связи с этим маскимальный размер одного хранилища DRBD
igor@0 184 не может превышать ~4TB.
igor@0 185
igor@0 186 Скопируйте \texttt{drbd.conf} в \texttt{/etc/drbd.conf}
igor@0 187 на обоих узлах.
igor@0 188 После этого на обоих узлах выполните команду:
igor@0 189 \begin{verbatim}
igor@0 190 %# drbdadm up all
igor@0 191 \end{verbatim}
igor@0 192 Узлы должны подняться и перейти в состояние \textit{Secondary} и \textit{Inconsistent}.
igor@0 193
igor@0 194 Последнее связано с тем, что хранилища на нижнем уровне не синхронизированы между собой,
igor@0 195 и DRBD не знает откуда куда выполнять синхронизацию.
igor@0 196 Источник и, соответственно, направлени синхронизации нужно указать явным образом указать.
igor@0 197 Если данных нет, не имеет значения в какую сторону синхронизировать.
igor@0 198 Если есть файловая система, которая должна быть скопирована,
igor@0 199 указание неправильного направления приведёт к тому, что файловая система будет утеряна.
igor@0 200
igor@0 201 Выберите, какой из узлов будет \textit{primary} (если есть данные, то это должен
igor@0 202 быть узел, на котором они уже есть).
igor@0 203 После этого выполните:
igor@0 204 \begin{verbatim}
igor@0 205 %# drbdsetup /dev/drbd1 primary -o
igor@0 206 \end{verbatim}
igor@0 207 или (для более старых версий)
igor@0 208 \begin{verbatim}
igor@0 209 %# drbdadm -- --do-what-I-say primary all
igor@0 210 \end{verbatim}
igor@0 211 Команда установит одно из устройств /dev/drbd1 в основной режим (если быть точным,
igor@0 212 то это будет устройство на той машине, где вызывалась команда).
igor@0 213 После этого должна выполниться полная синхронизация нижележащих устройств.
igor@0 214
igor@0 215 Устройство готово к использованию. Если у вас ещё нет файловой системы на нём,
igor@0 216 можно её создать прямо сейчас.
igor@0 217
igor@0 218 Теперь:
igor@0 219 \begin{itemize}
igor@0 220 \item Смонтируйте DRBD-устройство на том узле, который находится в состоянии \textit{primary};
igor@0 221 \item Отредактируйте какие-нибудь файлы;
igor@0 222 \item Размонтируйте DRBD;
igor@0 223 \item Переведите этот узел \textit{secondary}, а второй — \textit{primary};
igor@0 224 \item Смонитруйте DRBD на новом узле;
igor@0 225 \item Посмотрите изменения в файлах, которые вы сделали -- они должны были отразиться на втором узле.
igor@0 226 \end{itemize}
igor@0 227
igor@0 228 Устройство настроено и готово к использованию.
igor@0 229
igor@0 230 \subsection{Пример настройки}
igor@0 231 В этом примере используются устройства \texttt{/dev/drbdX}.
igor@0 232 Раньше использовались \texttt{/dev/nbX}.
igor@0 233 Исторически так сложилось что DRBD хищнечиски захватил
igor@0 234 мажорный номер NBD (43) и узлы устройств.
igor@0 235 Сейчас официально DRBD может использовать свой номер (147).
igor@0 236 В связи с этим начиная с версии 0.7.1
igor@0 237 по умолчанию используются свои номера устройств и названия файлов устройств.
igor@0 238
igor@0 239 Если система ничего не знает о \texttt{/dev/drbdX},
igor@0 240 нужно создать их командой наподобие такой:
igor@0 241 \begin{verbatim}
igor@0 242 %# for i in $(seq 0 15) ; do mknod /dev/drbd$i b 147 $i ; done
igor@0 243 \end{verbatim}
igor@0 244 Подробнее можно почитать в файлах \texttt{upgrade\(\ast{}\).txt},
igor@0 245 упоминавшихся выше.
igor@0 246
igor@0 247 \begin{verbatim}
igor@0 248 # administration ips of the nodes:
igor@0 249 left=10.0.0.1
igor@0 250 right=10.0.0.2
igor@0 251
igor@0 252 vi drbd.conf
igor@0 253 # double check.
igor@0 254 scp drbd.conf $left:/etc/drbd.conf
igor@0 255 scp drbd.conf $right:/etc/drbd.conf
igor@0 256
igor@0 257 cmd='modprobe drbd; drbdadm up all; dmesg | tail; cat /proc/drbd'
igor@0 258 ssh root@$left -- "$cmd"
igor@0 259 ssh root@$right -- "$cmd"
igor@0 260 \end{verbatim}
igor@0 261
igor@0 262 Фрагмент из dmesg (или syslog) должен выглядеть так
igor@0 263 (в примере хранилище размером 5М).
igor@0 264 \begin{verbatim}
igor@0 265 drbd: initialised. Version: 0.7.0 svn $Rev: 1442 $ (api:74/proto:74)
igor@0 266 drbd: registered as block device major 147
igor@0 267
igor@0 268 nb: to have it register as 43 (NBD) you can say
igor@0 269 modprobe drbd use_nbd_major
igor@0 270
igor@0 271 drbd0: Creating state block
igor@0 272 drbd0: resync bitmap: bits=1250 words=40
igor@0 273 drbd0: size = 5000 KB
igor@0 274 drbd0: Assuming that all blocks are out of sync (aka FullSync)
igor@0 275 drbd0: 5000 KB now marked out-of-sync by on disk bit-map.
igor@0 276 drbd0: Handshake successful: DRBD Network Protocol version 74
igor@0 277 drbd0: Connection established.
igor@0 278 drbd0: I am inconsistent, but there is no sync? BOTH nodes inconsistent!
igor@0 279 drbd0: Secondary/Unknown --> Secondary/Secondary
igor@0 280 \end{verbatim}
igor@0 281
igor@0 282 Файл /proc/drbd должен выглядеть так:
igor@0 283 \begin{verbatim}
igor@0 284 %# cat /proc/drbd
igor@0 285 version: 0.7.0 svn $Rev: 1442 $ (api:74/proto:74)
igor@0 286
igor@0 287 0: cs:Connected st:Secondary/Secondary ld:Inconsistent
igor@0 288 ns:0 nr:0 dw:0 dr:0 al:0 bm:1 lo:0 pe:0 ua:0 ap:0
igor@0 289 \end{verbatim}
igor@0 290
igor@0 291 Пусть \texttt{\$left} будет \textit{primary}:
igor@0 292 \begin{verbatim}
igor@0 293 %# ssh root@$left -- "drbdadm primary all"
igor@0 294 ioctl(,SET_STATE,) failed: Input/output error
igor@0 295 Local replica is inconsistent (--do-what-I-say ?)
igor@0 296 Command line was '/sbin/drbdsetup /dev/drbd0 primary'
igor@0 297 drbdsetup exited with code 21
igor@0 298 \end{verbatim}
igor@0 299
igor@0 300 Замечание: Это приведёт к перезагрузке системы (!)
igor@0 301
igor@0 302 В действительности drbdadm просто выполняет команду \dq{}incon-degr-cmd\dq{}.
igor@0 303 Поскольку в примере был \dq{}halt -f\dq{},
igor@0 304 вы сами попросили о перезапуске.
igor@0 305 Возможно, лучше указать что-то менее жётское.
igor@0 306 Это можно сделать, указав в файле \texttt{drbd.conf}:
igor@0 307
igor@0 308 \begin{verbatim}
igor@0 309 incon-degr-cmd "echo 'DRBD: primary requested but inconsistent!' \
igor@0 310 | wall; sleep 300000";
igor@0 311 \end{verbatim}
igor@0 312
igor@0 313 Ещё одна хорошая команда:
igor@0 314
igor@0 315 \begin{verbatim}
igor@0 316 killall -9 heartbeat ipfail ccm
igor@0 317 \end{verbatim}
igor@0 318
igor@0 319 Продолжаем.
igor@0 320
igor@0 321 \begin{verbatim}
igor@0 322 # ok, this was expected.
igor@0 323 # so double check that $left is the correct node.
igor@0 324 # then force it:
igor@0 325 ssh root@$left -- "drbdadm -- --do-what-I-say primary all"
igor@0 326 # which will succeed silently.
igor@0 327
igor@0 328 ## Bryce Porter suggests that:
igor@0 329 ## At this point, you need to connect the resource(s)
igor@0 330 # ssh root@$left -- "drbdadm -- connect all"
igor@0 331 #
igor@0 332 ## well, they should have been connected all along, see /proc/drbd excerpt above,
igor@0 333 ## so if this was neccessary, something "unexpected" happend already...
igor@0 334 ## -- lge
igor@0 335
igor@0 336 ssh $left -- 'dmesg | tail ; cat /proc/drbd'
igor@0 337 # output is:
igor@0 338 drbd0: Resync started as SyncSource (need to sync 5000 KB [1250 bits set]).
igor@0 339
igor@0 340 version: 0.7.0 svn $Rev: 1442 $ (api:74/proto:74)
igor@0 341
igor@0 342 0: cs:SyncSource st:Primary/Secondary ld:Consistent
igor@0 343 ns:9276 nr:0 dw:0 dr:9404 al:0 bm:2 lo:0 pe:915 ua:32 ap:0
igor@0 344 [=========>..........] sync'ed: 50.0% (4380/5000)K
igor@0 345 finish: 0:00:05 speed: 620 (620) K/sec
igor@0 346
igor@0 347 # or, to give an example from a larger device:
igor@0 348 0: cs:SyncSource st:Primary/Secondary ld:Consistent
igor@0 349 ns:12940824 nr:0 dw:87492 dr:13690591 al:109 bm:1668 lo:1000 pe:1876 ua:1000 ap:0
igor@0 350 [========>...........] sync'ed: 44.4% (15858/28487)M
igor@0 351 finish: 0:09:20 speed: 28,933 (25,160) K/sec
igor@0 352
igor@0 353 # whereas on the other node:
igor@0 354 ssh $right -- 'dmesg | tail ; cat /proc/drbd'
igor@0 355 drbd0: Resync started as SyncTarget (need to sync 5000 KB [1250 bits set]).
igor@0 356
igor@0 357 version: 0.7.0 svn $Rev: 1442 $ (api:74/proto:74)
igor@0 358
igor@0 359 0: cs:SyncTarget st:Secondary/Primary ld:Inconsistent
igor@0 360 ns:0 nr:15000 dw:15000 dr:0 al:0 bm:6 lo:0 pe:0 ua:0 ap:0
igor@0 361 [=========>..........] sync'ed: 50.0% (5000/5000)K
igor@0 362 finish: 0:00:12 speed: 5 (5) K/sec
igor@0 363
igor@0 364 # or, to give an example from a larger device:
igor@0 365 0: cs:SyncTarget st:Secondary/Primary ld:Inconsistent
igor@0 366 ns:0 nr:27311780 dw:27311780 dr:0 al:0 bm:3447 lo:134 pe:493 ua:134 ap:0
igor@0 367 [==================>.] sync'ed: 93.7% (1818/28487)M
igor@0 368 finish: 0:01:07 speed: 27,482 (25,008) K/sec
igor@0 369 \end{verbatim}
igor@0 370
igor@0 371 Убедимся, что всё работает:
igor@0 372
igor@0 373 \begin{verbatim}
igor@0 374 # if you have no file system yet, create one
igor@0 375 # ssh root@$left -- 'mkreiserfs /dev/drbd0'
igor@0 376
igor@0 377 ssh root@$left -- \
igor@0 378 'mkdir -p /mnt/ha0; mount /dev/drbd0 /mnt/ha0 && touch /mnt/ha0/been_there'
igor@0 379
igor@0 380 # 'switch over'
igor@0 381 ssh root@$left -- \
igor@0 382 'umount /mnt/ha0 && drbdadm secondary all'
igor@0 383 # even during sync!
igor@0 384 ssh root@$right -- \
igor@0 385 'drbdadm primary all'
igor@0 386 ssh root@$right -- \
igor@0 387 'mkdir -p /mnt/ha0; mount /dev/drbd0 /mnt/ha0 && ls -l /mnt/ha0/been_there'
igor@0 388 \end{verbatim}
igor@0 389
igor@0 390 Обратите внимание, что хотя ошибки и не будет, но лучше так не делать:
igor@0 391 \textit{SyncTarget} можно сделать \textit{primary}, но в случае проблем с сетью будет паника из-за отсутствия доступа к правильным данным.
igor@0 392 Поэтому лучше так не делать никогда.
igor@0 393
igor@0 394 \subsection{Дополнительная информация}
igor@0 395 \begin{itemize}
igor@0 396 \item \htmladdnormallinkfoot{DRBD}{http://xgu.ru/wiki/DRBD} (рус.)
igor@0 397 \item \htmladdnormallinkfoot{DRBD}{http://www.drbd.org/} (англ.) — домашняя страница проекта DRBD
igor@0 398 \item \htmladdnormallinkfoot{DRBD FAQ}{http://www.linux-ha.org/DRBD/FAQ} (англ.)
igor@0 399 \item \htmladdnormallinkfoot{Howto Build and Install DRBD}{http://www.linux-ha.org/DRBD/HowTo/Install} (англ.) — процедура подготовки DRBD, в частности модуля ядра Linux
igor@0 400 \item \htmladdnormallinkfoot{Data Redundancy with DRBD}{http://www.drbd.org/drbd-article.html} (англ.) — статья о DRBD 0.6
igor@0 401 \item \htmladdnormallinkfoot{DRBD How To in the IBB Wiki}{https://services.ibb.gatech.edu/wiki/index.php/Howto:Software:DRBD} (англ.) — специфичное для RedHat (Fedora, RHEL, CentOS и других RedHat-based) описание процедуры поднятия DRBD
igor@0 402 \item \htmladdnormallinkfoot{Xen with DRBD, GNBD and OCFS2 HOWTO}{http://xenamo.sourceforge.net/index.html} (англ.)
igor@0 403 \item \htmladdnormallinkfoot{CLVM Project Page}{http://sources.redhat.com/cluster/clvm/} (англ.) - кластерный LVM
igor@0 404 \item \htmladdnormallinkfoot{(openvz-wiki) HA cluster with DRBD and Heartbeat}{http://wiki.openvz.org/HA\_cluster\_with\_DRBD\_and\_Heartbeat} HA cluster with DRBD and Heartbeat (англ.)
igor@0 405 \item \htmladdnormallinkfoot{DRBD, Xen und Heartbeat}{http://www.pro-linux.de/work/virtual-ha/virtual-ha5.html} (нем.)
igor@0 406 \item http://te.to/~ts1/xen\_cluster.html (англ.)
igor@0 407
igor@0 408 \subsubsection{Обсуждения}
igor@0 409 \item \htmladdnormallinkfoot{Sensible maximum number of drbd devices}{http://www.gossamer-threads.com/lists/drbd/users/10007} (англ.) - вопросы использования Xen и DRBD
igor@0 410 \item \htmladdnormallinkfoot{(DRBD-user) DRBD 8.0, how to manage a split-brain on Master-Master}{http://lists.linbit.com/pipermail/drbd-user/2005-September/003779.html} (англ.)
igor@0 411 \item \htmladdnormallinkfoot{(Xen-devel) Debian, Xen and DRBD: Enabling true server redundancy}{http://lists.xensource.com/archives/html/xen-devel/2005-06/msg00544.html} (англ.)
igor@0 412 \end{itemize}
igor@0 413