
igor@0: \section{Управление кластером виртуализации с помощью xen-drbd}
igor@0: 
igor@0: \subsection{Подготовительные процедуры}
igor@0: \subsubsection{Развёртывание системы с помощью xen-drbd-install}
igor@0: Система должна быть развёрнута вручную,
igor@0: с помощью скрипта xen-drbd-install
igor@0: или каким-то другим способом.
igor@0: 
igor@0: \begin{itemize}
igor@0: \item  Должен быть поднят и работать DRBD;
igor@0: \item  Должны быть подготовлены файловые системы доменов Xen.
igor@0: \end{itemize}
igor@0: 
igor@0: \subsubsection{Копирование файла топологии}
igor@0: Файл топологии должен присутствовать на обеих машинах.
igor@0: 
igor@0: Не забудьте изменить на втором узле значение переменной \textit{i\_am}.
igor@0: Если вы используете функцию \texttt{gethostname()}
igor@0: для определения собственного имени, обязательно убедитесь
igor@0: что имя соответствует тому, которое указано в 
igor@0: переменных \texttt{node1} и \texttt{node2}.
igor@0: 
igor@0: \subsubsection{Инсталляция ключей SSH}
igor@0: Узлы, входящие в кластер, должны 
igor@0: знать друг о друге, видеть друга друга
igor@0: и доверять друг другу.
igor@0: 
igor@0: Для этого необходимо чтобы:
igor@0: 
igor@0: \begin{itemize}
igor@0: \item  имена узлов (в том виде в каком они указаны в конфигурационном файле топологии) преобразовывались в адреса как на одном узле, так и на втором;
igor@0: \item  между узлами существовала связь на IP-уровне (ходил пинг);
igor@0: \item  на обеих системах работали SSH-серверы;
igor@0: \item  для беспарольной аутентификации на каждом узле были сгенерированы ключи и на противоположный узел была проинсталлирована их открытая часть (или настроение другое средство беспарольной аутентификации).
igor@0: \end{itemize}
igor@0: 
igor@0: Пример последовательности команд для создания 
igor@0: и инсталляции SSH-ключей.
igor@0: \begin{verbatim}
igor@0: %# ssh-keygen -t dsa
igor@0: %# cat ~/.ssh/id_dsa.pub \ 
igor@0:  | ssh mirror \
igor@0:    'mkdir ~/.ssh/; cat >> ~/.ssh/authorized_keys; chmod 644 ~/.ssh/authorized_keys'
igor@0: \end{verbatim}
igor@0: 
igor@0: \subsection{Запуск системы}
igor@0: Будем считать, что наша топология называется
igor@0: \textit{topology}.
igor@0: Необходимо чтобы файл с названием \texttt{topology.py}
igor@0: присутствовал в каталоге \texttt{/etc/xen/}
igor@0: на обоих узлах кластера.
igor@0: 
igor@0: Сейчас имя текущей топологии указывается прямо в теле скрипта
igor@0: \texttt{xen-drbd.py}. Укажите там имя вашей топологии.
igor@0: (Название топологии в будущих топологиях будет настраиваемым без правки кода.)
igor@0: 
igor@0: \subsubsection{Создание ссылок}
igor@0: Создание ссылок в каталоге \texttt{/dev/drbd}.
igor@0: 
igor@0: Посмотреть, какие ссылки будут создаваться:
igor@0: 
igor@0: \begin{verbatim}
igor@0: %# xen-drbd-install topology make-links
igor@0: \end{verbatim}
igor@0: 
igor@0: Создать ссылки:
igor@0: 
igor@0: \begin{verbatim}
igor@0: %# xen-drbd-install topology make-links | sh -s
igor@0: \end{verbatim}
igor@0: 
igor@0: Эта операция выполняется скриптом 
igor@0: \texttt{/etc/init.d/xen-drbd}.
igor@0: 
igor@0: \subsubsection{Создание виртуальных мостов и настройка сети}
igor@0: Посмотреть, какие мосты будут создаваться и как:
igor@0: 
igor@0: \begin{verbatim}
igor@0: %# xen-drbd-install topology make-bridges
igor@0: \end{verbatim}
igor@0: 
igor@0: Если вы используете привязку мостов к реальным
igor@0: интерфейсам, то будьте осторожны при создании реальной конфигурации, 
igor@0: потому что вы можете потерять связь с системой.
igor@0: 
igor@0: Создать мосты:
igor@0: 
igor@0: \begin{verbatim}
igor@0: %# xen-drbd-install topology make-bridges | sh -s
igor@0: \end{verbatim}
igor@0: 
igor@0: Эта операция выполняется скриптом 
igor@0: \texttt{/etc/xen/scripts/network-xen-drbd}.
igor@0: 
igor@0: Эти операции должны быть добавлены в загрузку.
igor@0: 
igor@0: \subsection{xen-drbd}
igor@0: В выполнении операции всегда принимают
igor@0: участие два узла. 
igor@0: При старте домена проверяется, 
igor@0: работает ли этот домен на втором узле.
igor@0: Если работает, старт не выполняется.
igor@0: 
igor@0: Терминология:
igor@0: \begin{itemize}
igor@0: \item  \textit{этот узел} — узел на котором выполняется запуск команды
igor@0: \item  \textit{второй узел} — второй узел в связке, противоположный тому, на котором был сделан запуск
igor@0: \item  \textit{домены, закреплённые за узлом} — домены, которые по умолчанию должны запускаться на этом узле. Распределение доменов по узлам определяется переменной \textit{domain\_home} файла описания топологии
igor@0: \end{itemize}
igor@0: 
igor@0: Запуск доменов:
igor@0: 
igor@0: \begin{itemize}
igor@0: \item  \textbf{start} \textit{domain} — запустить домен \textit{domain};
igor@0: \item  \textbf{start-all} — запустить все домены на этом узле (за исключением тех, которые уже работают);
igor@0: \item  \textbf{start-my-domains} — запустить на этом узле только его домены (в отличие от подкоманды \textit{start-all}, домены закреплённые за вторым узлом не запускаются).
igor@0: \end{itemize}
igor@0: 
igor@0: Миграция доменов:
igor@0: 
igor@0: \begin{itemize}
igor@0: \item  \textbf{migrate-out} \textit{domain} — выполнить миграцию домена \textit{domain} на второй узел;
igor@0: \item  \textbf{migrate-in} \textit{domain} — выполнить миграцию домена \textit{domain} на этот узел со второго узла;
igor@0: \item  \textbf{migrate-all-out} — выполнить миграцию всех доменов \textit{на второй узел};
igor@0: \item  \textbf{migrate-all-in} — выполнить миграцию всех доменов \textit{на этот узел} со второго узла;
igor@0: \item  \textbf{migrate-my-domains-home} — выполнить миграцию \textit{всех доменов, закреплённых за этим узлом,} со второго узла на текущий узел;
igor@0: \item  \textbf{migrate-and-start-my-domains} — выполнить миграцию всех доменов, закреплённых за этим узлом, со второго узла на текущий узел, и \textit{запустить недостающие} (только на этом узле, на втором запуск не выполняется);
igor@0: \item  \textbf{migrate-and-start-all} — выполнить миграцию всех доменов по свои местам и запустить недостающие домены на своих местах (операция выполняется одинаково с обоими узлами; на каком из узлов она была вызвана, определяет только порядок старта — сначала домены запускаются на узле, на котором была вызвана команда).
igor@0: \end{itemize}
igor@0: 
igor@0: \subsection{Стартовые скрипты xen-drbd}
igor@0: Выше мы вручную делали подготовительные операции: создание ссылок и создание мостов.
igor@0: Эти операции должны выполняться каждый раз при загрузке системы.
igor@0: 
igor@0: Также при старте системы должны запускаться домены.
igor@0: А при останове — мигрировать на другой узел кластера или останавлииваться.
igor@0: 
igor@0: Эти операции выполняются с помощью специальных стартовых скриптов:
igor@0: 
igor@0: \begin{itemize}
igor@0: \item  \texttt{/etc/init.d/xen-drbd} — стартовый скрипт xen-drbd, выполняющий подготовку системы и запуск/миграцию недостающих доменов
igor@0: \item  \texttt{/etc/xen/scripts/network-xen-drbd} — стартовый скрипт, выполняющий создание и настройку сетевых мостов
igor@0: \end{itemize}
igor@0: 
igor@0: \subsubsection{Настройка сети при запуске}
igor@0: Настройку сети xen-drbd можно вызывать из файла 
igor@0: \texttt{/etc/network/interfaces}:
igor@0: 
igor@0: \begin{verbatim}
igor@0: # The primary network interface
igor@0: iface eth0 inet manual
igor@0:         up /etc/xen/scripts/network-xen-drbd start
igor@0: \end{verbatim}
igor@0: 
igor@0: \subsubsection{Вызов xen-drbd при загрузке}
igor@0: Стартовые скрипты создаются автоматически при инсталляции.
igor@0: 
igor@0: Для загрузки скрипты просто включаются в 
igor@0: иерархию rc.d.
igor@0: Для дистрибутива Debian GNU/Linux:
igor@0: 
igor@0: \begin{verbatim}
igor@0: %# update-rc.d xend stop 95 0 1 6 . start 05 2 3 4 5 .
igor@0: \end{verbatim}
igor@0: 
igor@0: Конфигурация скрипта \texttt{/etc/init.d/xen-drbd}
igor@0: находится в файле \texttt{/etc/default/xen-drbd}.
igor@0: 
igor@0: \subsubsection{Конфигурационные файлы стартовых скриптов}
igor@0: Конфигурация стартовых скриптов находится в файле:
igor@0: \begin{verbatim}
igor@0:    /etc/default/xen-drbd
igor@0: \end{verbatim}
igor@0: 
igor@0: Пример файла:
igor@0: 
igor@0: \begin{verbatim}
igor@0: XEN_DRBD_PATH='/usr/local/sbin'
igor@0: TOPOLOGY_NAME='topology'
igor@0: START_ACTION=nothing
igor@0: STOP_ACTION=nothing
igor@0: \end{verbatim}
igor@0: 
igor@0: Назначение переменных:
igor@0: \begin{itemize}
igor@0: \item  \textit{XEN\_DRBD\_PATH} — путь к каталогу, куда установлен xen-drbd;
igor@0: \item  \textit{TOPOLOGY\_NAME} — имя топологии;
igor@0: \item  \textit{START\_ACTION} — действие xen-drbd, которое нужно выполнять при старте системы;
igor@0: \item  \textit{STOP\_ACTION} — действий xen-drbd, которое нужно выполнять при останове системы.
igor@0: \end{itemize}
igor@0: 
igor@0: В качестве действи \textit{START\_ACTION} и \textit{STOP\_ACTION} указываются подкоманды \textit{xen-drbd}.
igor@0: Например:
igor@0: 
igor@0: \begin{verbatim}
igor@0: START_ACTION=migrate-and-start-all
igor@0: STOP_ACTION=migrate-all-out
igor@0: \end{verbatim}
igor@0: 
igor@0: В этом случае при остановке узла домены
igor@0: мигрируют на второй узел, а при запуске узла
igor@0: домены возвращаются на место — на тот узел, 
igor@0: за которым они закреплены.
igor@0: Если какого-то домена после миграции нет
igor@0: (например, он был потушен на втором узле), 
igor@0: то он стартует заново.
igor@0: 
igor@0: Таким образом, когда старт узла завершится, 
igor@0: на обоих узлах в совокупности должны работать все домены.
igor@0: 
igor@0: \subsection{Нестандартные ситуации}
igor@0: \subsubsection{Потеряна связь между узлами}
igor@0: Если в момент запуска домена второй узел
igor@0: не виден, домен стартовать не будет.
igor@0: 
igor@0: Сейчас сообщение об ошибке выглядит так:
igor@0: 
igor@0: \begin{verbatim}
igor@0: # xen-drbd.py start samba
igor@0: Traceback (most recent call last):
igor@0:   File "/usr/local/sbin/xen-drbd.py", line 245, in ?
igor@0:     start_domain(domain)
igor@0:   File "/usr/local/sbin/xen-drbd.py", line 114, in start_domain
igor@0:     if (get_domain_id(domain,he_is) != -1):
igor@0:   File "/usr/local/sbin/xen-drbd.py", line 87, in get_domain_id
igor@0:     res = int(res)
igor@0: ValueError: invalid literal for int(): 
igor@0:   ssh: connect to host mirror port 22: No route to host
igor@0: \end{verbatim}
igor@0: 
igor@0: 
igor@0: \subsection{Дополнительная информация}
igor@0: \begin{itemize}
igor@0: \item \htmladdnormallinkfoot{xen-drbd}{http://xgu.ru/wiki/xen-drbd} (рус.)
igor@0: \end{itemize}
igor@0: 




