Допустим, у нас есть один физический довольно мощный сервер. Конкретные характеристики приводить не буду, представим, что это современный сервер со средними или чуть выше средних параметрами. Ты хочешь его использовать в качестве веб-сервера для своего сайта, но в то же время нужно обеспечить его отказоустойчивость, а физический сервер всего один.

Классическая схема отказоустойчивости реализуется при наличии хотя бы двух физических серверов. Один — основной, второй — резервный. Понятно, что если что-то происходит с основным, то в дело вступает резервный. В нашем случае, поскольку нет второго физического сервера, мы будем использовать два виртуальных. Расчет довольно прост: если произойдет какой-то программный глюк на основном виртуальном сервере, то будет работать резервный.

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

 

Выбор решения виртуализации

Какое решение будем использовать для виртуализации? Первое, что приходит на ум, — это старый добрый OpenVZ. Добрый-то он добрый, но уж очень старый, я бы даже сказал — древний, а его ядро вообще родом из мезозойской эры. Другими словами, если у тебя современный дистр, то, установив OpenVZ, ты сделаешь эдакий downgrade. Но выход есть: наследник OpenVZ — Virtuozzo.

Преимущество Virtuozzo в том, что устанавливается он на голое железо и представляет собой отдельный дистрибутив Linux (Virtuozzo Linux), который уже оптимизирован для задач виртуализации и хостинга. Все, что нужно, — взять и установить его на машину, которая будет сервером виртуализации.

Недостаток в том, что Virtuozzo — решение коммерческое и придется немного потратиться. Дополнительную информацию ты сможешь найти на официальной страничке продукта.

 

Получение trial-версии

Прежде чем покупать Virtuozzo, ты можешь его попробовать, чтобы окончательно решить, понравится он тебе или нет. Заходи на их сайт и жми кнопку Try Virtuozzo 7 Now. Далее нужно заполнить несложную форму и нажать кнопку Submit. После этого ты попадешь на страничку, на которой можно скачать ISO-шник и документацию. Линк на ISO-шник и документацию также будет продублирован на твой email, если ты захочешь скачать Virtuozzo и/или документацию позже.

Форма активации твоей trial-версии
Форма активации твоей trial-версии

Триальная лицензия дается во время установки Virtuozzo 7 на хост, поэтому важно наличие интернет-соединения. Trial-версия работает 30 дней — думаю, этого вполне достаточно, чтобы принять решение о покупке.

 

Создание виртуальных серверов

Нам нужно создать два контейнера (естественно, после установки Virtuozzo Linux на физический компьютер), а затем установить в них все самое необходимое. Сначала создадим сами контейнеры:

# prlctl create first --vmtype ct --ostemplate centos-6-x86_64
# prlctl create second --vmtype ct --ostemplate centos-6-x86_64
Рис. 1. Создание контейнеров
Рис. 1. Создание контейнеров

Как ты уже догадался, это будут контейнеры для первого и второго серверов. После создания контейнеров нужно их настроить:

# prlctl set <контейнер> --cpus 1
# prlctl set <контейнер> --memsize 1G --swappages 512M
# prlctl set first --hostname first.example.com
# prlctl set first --ipadd 192.168.52.101
# prlctl set second --hostname second.example.com
# prlctl set second --ipadd 192.168.52.102
Рис. 2. Настройка контейнеров
Рис. 2. Настройка контейнеров

Здесь нужно ввести актуальные параметры. Я выделил каждому виртуальному серверу по одному процессору и гигабайту оперативки, своп — 512 Мбайт (на всякий случай). Можно было бы выделить и 512 Мбайт оперативки — большинство сайтов работают на виртуальном хостинге с худшими характеристиками. Также доменные имена и IP-адреса нужно указать собственные, у меня демонстрационные.

Запускаем виртуальный сервер:

# prlctl start <контейнер>

Устанавливаем пароль root для обоих контейнеров:

# prlctl exec <контейнер> passwd

Подключаемся к серверу по SSH:

# ssh <IP-адрес>

По сути, на данный момент у тебя уже есть два полноценных сервера, которые осталось только настроить.

Рис. 3. Запуск виртуального сервера, изменение пароля root и подключение по SSH
Рис. 3. Запуск виртуального сервера, изменение пароля root и подключение по SSH
 

Настройка сети

