\section{Управление кластером виртуализации с помощью xen-drbd}

\subsection{Подготовительные процедуры}
\subsubsection{Развёртывание системы с помощью xen-drbd-install}
Система должна быть развёрнута вручную,
с помощью скрипта xen-drbd-install
или каким-то другим способом.

\begin{itemize}
\item  Должен быть поднят и работать DRBD;
\item  Должны быть подготовлены файловые системы доменов Xen.
\end{itemize}

\subsubsection{Копирование файла топологии}
Файл топологии должен присутствовать на обеих машинах.

Не забудьте изменить на втором узле значение переменной \textit{i\_am}.
Если вы используете функцию \texttt{gethostname()}
для определения собственного имени, обязательно убедитесь
что имя соответствует тому, которое указано в 
переменных \texttt{node1} и \texttt{node2}.

\subsubsection{Инсталляция ключей SSH}
Узлы, входящие в кластер, должны 
знать друг о друге, видеть друга друга
и доверять друг другу.

Для этого необходимо чтобы:

\begin{itemize}
\item  имена узлов (в том виде в каком они указаны в конфигурационном файле топологии) преобразовывались в адреса как на одном узле, так и на втором;
\item  между узлами существовала связь на IP-уровне (ходил пинг);
\item  на обеих системах работали SSH-серверы;
\item  для беспарольной аутентификации на каждом узле были сгенерированы ключи и на противоположный узел была проинсталлирована их открытая часть (или настроение другое средство беспарольной аутентификации).
\end{itemize}

Пример последовательности команд для создания 
и инсталляции SSH-ключей.
\begin{verbatim}
%# ssh-keygen -t dsa
%# cat ~/.ssh/id_dsa.pub \ 
 | ssh mirror \
   'mkdir ~/.ssh/; cat >> ~/.ssh/authorized_keys; chmod 644 ~/.ssh/authorized_keys'
\end{verbatim}

\subsection{Запуск системы}
Будем считать, что наша топология называется
\textit{topology}.
Необходимо чтобы файл с названием \texttt{topology.py}
присутствовал в каталоге \texttt{/etc/xen/}
на обоих узлах кластера.

Сейчас имя текущей топологии указывается прямо в теле скрипта
\texttt{xen-drbd.py}. Укажите там имя вашей топологии.
(Название топологии в будущих топологиях будет настраиваемым без правки кода.)

\subsubsection{Создание ссылок}
Создание ссылок в каталоге \texttt{/dev/drbd}.

Посмотреть, какие ссылки будут создаваться:

\begin{verbatim}
%# xen-drbd-install topology make-links
\end{verbatim}

Создать ссылки:

\begin{verbatim}
%# xen-drbd-install topology make-links | sh -s
\end{verbatim}

Эта операция выполняется скриптом 
\texttt{/etc/init.d/xen-drbd}.

\subsubsection{Создание виртуальных мостов и настройка сети}
Посмотреть, какие мосты будут создаваться и как:

\begin{verbatim}
%# xen-drbd-install topology make-bridges
\end{verbatim}

Если вы используете привязку мостов к реальным
интерфейсам, то будьте осторожны при создании реальной конфигурации, 
потому что вы можете потерять связь с системой.

Создать мосты:

\begin{verbatim}
%# xen-drbd-install topology make-bridges | sh -s
\end{verbatim}

Эта операция выполняется скриптом 
\texttt{/etc/xen/scripts/network-xen-drbd}.

Эти операции должны быть добавлены в загрузку.

\subsection{xen-drbd}
В выполнении операции всегда принимают
участие два узла. 
При старте домена проверяется, 
работает ли этот домен на втором узле.
Если работает, старт не выполняется.

Терминология:
\begin{itemize}
\item  \textit{этот узел} — узел на котором выполняется запуск команды
\item  \textit{второй узел} — второй узел в связке, противоположный тому, на котором был сделан запуск
\item  \textit{домены, закреплённые за узлом} — домены, которые по умолчанию должны запускаться на этом узле. Распределение доменов по узлам определяется переменной \textit{domain\_home} файла описания топологии
\end{itemize}

Запуск доменов:

\begin{itemize}
\item  \textbf{start} \textit{domain} — запустить домен \textit{domain};
\item  \textbf{start-all} — запустить все домены на этом узле (за исключением тех, которые уже работают);
\item  \textbf{start-my-domains} — запустить на этом узле только его домены (в отличие от подкоманды \textit{start-all}, домены закреплённые за вторым узлом не запускаются).
\end{itemize}

Миграция доменов:

