xg-scale
view xen/drbd.tex @ 1:6f6e0f706b86
Added tag v0.1 for changeset 4730a0d07d88
author | Igor Chubin <igor@chub.in> |
---|---|
date | Tue Jul 01 16:28:00 2008 +0300 (2008-07-01) |
parents | |
children |
line source
1 \section{Построение отказоустойчивого кластера виртуальных машин Xen + DRBD}
3 \subsection{Идея}
4 Компоненты:
5 \begin{itemize}
6 \item \textbf{Xen} — монитор виртуальных машин (VMM, Virtual Machine Monitor) или гипервизор (hypervisor) с поддержкой паравиртуализации (para-virtualization) для процессоров x86 архитектуры, распространяющийся с открытым исходным кодом (opensource). Xen может организовать совместное безопасное исполнение нескольких виртуальных машин на одной физической системе с производительностью близкой к непосредственной (native).
7 \item \textbf{LVM} (Logical Volume Manager) — менеджер логических томов операционной системы Linux. LVM предоставляет собой дополнительный уровень абстракции между физическими/логическими дисками и файловой системой.
8 \item \textbf{DRBD} (Distributed Replicated Block Deice) — блочное устройство, предназначенное для построения отказоустойчивых кластерных систем на операционной системе Linux. DRBD занимается полным отражением (mirroring) по сети всех операций с блочным устройством. Можно считать, что DRBD это сетевой RAID-1.
9 \end{itemize}
11 Терминология:
12 \begin{itemize}
13 \item узел — физический сервер, на котором исполняются виртуальные машины;
14 \item DRBD-устройство — дисковый раздел или логический том LVM, синхронизируемый с помощью DRBD;
15 \item домен — работающая виртуальная машина Xen;
16 \item кластер — два узла, которые имеют общие DRBD-устройства, поверх которых выполняются общие домены Xen.
17 \end{itemize}
19 Идея заключается в том, чтобы в качестве дисковых устройств для виртуальных машин Xen,
20 использовать DRBD-устройства. DRBD устройства в свою очередь размещаются поверх LVM томов машин входящих в кластер.
22 DRBD отвечает за полную синхронизацию операций с дисковыми системами, выполняющимися доменами Xen.
24 С точки зрения внешнего наблюдателя не имеет значения, на каком из узлов кластера
25 в настоящий момент выполняется виртуальная машина.
27 При плановом выведении узла из эксплуатации,
28 машины, работающие на нём, мигрируют на второй узел кластера.
29 Это совершенно незаметно с точки зрения внешнего наблюдателя.
31 При внезапной остановке одного из узлов машины,
32 работавшие на нём, запускаются на втором узле.
33 С точки зрения внешнего наблюдателя, работавшего с виртуальной машиной,
34 которая исполнялась на внезапно выключившемся узле, это выглядит
35 как перезагрузка машины.
37 Виртуальные машины могут быть произвольно распределены по узлам кластера.
39 \begin{center} \resizebox{10cm}{!}{\includegraphics{/var/lib/mediawiki/images/4/4b/Xen-drbd.png}}\\ \textit{}\end{center}
41 \subsection{Инсталляция и управление кластером}
42 \subsubsection{Подготовка узлов}
44 Подготовка узлов может выполняться вручную или с помощью
45 вспомогательных средств, таких, например, как скрипт \textit{xen-drbd-install}.
46 Скрипт \textit{xen-drdb-install} предназначен для облегчения
47 рутинных операций, выполняющихся при инсталляции
48 нового кластера виртуализации с повышенной отказоустойчивостью,
49 построенного на основе Xen и DRBD.
51 В результате работы \textit{xen-drbd-install}
52 создаётся сценарий командного интерпретатора,
53 который выполняет такие действия:
54 \begin{enumerate}
55 \item Подготовка LVM томов;
56 \item Настройка DRBD устройств;
57 \item Наполнение файловых систем доменов.
58 \end{enumerate}
60 Полученный сценарий может быть доработан вручную,
61 а может использоваться непосредственном в том
62 виде, как его сгенерирует \textit{xen-drbd-install}.
64 \subsubsection{Управление узлами}
66 Скрипт \textit{xen-drbd}
67 обеспечивает взаимное соответсвие
68 состояния DRBD-устройств и доменов Xen, использующих их.
69 Он следит за тем, чтобы при выполнении таких
70 операций как запуск и миграция доменов,
71 используемые DRBD-устройства
72 переключались основное (primary) или резервное (secondary) состояние
73 в зависимости от точки запуска или направления миграции.
75 Он также следит за тем, чтобы один и тот же домен
76 нельзя было запустить на разных узлах кластера
77 несколько раз.
79 Кроме этого, \textit{xen-drbd} контролирует процесс запуска и останова узлов:
80 он инициирует миграцию доменов с одного узла на другой в случае
81 останова первого; и обратную миграцию при запуске узла.
83 \subsection{Взаимный контроль узлов с помощью heartbeat}
84 Кластер функционален уже — без настройки и использования heartbeat —
85 однако функциональность его частична:
86 при выходе из строя одного из узлов кластера
87 доступными останутся только те домены, которые
88 исполнялись на нём в момент выхода из строя второго узла.
89 Оставшиеся домены можно будет поднять, но только вручную.
90 Нужно же, чтобы каждый из узлов имел возможность определить,
91 что его напарник пропал, и запустить все недостающие домены.
92 При этом особенно важно избежать случая, когда каждый узел
93 ошибочно решит, что его напарник выключился, в то время как
94 оба они будут работать, но по какой-то причине перестанут видеть друг друга.
95 В этом случае может наступить опасная ситуация, касающаяся взаимной противоречивости данных на DRBD-устройствах, и названная \textit{split-brain}.
97 \subsection{Резервирование коммутаторов и сетевых адаптеров}
98 \subsubsection{Использование аггрегированных каналов}
99 Сетевые адаптеры узлов могут быть зарезервированы
100 путём аггрегирования каналов,
101 соединяющих узел с коммутатором.
103 В каждом сервере должно быть по два сетевых адаптера,
104 каждый из которых подключается к коммутатору.
105 Они работают как единое целое, то есть два канала
106 выглядят как один аггрегированный.
108 При пропадении одного из соединений (это может быть связано
109 с неполадками адаптера, соединительного кабеля или порта коммутатора)
110 система продолжает работу на оставшемся.
111 В системном журнале появляется сообщение о
112 возникшей проблеме.
114 Для работы аггрегированного канала необходима поддержка
115 со стороны коммутатора:
116 \begin{itemize}
117 \item он должен поддерживать аггрегированные каналы;
118 \item он должен быть настроен соответствующим образом.
119 \end{itemize}
121 \subsubsection{Использование виртуального моста и STP}
122 Построить аггрегированный канал на два независимых коммутатора
123 нельзя (за некоторыми проприетарными исключениями).
125 Можно отказаться от использования аггрегированного канала
126 и с некоторой потерей функциональности перейти на использование
127 протокола STP и виртуального моста.
128 Это позволит сделать резервирование коммутатора, однако
129 у такого решения есть недостаток:
130 в отдельно взятый момент времени будет работать один из каналов.
132 Подключение одного узла выглядит так:
133 \begin{verbatim}
134 +---------------------------+
135 |HOST peth0 |
136 | +--+ | +--------------+
137 | +------+ +-+------| switch1 |
138 | | +--+ | +---+----------+
139 |veth0+---------+----+ | |
140 | ---+ linux bridge | | |
141 | +---------+----+ | |
142 | | +--+ | +---+----------+
143 | +------+ +-+------+ switch2 |
144 | +--+ | +--------------+
145 | peth1 |
146 +---------------------------+
147 \end{verbatim}
149 Соединения с коммутаторами происходят не напрямую
150 а через виртуальных мост (linux bridge) внутри хоста.
151 Этот мост поддерживает протокол STP
152 и в этом контексте может рассматриваться как обычный
153 коммутатор, который не может выйти из строя (точнее,
154 может, но только вместе с хостом, внутри которого он работает).
156 Соединенние двух коммутаторов и двух узлов выглядит так
157 (соединения heartbeat может и не быть, в этом случае
158 в качестве heartbeat-канала будут использоваться
159 основные соединения):
160 \begin{verbatim}
161 +---------------------------+
162 |HOST1 peth0 |
163 | +--+ | +--------------+
164 | +------+ +-+------| switch1 |
165 | | +--+ | ++--+----------+
166 |veth0+---------+----+ | +---+ |
167 | ---+ linux bridge | | | |
168 | +---------+----+ | | |
169 | | +--+ | | +---+----------+
170 | +------+ +-+---|--+ switch2 |
171 | +--+ | | +---+----------+
172 | peth1 | | |
173 +-------+-------------------+ | |
174 | | |
175 |heartbeat | |
176 +-------+-------------------+ | |
177 |HOST2 peth0 | | |
178 | +--+ | | |
179 | +------+ +-+---+ |
180 | | +--+ | |
181 |veth0+---------+----+ | |
182 | ---+ linux bridge | | |
183 | +---------+----+ | |
184 | | +--+ | |
185 | +------+ +-+----------+
186 | +--+ |
187 | peth1 |
188 +---------------------------+
189 \end{verbatim}
191 \subsubsection{Сравнение использования аггрегированных каналов и виртуального моста}
192 Минусы:
194 \begin{enumerate}
195 \item Каналы не объединияются, а используются попеременно.
196 \item Переключение с одного канала на другой происходит достаточно долго. При настройках коммутатора по умолчанию процесс переключения может занять до минуты. Это связано с работой STP. В RSTP было бы быстрее, но RSTP Linux Bridge пока не поддерживает.
197 \end{enumerate}
199 Плюсы:
201 \begin{enumerate}
202 \item От коммутаторов ничего не требуется кроме поддержки STP;
203 \item Можно подключаться к двум независимым коммутаторам;
204 \item Не требуется никакая дополнительная настройка коммутаторов.
205 \end{enumerate}
207 \subsection{Отдельные вопросы эксплуатации xen-drbd}
208 \subsubsection{Создание новых устройств DRBD}
209 При синхронизации множества отдельных томов с помощью DRBD
210 нужно обратить внимание на следующее:
211 \begin{itemize}
212 \item Количество синхронизируемых устройств DRBD ограничено (<=255);
213 \item Для синхронизации отдельных устройств DRBD используются отдельные TCP-порты. При добавлении нового DRBD-устройства обратите внимание на то, что бы порт, который вы назначаете ему для синхронизации, уже не был занят.
214 \item Используйте внешние метадиски, поскольку в случае когда метадиск является внутренним, поведение DRBD при изменении размера логического тома может оказаться неожиданным.
215 \end{itemize}
217 \paragraph{Множество DRBD-устройств}
218 Количество синхронизируемых устройств DRBD ограничено.
219 Максимальное количество используемых одновременно DRBD-устройств
220 задаётся в качестве параметра \texttt{minor\_count} модуля ядра \textbf{drbd}
221 при его загрузке. Этот параметр не может превышать 255.
223 \begin{verbatim}
224 $ sudo modinfo drbd
225 filename: /lib/modules/2.6.18-3-xen-686/kernel/drivers/block/drbd.ko
226 author: Philipp Reisner <phil@linbit.com>, Lars Ellenberg <lars@linbit.com>
227 description: drbd - Distributed Replicated Block Device v8.0.0
228 license: GPL
229 alias: block-major-147-*
230 vermagic: 2.6.18-3-xen-686 SMP mod_unload 686 REGPARM gcc-4.1
231 depends: cn
232 parm: trace_devs:int
233 parm: trace_type:int
234 parm: trace_level:int
235 parm: fault_count:int
236 parm: fault_rate:int
237 parm: enable_faults:int
238 parm: allow_oos:DONT USE! (bool)
239 parm: minor_count:Maximum number of drbd devices (1-255) (int)
240 \end{verbatim}
242 \paragraph{Сетевые порты DRBD}
243 Для синхронизации отдельных устройств DRBD используются отдельные TCP-порты.
244 При добавлении нового DRBD-устройства обратите внимание на то, что бы порт,
245 который вы назначаете ему для синхронизации, уже не был занят.
247 Кроме того, нужно обратить внимание на то, чтобы доступ к этим портам
248 для парного узла не был ограничен брандмауэром.
250 В пример ниже есть строка:
251 \begin{verbatim}
252 address 192.168.1.190:7792;
253 \end{verbatim}
254 она показывает, что синхронизация ресурса
255 выполняется с узлом 192.168.1.190 и для сихнронизации используется
256 порт 7792.
258 \paragraph{Метадиск}
259 Лучше не использовать внуренний метадиск (meta-disk internal),
260 особенно если вы собираетесь менять размер логического тома
261 LVM и файловой системы на нём.
263 Нужно создать отдельный том для-
264 meta-disk\rq{}ов DRBD и задать его размер
265 равным 128MB x количество устройств.
267 В пример конфигурационного файла <tt>drbd.conf</tt>,
268 приведённом ниже, есть строка:
269 \begin{verbatim}
270 meta-disk /dev/XEN/meta[1];
271 \end{verbatim}
272 Она говорит о том, что мета-информация
273 об DRBD-устройстве, к которому относится эта строка,
274 должна находится в мета-диске 1 (нумерация с нуля)
275 на томе \texttt{/dev/XEN/meta}.
276 Подготовка этого тома не выполняется каким-то
277 особенным образом — в данном случае это обычный
278 логический том LVM, но вообще это может быть любое блочное
279 устройство достаточного объёма.
281 Если метадиск создаётся на отдельном логическом
282 томе LVM, то его можно расширять.
283 Расширять метадиск нужно в том случае,
284 когда количество DRBD-устройств, использующих
285 его, превышает допустимое.
286 Это число можно найти, разделив размер метадиска
287 на объём, необходимый для каждого DRBD-устройства
288 (в настоящий момент 128MB).
290 \paragraph{Пример секции файла drbd.conf}
292 \begin{verbatim}
293 resource dns {
294 protocol C;
295 net {
296 allow-two-primaries;
297 after-sb-0pri discard-least-changes;
298 after-sb-1pri call-pri-lost-after-sb;
299 after-sb-2pri call-pri-lost-after-sb;
300 }
301 syncer {
302 rate 5M;
303 }
304 on dom0
305 {
306 device /dev/drbd1;
307 disk /dev/XEN/dns;
308 address 192.168.1.190:7792;
309 meta-disk /dev/XEN/meta[1];
310 }
311 on dom0m
312 {
313 device /dev/drbd1;
314 disk /dev/XEN/dns;
315 address 192.168.1.191:7792;
316 meta-disk /dev/XEN/meta[1];
317 }
318 }
319 \end{verbatim}
321 \subsubsection{Расширение диска DRBD}
322 DRBD-устройство может менять свои размеры.
323 Это возможно в том случае, если меняют размер (как правило, расширяются)
324 устройства на которых базируется DRBD.
325 Когда DRBD работает поверх логических томов LVM,
326 желание расширение DRBD-устройства выглядит весьма естественно,
327 поскольку изменение размеров LVM-томов
328 является вполне простой и часто использующейся операцией;
329 хочется, чтобы то, что работает поверх логического тома LVM
330 могло отреагировать на изменение размеров.
332 Расширение DRBD-устройства и файловой системы, находящейся на нём, состоит из
333 следующих шагов:
334 \begin{enumerate}
335 \item Расширение \textit{логического тома}, на котором базируется DRBD-устройство на обоих узлах.
336 \item Отражение изменений в метадиске.
337 \item Расширение \textit{файловой системы} на primary-устройстве.
338 \item Проверка правильности выполнения.
339 \end{enumerate}
341 Например, пусть:
342 \begin{itemize}
343 \item машины называются \textit{primary} и \textit{secondary}
344 \item с помощью DRBD синхронизируется логический том /dev/TURBO/lv0
345 \item размер тома увеличивается на 2G
346 \item на томе создана файловая система ext2/ext3
347 \end{itemize}
348 Все указанные параметры являются необязательными
349 и приведены для удобства повествования.
351 1) Измените размер тома на обоих машинах.
353 \begin{verbatim}
354 primary# lvresize -L +2048M /dev/TURBO/lv0
355 secondary# lvresize -L +2048M /dev/TURBO/lv0
356 \end{verbatim}
358 2) Вызовите команду перестроения размера
359 DRBD-устройства на обоих машинах:
361 \begin{verbatim}
362 primary# drbdadm resize all #(вместо all может быть указан только интересующий диск)
363 secondary# drbdadm resize all
364 \end{verbatim}
366 3) На primary-устройстве измените размер файловой системы,
367 расположенной на DRBD-устройстве:
369 \begin{verbatim}
370 primary# ext2resize /dev/drbd0 # (или другое устройство)
371 \end{verbatim}
373 4) Проверьте, что изменение размера прошло успешно.
375 \begin{verbatim}
376 primary# df -h /dev/drbd0
377 \end{verbatim}
379 Проверка с помощью df возможна только в том случае,
380 если \texttt{/dev/drbd0} смонтировано в настоящий момент.
382 Размер несмонтированной файловой системы можно тоже посмотреть,
383 но только не в байтах, а в блоках.
384 Для файловых систем ext2/ext3:
386 \begin{verbatim}
387 %# dumpe2fs /dev/drbd0 | grep ^Block
388 dumpe2fs 1.40-WIP (14-Nov-2006)
389 Block count: 979933
390 Block size: 1024
391 Blocks per group: 8192
392 \end{verbatim}
394 Указать домену Xen, использующему DRBD-устройство,
395 что оно изменило размер, в настоящий момент,
396 к сожалению, невозможно.
398 В будущем, сообщить об изменении конфигурации
399 дискового устройства домена будет можно, предположительно,
400 с помощью команды \textbf{xm block-configure}.
402 \subsubsection{Проверка DRBD перед стартом виртуальной машины}
403 Можно сделать так, чтобы виртуальная машина
404 вообще не стартовала до тех пор,
405 пока соответствующее DRBD-устройство не будет переведено
406 в состояние primary
407 (на устройстве в состоянии secondary она может начать работать,
408 но, когда внутреняя операционная система дойдёт до момента
409 монтирования корневой файловой системы, загрузка прекратится;
410 в действительности это устройство вообще не используется до момента
411 монтирования корневой системы, поэтому первый этап загрузки
412 операционной системы домена проходит без ошибок).
414 Предположим, машина использует в качестве своего хранилища
415 устройство /dev/drbd4. В таком случае,
416 проверка будет выглядеть так:
418 \begin{verbatim}
419 import os
420 if os.system("grep '4:.*Primary/Secondary' /proc/drbd") != 0:
421 print "DRBD for this virtual machine not in primary state."
422 print "Exiting."
423 exit(1)
424 \end{verbatim}
426 Эти строки нужно добавить в конфигурационный файл соответствующего
427 домена Xen.
429 Пример использования:
431 \begin{verbatim}
432 %$ sudo drbdadm secondary vpn
434 %$ sudo xm create -c vpn
435 Using config file "/etc/xen/vpn".
436 DRBD for this virtual machine not in primary state.
437 Exiting.
438 Error: 'str' object is not callable
440 %$ sudo drbdadm primary vpn
442 %$ sudo xm create -c vpn
443 Using config file "/etc/xen/vpn".
444 4: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r---
445 Started domain vpn
446 Linux version 2.6.18-4-xen-686 (Debian 2.6.18.dfsg.1-11)
447 (waldi@debian.org) (gcc version 4.1.2 20061115 (prerelease) (Debian
448 4.1.1-21)) #1 SMP Wed Feb 21 20:46:15 UTC 2007
449 BIOS-provided physical RAM map:
450 Xen: 0000000000000000 - 0000000004800000 (usable)
451 0MB HIGHMEM available.
452 72MB LOWMEM available.
453 .......
454 \end{verbatim}
456 Когда DRBD-устройство \textit{vpn} было в резервном состоянии (secondary),
457 создать домен не удалось.
458 После того как оно было переведено
459 в основное состояние (primary), домен успешно стартанул.
461 Если для управления доменами Xen используется скрипт \textit{xen-drbd},
462 то эту проверку выполнять не нужно.
463 Она автоматически выполняется скриптом.
465 \subsection{Дополнительная информация}
466 \begin{itemize}
467 \item \htmladdnormallinkfoot{Использование доменов Xen поверх DRBD-устройств}{http://xgu.ru/wiki/xen/drbd} (рус.)
468 \end{itemize}