xg-scale

view drbd.tex @ 3:7ad41782e1ad

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