Прежде чем приступить к настройке серверов, нужно настроить сетку, иначе в виртуальном сервере yum работать не будет и софт ты все равно не установишь. На данный момент мы установили только доменные имена и IP-адреса виртуальных узлов. Но этого мало. Нужно настроить NAT, разрешить доступ к виртуальным серверам извне и настроить DNS.

Начнем с настройки NAT. В Virtuozzo Linux пакет iptables-services установлен по умолчанию, а IPv4-форвардинг включен (в файле cat /proc/sys/net/ipv4/ip_forward есть единичка), поэтому никакие подготовительные действия не понадобятся: сразу приступаем к настройке правил iptables. Для NAT определенного контейнера используется команда

# iptables -t nat -A POSTROUTING -s src_net -o if -j SNAT --to ip_address

Здесь вместо src_net нужно указать IP-адрес подсетки контейнера, вместо if — интерфейс, а вместо ip_address — внешний IP-адрес твоего аппаратного узла. Но можно сделать проще и ввести команду

# iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE

 

Ошибка?

Если система будет ругаться на отсутствие таблицы NAT, не обращай внимания. Видимо, есть какой-то конфликт между версией iptables и ядра, разбираться не стал, но самое интересное, что правила работают :).

В этом случае все IP-адреса будут транслироваться SNAT. Именно эту команду я и ввел на рис. 4.

Рис. 4. Включение NAT. Установка сервера DNS для первого сервера
Рис. 4. Включение NAT. Установка сервера DNS для первого сервера

На радостях запускаем контейнер и… обнаруживаем, что пропинговать-то узел по IP мы можем, а вот DNS настроить забыли. Ничего, все это решается командой

# prlctl set <контейнер> --nameserver 8.8.8.8

Пока используем OpenDNS, ведь свой мы еще не настроили. Теперь нужно убедиться, что мы можем пропинговать узел по его имени:

# ping mail.ru
Рис. 5. Сетка на виртуальном сервере поднята и работает
Рис. 5. Сетка на виртуальном сервере поднята и работает

Вот, теперь все в порядке и можно приступить к установке софта. Только не забудь настроить доступ к виртуальным серверам извне, иначе никто не сможет к ним достучаться:

# iptables -t nat -A PREROUTING -p tcp -d ip_address --dport port_num \
  -i ens33 -j DNAT --to-destination ve_address:dst_port_num

Здесь ve_address — это IP-адрес контейнера, dst_port — TCP-порт, ip_address — внешний (публичный) IP-адрес твоего узла, а port_num — TCP-порт аппаратного узла, который будет использоваться для интернет-соединений к приватным контейнерам. Обрати внимание, что данное правило сделает сервис, который раньше висел на порту с заданным номером (port_num), недоступным. Также обрати внимание, что трансляция SNAT, которую мы делали раньше, тоже необходима.

Если ты хочешь, чтобы порт 80 был доступен на аппаратном узле, а доступ к виртуальным серверам реализован через порт 8080, используй такие правила:

# iptables -t nat -A PREROUTING -p tcp -d ip_address --dport 8080 \
  -i eth0 -j DNAT --to-destination ve_address:80
# iptables -t nat -A POSTROUTING -s ve_address -o eth0 -j SNAT --to ip_address

Тогда «достучаться» до виртуальных серверов можно будет так: http://ip_address:8080/.

Осталось только сохранить правила iptables:

# service iptables save
# service iptables restart

Теперь у наших виртуальных серверов есть доступ к интернету, они могут пропинговать друг друга и к ним можно обратиться извне (рис. 6, 7). По сути, они мало чем отличаются от обычных интернет-серверов.

Рис. 6. Пинг с сервера second (адрес *102) сервера first (адрес *101)
Рис. 6. Пинг с сервера second (адрес *102) сервера first (адрес *101)
Рис. 7. Заходим извне (прямое обращение по IP-адресу) на сервер first (адрес *101)
Рис. 7. Заходим извне (прямое обращение по IP-адресу) на сервер first (адрес *101)

Продолжение статьи доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все статьи на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта, включая эту статью. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Вариант 2. Купи одну статью

Заинтересовала статья, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для статей, опубликованных более двух месяцев назад.


3 комментария

Подпишитесь на ][, чтобы участвовать в обсуждении

Обсуждение этой статьи доступно только нашим подписчикам. Вы можете войти в свой аккаунт или зарегистрироваться и оплатить подписку, чтобы свободно участвовать в обсуждении.

Check Also

Как работает Linux: от нажатия кнопки включения до рабочего стола

Лучший способ понять, как работает операционная система, — это проследить поэтапно ее загр…