xg-scale
diff 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 diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/xen/drbd.tex Tue Jul 01 16:28:00 2008 +0300 1.3 @@ -0,0 +1,468 @@ 1.4 +\section{Построение отказоустойчивого кластера виртуальных машин Xen + DRBD} 1.5 + 1.6 +\subsection{Идея} 1.7 +Компоненты: 1.8 +\begin{itemize} 1.9 +\item \textbf{Xen} — монитор виртуальных машин (VMM, Virtual Machine Monitor) или гипервизор (hypervisor) с поддержкой паравиртуализации (para-virtualization) для процессоров x86 архитектуры, распространяющийся с открытым исходным кодом (opensource). Xen может организовать совместное безопасное исполнение нескольких виртуальных машин на одной физической системе с производительностью близкой к непосредственной (native). 1.10 +\item \textbf{LVM} (Logical Volume Manager) — менеджер логических томов операционной системы Linux. LVM предоставляет собой дополнительный уровень абстракции между физическими/логическими дисками и файловой системой. 1.11 +\item \textbf{DRBD} (Distributed Replicated Block Deice) — блочное устройство, предназначенное для построения отказоустойчивых кластерных систем на операционной системе Linux. DRBD занимается полным отражением (mirroring) по сети всех операций с блочным устройством. Можно считать, что DRBD это сетевой RAID-1. 1.12 +\end{itemize} 1.13 + 1.14 +Терминология: 1.15 +\begin{itemize} 1.16 +\item узел — физический сервер, на котором исполняются виртуальные машины; 1.17 +\item DRBD-устройство — дисковый раздел или логический том LVM, синхронизируемый с помощью DRBD; 1.18 +\item домен — работающая виртуальная машина Xen; 1.19 +\item кластер — два узла, которые имеют общие DRBD-устройства, поверх которых выполняются общие домены Xen. 1.20 +\end{itemize} 1.21 + 1.22 +Идея заключается в том, чтобы в качестве дисковых устройств для виртуальных машин Xen, 1.23 +использовать DRBD-устройства. DRBD устройства в свою очередь размещаются поверх LVM томов машин входящих в кластер. 1.24 + 1.25 +DRBD отвечает за полную синхронизацию операций с дисковыми системами, выполняющимися доменами Xen. 1.26 + 1.27 +С точки зрения внешнего наблюдателя не имеет значения, на каком из узлов кластера 1.28 +в настоящий момент выполняется виртуальная машина. 1.29 + 1.30 +При плановом выведении узла из эксплуатации, 1.31 +машины, работающие на нём, мигрируют на второй узел кластера. 1.32 +Это совершенно незаметно с точки зрения внешнего наблюдателя. 1.33 + 1.34 +При внезапной остановке одного из узлов машины, 1.35 +работавшие на нём, запускаются на втором узле. 1.36 +С точки зрения внешнего наблюдателя, работавшего с виртуальной машиной, 1.37 +которая исполнялась на внезапно выключившемся узле, это выглядит 1.38 +как перезагрузка машины. 1.39 + 1.40 +Виртуальные машины могут быть произвольно распределены по узлам кластера. 1.41 + 1.42 +\begin{center} \resizebox{10cm}{!}{\includegraphics{/var/lib/mediawiki/images/4/4b/Xen-drbd.png}}\\ \textit{}\end{center} 1.43 + 1.44 +\subsection{Инсталляция и управление кластером} 1.45 +\subsubsection{Подготовка узлов} 1.46 + 1.47 +Подготовка узлов может выполняться вручную или с помощью 1.48 +вспомогательных средств, таких, например, как скрипт \textit{xen-drbd-install}. 1.49 +Скрипт \textit{xen-drdb-install} предназначен для облегчения 1.50 +рутинных операций, выполняющихся при инсталляции 1.51 +нового кластера виртуализации с повышенной отказоустойчивостью, 1.52 +построенного на основе Xen и DRBD. 1.53 + 1.54 +В результате работы \textit{xen-drbd-install} 1.55 +создаётся сценарий командного интерпретатора, 1.56 +который выполняет такие действия: 1.57 +\begin{enumerate} 1.58 +\item Подготовка LVM томов; 1.59 +\item Настройка DRBD устройств; 1.60 +\item Наполнение файловых систем доменов. 1.61 +\end{enumerate} 1.62 + 1.63 +Полученный сценарий может быть доработан вручную, 1.64 +а может использоваться непосредственном в том 1.65 +виде, как его сгенерирует \textit{xen-drbd-install}. 1.66 + 1.67 +\subsubsection{Управление узлами} 1.68 + 1.69 +Скрипт \textit{xen-drbd} 1.70 +обеспечивает взаимное соответсвие 1.71 +состояния DRBD-устройств и доменов Xen, использующих их. 1.72 +Он следит за тем, чтобы при выполнении таких 1.73 +операций как запуск и миграция доменов, 1.74 +используемые DRBD-устройства 1.75 +переключались основное (primary) или резервное (secondary) состояние 1.76 +в зависимости от точки запуска или направления миграции. 1.77 + 1.78 +Он также следит за тем, чтобы один и тот же домен 1.79 +нельзя было запустить на разных узлах кластера 1.80 +несколько раз. 1.81 + 1.82 +Кроме этого, \textit{xen-drbd} контролирует процесс запуска и останова узлов: 1.83 +он инициирует миграцию доменов с одного узла на другой в случае 1.84 +останова первого; и обратную миграцию при запуске узла. 1.85 + 1.86 +\subsection{Взаимный контроль узлов с помощью heartbeat} 1.87 +Кластер функционален уже — без настройки и использования heartbeat — 1.88 +однако функциональность его частична: 1.89 +при выходе из строя одного из узлов кластера 1.90 +доступными останутся только те домены, которые 1.91 +исполнялись на нём в момент выхода из строя второго узла. 1.92 +Оставшиеся домены можно будет поднять, но только вручную. 1.93 +Нужно же, чтобы каждый из узлов имел возможность определить, 1.94 +что его напарник пропал, и запустить все недостающие домены. 1.95 +При этом особенно важно избежать случая, когда каждый узел 1.96 +ошибочно решит, что его напарник выключился, в то время как 1.97 +оба они будут работать, но по какой-то причине перестанут видеть друг друга. 1.98 +В этом случае может наступить опасная ситуация, касающаяся взаимной противоречивости данных на DRBD-устройствах, и названная \textit{split-brain}. 1.99 + 1.100 +\subsection{Резервирование коммутаторов и сетевых адаптеров} 1.101 +\subsubsection{Использование аггрегированных каналов} 1.102 +Сетевые адаптеры узлов могут быть зарезервированы 1.103 +путём аггрегирования каналов, 1.104 +соединяющих узел с коммутатором. 1.105 + 1.106 +В каждом сервере должно быть по два сетевых адаптера, 1.107 +каждый из которых подключается к коммутатору. 1.108 +Они работают как единое целое, то есть два канала 1.109 +выглядят как один аггрегированный. 1.110 + 1.111 +При пропадении одного из соединений (это может быть связано 1.112 +с неполадками адаптера, соединительного кабеля или порта коммутатора) 1.113 +система продолжает работу на оставшемся. 1.114 +В системном журнале появляется сообщение о 1.115 +возникшей проблеме. 1.116 + 1.117 +Для работы аггрегированного канала необходима поддержка 1.118 +со стороны коммутатора: 1.119 +\begin{itemize} 1.120 +\item он должен поддерживать аггрегированные каналы; 1.121 +\item он должен быть настроен соответствующим образом. 1.122 +\end{itemize} 1.123 + 1.124 +\subsubsection{Использование виртуального моста и STP} 1.125 +Построить аггрегированный канал на два независимых коммутатора 1.126 +нельзя (за некоторыми проприетарными исключениями). 1.127 + 1.128 +Можно отказаться от использования аггрегированного канала 1.129 +и с некоторой потерей функциональности перейти на использование 1.130 +протокола STP и виртуального моста. 1.131 +Это позволит сделать резервирование коммутатора, однако 1.132 +у такого решения есть недостаток: 1.133 +в отдельно взятый момент времени будет работать один из каналов. 1.134 + 1.135 +Подключение одного узла выглядит так: 1.136 +\begin{verbatim} 1.137 ++---------------------------+ 1.138 +|HOST peth0 | 1.139 +| +--+ | +--------------+ 1.140 +| +------+ +-+------| switch1 | 1.141 +| | +--+ | +---+----------+ 1.142 +|veth0+---------+----+ | | 1.143 +| ---+ linux bridge | | | 1.144 +| +---------+----+ | | 1.145 +| | +--+ | +---+----------+ 1.146 +| +------+ +-+------+ switch2 | 1.147 +| +--+ | +--------------+ 1.148 +| peth1 | 1.149 ++---------------------------+ 1.150 +\end{verbatim} 1.151 + 1.152 +Соединения с коммутаторами происходят не напрямую 1.153 +а через виртуальных мост (linux bridge) внутри хоста. 1.154 +Этот мост поддерживает протокол STP 1.155 +и в этом контексте может рассматриваться как обычный 1.156 +коммутатор, который не может выйти из строя (точнее, 1.157 +может, но только вместе с хостом, внутри которого он работает). 1.158 + 1.159 +Соединенние двух коммутаторов и двух узлов выглядит так 1.160 +(соединения heartbeat может и не быть, в этом случае 1.161 +в качестве heartbeat-канала будут использоваться 1.162 +основные соединения): 1.163 +\begin{verbatim} 1.164 ++---------------------------+ 1.165 +|HOST1 peth0 | 1.166 +| +--+ | +--------------+ 1.167 +| +------+ +-+------| switch1 | 1.168 +| | +--+ | ++--+----------+ 1.169 +|veth0+---------+----+ | +---+ | 1.170 +| ---+ linux bridge | | | | 1.171 +| +---------+----+ | | | 1.172 +| | +--+ | | +---+----------+ 1.173 +| +------+ +-+---|--+ switch2 | 1.174 +| +--+ | | +---+----------+ 1.175 +| peth1 | | | 1.176 ++-------+-------------------+ | | 1.177 + | | | 1.178 + |heartbeat | | 1.179 ++-------+-------------------+ | | 1.180 +|HOST2 peth0 | | | 1.181 +| +--+ | | | 1.182 +| +------+ +-+---+ | 1.183 +| | +--+ | | 1.184 +|veth0+---------+----+ | | 1.185 +| ---+ linux bridge | | | 1.186 +| +---------+----+ | | 1.187 +| | +--+ | | 1.188 +| +------+ +-+----------+ 1.189 +| +--+ | 1.190 +| peth1 | 1.191 ++---------------------------+ 1.192 +\end{verbatim} 1.193 + 1.194 +\subsubsection{Сравнение использования аггрегированных каналов и виртуального моста} 1.195 +Минусы: 1.196 + 1.197 +\begin{enumerate} 1.198 +\item Каналы не объединияются, а используются попеременно. 1.199 +\item Переключение с одного канала на другой происходит достаточно долго. При настройках коммутатора по умолчанию процесс переключения может занять до минуты. Это связано с работой STP. В RSTP было бы быстрее, но RSTP Linux Bridge пока не поддерживает. 1.200 +\end{enumerate} 1.201 + 1.202 +Плюсы: 1.203 + 1.204 +\begin{enumerate} 1.205 +\item От коммутаторов ничего не требуется кроме поддержки STP; 1.206 +\item Можно подключаться к двум независимым коммутаторам; 1.207 +\item Не требуется никакая дополнительная настройка коммутаторов. 1.208 +\end{enumerate} 1.209 + 1.210 +\subsection{Отдельные вопросы эксплуатации xen-drbd} 1.211 +\subsubsection{Создание новых устройств DRBD} 1.212 +При синхронизации множества отдельных томов с помощью DRBD 1.213 +нужно обратить внимание на следующее: 1.214 +\begin{itemize} 1.215 +\item Количество синхронизируемых устройств DRBD ограничено (<=255); 1.216 +\item Для синхронизации отдельных устройств DRBD используются отдельные TCP-порты. При добавлении нового DRBD-устройства обратите внимание на то, что бы порт, который вы назначаете ему для синхронизации, уже не был занят. 1.217 +\item Используйте внешние метадиски, поскольку в случае когда метадиск является внутренним, поведение DRBD при изменении размера логического тома может оказаться неожиданным. 1.218 +\end{itemize} 1.219 + 1.220 +\paragraph{Множество DRBD-устройств} 1.221 +Количество синхронизируемых устройств DRBD ограничено. 1.222 +Максимальное количество используемых одновременно DRBD-устройств 1.223 +задаётся в качестве параметра \texttt{minor\_count} модуля ядра \textbf{drbd} 1.224 +при его загрузке. Этот параметр не может превышать 255. 1.225 + 1.226 +\begin{verbatim} 1.227 +$ sudo modinfo drbd 1.228 +filename: /lib/modules/2.6.18-3-xen-686/kernel/drivers/block/drbd.ko 1.229 +author: Philipp Reisner <phil@linbit.com>, Lars Ellenberg <lars@linbit.com> 1.230 +description: drbd - Distributed Replicated Block Device v8.0.0 1.231 +license: GPL 1.232 +alias: block-major-147-* 1.233 +vermagic: 2.6.18-3-xen-686 SMP mod_unload 686 REGPARM gcc-4.1 1.234 +depends: cn 1.235 +parm: trace_devs:int 1.236 +parm: trace_type:int 1.237 +parm: trace_level:int 1.238 +parm: fault_count:int 1.239 +parm: fault_rate:int 1.240 +parm: enable_faults:int 1.241 +parm: allow_oos:DONT USE! (bool) 1.242 +parm: minor_count:Maximum number of drbd devices (1-255) (int) 1.243 +\end{verbatim} 1.244 + 1.245 +\paragraph{Сетевые порты DRBD} 1.246 +Для синхронизации отдельных устройств DRBD используются отдельные TCP-порты. 1.247 +При добавлении нового DRBD-устройства обратите внимание на то, что бы порт, 1.248 +который вы назначаете ему для синхронизации, уже не был занят. 1.249 + 1.250 +Кроме того, нужно обратить внимание на то, чтобы доступ к этим портам 1.251 +для парного узла не был ограничен брандмауэром. 1.252 + 1.253 +В пример ниже есть строка: 1.254 +\begin{verbatim} 1.255 + address 192.168.1.190:7792; 1.256 +\end{verbatim} 1.257 +она показывает, что синхронизация ресурса 1.258 +выполняется с узлом 192.168.1.190 и для сихнронизации используется 1.259 +порт 7792. 1.260 + 1.261 +\paragraph{Метадиск} 1.262 +Лучше не использовать внуренний метадиск (meta-disk internal), 1.263 +особенно если вы собираетесь менять размер логического тома 1.264 +LVM и файловой системы на нём. 1.265 + 1.266 +Нужно создать отдельный том для- 1.267 +meta-disk\rq{}ов DRBD и задать его размер 1.268 +равным 128MB x количество устройств. 1.269 + 1.270 +В пример конфигурационного файла <tt>drbd.conf</tt>, 1.271 +приведённом ниже, есть строка: 1.272 +\begin{verbatim} 1.273 + meta-disk /dev/XEN/meta[1]; 1.274 +\end{verbatim} 1.275 +Она говорит о том, что мета-информация 1.276 +об DRBD-устройстве, к которому относится эта строка, 1.277 +должна находится в мета-диске 1 (нумерация с нуля) 1.278 +на томе \texttt{/dev/XEN/meta}. 1.279 +Подготовка этого тома не выполняется каким-то 1.280 +особенным образом — в данном случае это обычный 1.281 +логический том LVM, но вообще это может быть любое блочное 1.282 +устройство достаточного объёма. 1.283 + 1.284 +Если метадиск создаётся на отдельном логическом 1.285 +томе LVM, то его можно расширять. 1.286 +Расширять метадиск нужно в том случае, 1.287 +когда количество DRBD-устройств, использующих 1.288 +его, превышает допустимое. 1.289 +Это число можно найти, разделив размер метадиска 1.290 +на объём, необходимый для каждого DRBD-устройства 1.291 +(в настоящий момент 128MB). 1.292 + 1.293 +\paragraph{Пример секции файла drbd.conf} 1.294 + 1.295 +\begin{verbatim} 1.296 +resource dns { 1.297 + protocol C; 1.298 + net { 1.299 + allow-two-primaries; 1.300 + after-sb-0pri discard-least-changes; 1.301 + after-sb-1pri call-pri-lost-after-sb; 1.302 + after-sb-2pri call-pri-lost-after-sb; 1.303 + } 1.304 + syncer { 1.305 + rate 5M; 1.306 + } 1.307 + on dom0 1.308 + { 1.309 + device /dev/drbd1; 1.310 + disk /dev/XEN/dns; 1.311 + address 192.168.1.190:7792; 1.312 + meta-disk /dev/XEN/meta[1]; 1.313 + } 1.314 + on dom0m 1.315 + { 1.316 + device /dev/drbd1; 1.317 + disk /dev/XEN/dns; 1.318 + address 192.168.1.191:7792; 1.319 + meta-disk /dev/XEN/meta[1]; 1.320 + } 1.321 +} 1.322 +\end{verbatim} 1.323 + 1.324 +\subsubsection{Расширение диска DRBD} 1.325 +DRBD-устройство может менять свои размеры. 1.326 +Это возможно в том случае, если меняют размер (как правило, расширяются) 1.327 +устройства на которых базируется DRBD. 1.328 +Когда DRBD работает поверх логических томов LVM, 1.329 +желание расширение DRBD-устройства выглядит весьма естественно, 1.330 +поскольку изменение размеров LVM-томов 1.331 +является вполне простой и часто использующейся операцией; 1.332 +хочется, чтобы то, что работает поверх логического тома LVM 1.333 +могло отреагировать на изменение размеров. 1.334 + 1.335 +Расширение DRBD-устройства и файловой системы, находящейся на нём, состоит из 1.336 +следующих шагов: 1.337 +\begin{enumerate} 1.338 +\item Расширение \textit{логического тома}, на котором базируется DRBD-устройство на обоих узлах. 1.339 +\item Отражение изменений в метадиске. 1.340 +\item Расширение \textit{файловой системы} на primary-устройстве. 1.341 +\item Проверка правильности выполнения. 1.342 +\end{enumerate} 1.343 + 1.344 +Например, пусть: 1.345 +\begin{itemize} 1.346 +\item машины называются \textit{primary} и \textit{secondary} 1.347 +\item с помощью DRBD синхронизируется логический том /dev/TURBO/lv0 1.348 +\item размер тома увеличивается на 2G 1.349 +\item на томе создана файловая система ext2/ext3 1.350 +\end{itemize} 1.351 +Все указанные параметры являются необязательными 1.352 +и приведены для удобства повествования. 1.353 + 1.354 +1) Измените размер тома на обоих машинах. 1.355 + 1.356 +\begin{verbatim} 1.357 +primary# lvresize -L +2048M /dev/TURBO/lv0 1.358 +secondary# lvresize -L +2048M /dev/TURBO/lv0 1.359 +\end{verbatim} 1.360 + 1.361 +2) Вызовите команду перестроения размера 1.362 +DRBD-устройства на обоих машинах: 1.363 + 1.364 +\begin{verbatim} 1.365 +primary# drbdadm resize all #(вместо all может быть указан только интересующий диск) 1.366 +secondary# drbdadm resize all 1.367 +\end{verbatim} 1.368 + 1.369 +3) На primary-устройстве измените размер файловой системы, 1.370 +расположенной на DRBD-устройстве: 1.371 + 1.372 +\begin{verbatim} 1.373 +primary# ext2resize /dev/drbd0 # (или другое устройство) 1.374 +\end{verbatim} 1.375 + 1.376 +4) Проверьте, что изменение размера прошло успешно. 1.377 + 1.378 +\begin{verbatim} 1.379 +primary# df -h /dev/drbd0 1.380 +\end{verbatim} 1.381 + 1.382 +Проверка с помощью df возможна только в том случае, 1.383 +если \texttt{/dev/drbd0} смонтировано в настоящий момент. 1.384 + 1.385 +Размер несмонтированной файловой системы можно тоже посмотреть, 1.386 +но только не в байтах, а в блоках. 1.387 +Для файловых систем ext2/ext3: 1.388 + 1.389 +\begin{verbatim} 1.390 +%# dumpe2fs /dev/drbd0 | grep ^Block 1.391 +dumpe2fs 1.40-WIP (14-Nov-2006) 1.392 +Block count: 979933 1.393 +Block size: 1024 1.394 +Blocks per group: 8192 1.395 +\end{verbatim} 1.396 + 1.397 +Указать домену Xen, использующему DRBD-устройство, 1.398 +что оно изменило размер, в настоящий момент, 1.399 +к сожалению, невозможно. 1.400 + 1.401 +В будущем, сообщить об изменении конфигурации 1.402 +дискового устройства домена будет можно, предположительно, 1.403 +с помощью команды \textbf{xm block-configure}. 1.404 + 1.405 +\subsubsection{Проверка DRBD перед стартом виртуальной машины} 1.406 +Можно сделать так, чтобы виртуальная машина 1.407 +вообще не стартовала до тех пор, 1.408 +пока соответствующее DRBD-устройство не будет переведено 1.409 +в состояние primary 1.410 +(на устройстве в состоянии secondary она может начать работать, 1.411 +но, когда внутреняя операционная система дойдёт до момента 1.412 +монтирования корневой файловой системы, загрузка прекратится; 1.413 +в действительности это устройство вообще не используется до момента 1.414 +монтирования корневой системы, поэтому первый этап загрузки 1.415 +операционной системы домена проходит без ошибок). 1.416 + 1.417 +Предположим, машина использует в качестве своего хранилища 1.418 +устройство /dev/drbd4. В таком случае, 1.419 +проверка будет выглядеть так: 1.420 + 1.421 +\begin{verbatim} 1.422 +import os 1.423 +if os.system("grep '4:.*Primary/Secondary' /proc/drbd") != 0: 1.424 + print "DRBD for this virtual machine not in primary state." 1.425 + print "Exiting." 1.426 + exit(1) 1.427 +\end{verbatim} 1.428 + 1.429 +Эти строки нужно добавить в конфигурационный файл соответствующего 1.430 +домена Xen. 1.431 + 1.432 +Пример использования: 1.433 + 1.434 +\begin{verbatim} 1.435 +%$ sudo drbdadm secondary vpn 1.436 + 1.437 +%$ sudo xm create -c vpn 1.438 +Using config file "/etc/xen/vpn". 1.439 +DRBD for this virtual machine not in primary state. 1.440 +Exiting. 1.441 +Error: 'str' object is not callable 1.442 + 1.443 +%$ sudo drbdadm primary vpn 1.444 + 1.445 +%$ sudo xm create -c vpn 1.446 +Using config file "/etc/xen/vpn". 1.447 + 4: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r--- 1.448 +Started domain vpn 1.449 +Linux version 2.6.18-4-xen-686 (Debian 2.6.18.dfsg.1-11) 1.450 +(waldi@debian.org) (gcc version 4.1.2 20061115 (prerelease) (Debian 1.451 +4.1.1-21)) #1 SMP Wed Feb 21 20:46:15 UTC 2007 1.452 +BIOS-provided physical RAM map: 1.453 + Xen: 0000000000000000 - 0000000004800000 (usable) 1.454 +0MB HIGHMEM available. 1.455 +72MB LOWMEM available. 1.456 +....... 1.457 +\end{verbatim} 1.458 + 1.459 +Когда DRBD-устройство \textit{vpn} было в резервном состоянии (secondary), 1.460 +создать домен не удалось. 1.461 +После того как оно было переведено 1.462 +в основное состояние (primary), домен успешно стартанул. 1.463 + 1.464 +Если для управления доменами Xen используется скрипт \textit{xen-drbd}, 1.465 +то эту проверку выполнять не нужно. 1.466 +Она автоматически выполняется скриптом. 1.467 + 1.468 +\subsection{Дополнительная информация} 1.469 +\begin{itemize} 1.470 +\item \htmladdnormallinkfoot{Использование доменов Xen поверх DRBD-устройств}{http://xgu.ru/wiki/xen/drbd} (рус.) 1.471 +\end{itemize}