\begin{itemize}
\item  \textbf{migrate-out} \textit{domain} — выполнить миграцию домена \textit{domain} на второй узел;
\item  \textbf{migrate-in} \textit{domain} — выполнить миграцию домена \textit{domain} на этот узел со второго узла;
\item  \textbf{migrate-all-out} — выполнить миграцию всех доменов \textit{на второй узел};
\item  \textbf{migrate-all-in} — выполнить миграцию всех доменов \textit{на этот узел} со второго узла;
\item  \textbf{migrate-my-domains-home} — выполнить миграцию \textit{всех доменов, закреплённых за этим узлом,} со второго узла на текущий узел;
\item  \textbf{migrate-and-start-my-domains} — выполнить миграцию всех доменов, закреплённых за этим узлом, со второго узла на текущий узел, и \textit{запустить недостающие} (только на этом узле, на втором запуск не выполняется);
\item  \textbf{migrate-and-start-all} — выполнить миграцию всех доменов по свои местам и запустить недостающие домены на своих местах (операция выполняется одинаково с обоими узлами; на каком из узлов она была вызвана, определяет только порядок старта — сначала домены запускаются на узле, на котором была вызвана команда).
\end{itemize}

\subsection{Стартовые скрипты xen-drbd}
Выше мы вручную делали подготовительные операции: создание ссылок и создание мостов.
Эти операции должны выполняться каждый раз при загрузке системы.

Также при старте системы должны запускаться домены.
А при останове — мигрировать на другой узел кластера или останавлииваться.

Эти операции выполняются с помощью специальных стартовых скриптов:

\begin{itemize}
\item  \texttt{/etc/init.d/xen-drbd} — стартовый скрипт xen-drbd, выполняющий подготовку системы и запуск/миграцию недостающих доменов
\item  \texttt{/etc/xen/scripts/network-xen-drbd} — стартовый скрипт, выполняющий создание и настройку сетевых мостов
\end{itemize}

\subsubsection{Настройка сети при запуске}
Настройку сети xen-drbd можно вызывать из файла 
\texttt{/etc/network/interfaces}:

\begin{verbatim}
# The primary network interface
iface eth0 inet manual
        up /etc/xen/scripts/network-xen-drbd start
\end{verbatim}

\subsubsection{Вызов xen-drbd при загрузке}
Стартовые скрипты создаются автоматически при инсталляции.

Для загрузки скрипты просто включаются в 
иерархию rc.d.
Для дистрибутива Debian GNU/Linux:

\begin{verbatim}
%# update-rc.d xend stop 95 0 1 6 . start 05 2 3 4 5 .
\end{verbatim}

Конфигурация скрипта \texttt{/etc/init.d/xen-drbd}
находится в файле \texttt{/etc/default/xen-drbd}.

\subsubsection{Конфигурационные файлы стартовых скриптов}
Конфигурация стартовых скриптов находится в файле:
\begin{verbatim}
   /etc/default/xen-drbd
\end{verbatim}

Пример файла:

\begin{verbatim}
XEN_DRBD_PATH='/usr/local/sbin'
TOPOLOGY_NAME='topology'
START_ACTION=nothing
STOP_ACTION=nothing
\end{verbatim}

Назначение переменных:
\begin{itemize}
\item  \textit{XEN\_DRBD\_PATH} — путь к каталогу, куда установлен xen-drbd;
\item  \textit{TOPOLOGY\_NAME} — имя топологии;
\item  \textit{START\_ACTION} — действие xen-drbd, которое нужно выполнять при старте системы;
\item  \textit{STOP\_ACTION} — действий xen-drbd, которое нужно выполнять при останове системы.
\end{itemize}

В качестве действи \textit{START\_ACTION} и \textit{STOP\_ACTION} указываются подкоманды \textit{xen-drbd}.
Например:

\begin{verbatim}
START_ACTION=migrate-and-start-all
STOP_ACTION=migrate-all-out
\end{verbatim}

В этом случае при остановке узла домены
мигрируют на второй узел, а при запуске узла
домены возвращаются на место — на тот узел, 
за которым они закреплены.
Если какого-то домена после миграции нет
(например, он был потушен на втором узле), 
то он стартует заново.

Таким образом, когда старт узла завершится, 
на обоих узлах в совокупности должны работать все домены.

\subsection{Нестандартные ситуации}
\subsubsection{Потеряна связь между узлами}
Если в момент запуска домена второй узел
не виден, домен стартовать не будет.

Сейчас сообщение об ошибке выглядит так:

\begin{verbatim}
# xen-drbd.py start samba
Traceback (most recent call last):
  File "/usr/local/sbin/xen-drbd.py", line 245, in ?
    start_domain(domain)
  File "/usr/local/sbin/xen-drbd.py", line 114, in start_domain
    if (get_domain_id(domain,he_is) != -1):
  File "/usr/local/sbin/xen-drbd.py", line 87, in get_domain_id
    res = int(res)
ValueError: invalid literal for int(): 
  ssh: connect to host mirror port 22: No route to host
\end{verbatim}


\subsection{Дополнительная информация}
\begin{itemize}
\item \htmladdnormallinkfoot{xen-drbd}{http://xgu.ru/wiki/xen-drbd} (рус.)
\end{itemize}

