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: