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
|