Серверы · 9 min read · Sep 10, 2025

Идеальный балансированный и высокодоступный веб-кластер с 2 серверами, работающими под Xen на Ubuntu 8.04 Hardy Heron

Идеальный балансированный и высокодоступный веб-кластер с 2 серверами, работающими под Xen на Ubuntu 8.04 Hardy Heron

Введение

Это копия с моего сайта: blogama.org

В этом руководстве мы создадим балансированный и высокодоступный веб-кластер на 2 реальных серверах с Xen, heartbeat и ldirectord. Кластер будет выполнять http, почту, DNS, базу данных MySQL и будет полностью мониториться. В настоящее время это используется на производственном сервере с парой веб-сайтов.

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

Большинство информации, которую вы найдете здесь, было скопировано/вставлено из десятка руководств, многие из них с howtoforge.com, но некоторые важные детали были изменены, чтобы это стало возможным и чтобы все собрать вместе.

Вот краткий список услуг и приложений, которые будут установлены:

  • Apache
  • MySQL + phpmyadmin
  • Postfix (SMTP) с веб-конфигурацией пользователей и Spamassassin
  • Courier (IMAP и POP) и squirrelmail
  • Bind (DNS сервер)
  • Munin и monit для веб-мониторинга
  • Самодельные скрипты для мониторинга

Что вам нужно

2 сервера с двойным LAN, как минимум 7 IP-адресов. IP-адреса будут использоваться следующим образом:

  • dom01.example.com : 192.168.1.100
  • dom02.example.com : 192.168.1.101
  • lb1.example.com : 192.168.1.102
  • lb2.example.com : 192.168.1.103
  • web1.example.com : 192.168.1.104
  • web2.example.com : 192.168.1.105
  • example.com : 192.168.1.106
  • yousite.com (по желанию) : 192.168.1.107

Dom0 будет отделен от балансировщиков нагрузки и веб-серверов. Я не пробовал это, но я верю, что было бы возможно разместить балансировщики нагрузки на Dom0.

Я предлагаю как минимум 2 ГБ оперативной памяти и жесткие диски RAID 1 или 10 для производственного сервера.

Ограничения

  1. Это сработало для меня. Это не значит, что это сработает для вас, но будьте уверены, что руководство на 100% протестировано на производственном и тестовом сервере!

  2. Эта настройка масштабируема на 2 серверах, но вам нужно будет найти другой способ для репликации MySQL, если вы это сделаете.

  3. Нет панели управления, такой как ISPConfig, CPanel и т. д.

  4. Некоторые веб-сайты могут сломать репликацию MySQL Master to Master. Это случилось со мной с Drupal, но я исправил это, либо отключив кэш, либо установив минимальное время жизни кэша. Пожалуйста, прочитайте это, прежде чем продолжить:

A: Репликация MySQL в настоящее время не поддерживает никакой протокол блокировки между мастером и слейвом для гарантии атомарности распределенного (межсерверного) обновления. Другими словами, возможно, что клиент A делает обновление на со-мастере 1, и в это время, прежде чем оно распространится на со-мастера 2, клиент B может сделать обновление на со-мастере 2, которое делает обновление клиента A работать иначе, чем это было на со-мастере 1. Таким образом, когда обновление клиента A достигает со-мастера 2, оно производит таблицы, которые отличаются от того, что у вас есть на со-мастере 1, даже после того, как все обновления со-мастера 2 также распространились. Это означает, что вы не должны связывать два сервера вместе в двусторонней репликационной связи, если вы не уверены, что ваши обновления могут безопасно происходить в любом порядке, или если вы не позаботитесь о неправильно упорядоченных обновлениях каким-либо образом в коде клиента.

1. Установка Ubuntu

Выполните базовую установку Ubuntu 8.04 LTS серверной версии.

Если вы хотите установить с программным RAID 1, пожалуйста, прочитайте это руководство, которое я написал:

Установка Ubuntu 8.04 с программным RAID 1

2. Установка Xen

Вы можете запускать Xen из образов файлов или из выделенного раздела. У обоих есть свои плюсы и минусы.

С образами файлов ввод-вывод диска медленнее, но проще делать резервные копии и управлять ими. Все наоборот, когда вы работаете на разделе.

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

Чтобы установить на образах файлов, пожалуйста, обратитесь к этому отличному учебнику от мастера howto Фалко:

Установка Xen на сервер Ubuntu 8.04 (Hardy Heron) из репозиториев Ubuntu

Чтобы установить непосредственно на раздел (моя модифицированная версия руководства Фалко):

Высокопроизводительный XEN на серверной системе Ubuntu Hardy Heron (8.04) AMD64 или i386

Вам нужно сделать 2 домена Xen на каждом сервере (dom01 и dom02 являются Dom0 или контроллером ВМ):

сервер #1 - dom01.example.com

lb1.example.com (256MB RAM - 5GB HD достаточно)
ip : 192.168.1.102

web1.example.com

(чем больше RAM, тем лучше, оставьте 512MB для Dom0)

ip : 192.168.1.104

сервер #2 - dom02.example.com

lb2.example.com (256MB RAM - 5GB HD достаточно)
ip : 192.168.1.103

web2.example.com (чем больше RAM, тем лучше, оставьте 512MB для Dom0)
ip : 192.168.1.105

3. Создание мостов Xen для локальных передач данных (по желанию)

По умолчанию только одна сетевая карта включена на виртуальной машине с Xen. Для локальной передачи, такой как rsync, репликация MySQL и резервные копии, я использую гигабитный кроссоверный кабель между 2 серверами. Это не обязательно, но это сэкономит затраты на пропускную способность, и репликация будет быстрее.

Пожалуйста, обратитесь к этому руководству, чтобы создать мост Xen:

Создание новых мостов Xen на Ubuntu 8.04

В этом руководстве IP, используемый на второй сетевой карте (кроссовер), будет следующим:

  • dom01.example.com : 192.168.0.100
  • dom02.example.com : 192.168.0.101
  • lb1.example.com : 192.168.0.102
  • lb2.example.com : 192.168.0.103
  • web1.example.com : 192.168.0.104
  • web2.example.com : 192.168.0.105

4. Подготовка узлов (dom01, dom02, lb1, lb2, web1, web2)

4.1 Установка openssh сервера и VIM

Запустите:

sudo su apt-get install vim ssh openssh-server

4.2 Обновление репозиториев

mv /etc/apt/sources.list /etc/apt/sources.list.bak
vi /etc/apt/sources.list

Сделайте sources.list выглядеть так:

#
# deb cdrom:[Ubuntu-Server 8.04 _Hardy Heron_ - Release i386 (20080423.2)]/ hardy main restricted
#deb cdrom:[Ubuntu-Server 8.04 _Hardy Heron_ - Release i386 (20080423.2)]/ hardy main restricted
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://de.archive.ubuntu.com/ubuntu/ hardy main restricted
deb-src http://de.archive.ubuntu.com/ubuntu/ hardy main restricted
## Major bug fix updates produced after the final release of the
## distribution.
deb http://de.archive.ubuntu.com/ubuntu/ hardy-updates main restricted
deb-src http://de.archive.ubuntu.com/ubuntu/ hardy-updates main restricted
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## universe WILL NOT receive any review or updates from the Ubuntu security
## team.
deb http://de.archive.ubuntu.com/ubuntu/ hardy universe
deb-src http://de.archive.ubuntu.com/ubuntu/ hardy universe
deb http://de.archive.ubuntu.com/ubuntu/ hardy-updates universe
deb-src http://de.archive.ubuntu.com/ubuntu/ hardy-updates universe
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb http://de.archive.ubuntu.com/ubuntu/ hardy multiverse
deb-src http://de.archive.ubuntu.com/ubuntu/ hardy multiverse
deb http://de.archive.ubuntu.com/ubuntu/ hardy-updates multiverse
deb-src http://de.archive.ubuntu.com/ubuntu/ hardy-updates multiverse
## Uncomment the following two lines to add software from the 'backports'
## repository.
## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
# deb http://de.archive.ubuntu.com/ubuntu/ hardy-backports main restricted universe multiverse
# deb-src http://de.archive.ubuntu.com/ubuntu/ hardy-backports main restricted universe multiverse
## Uncomment the following two lines to add software from Canonical's
## 'partner' repository. This software is not part of Ubuntu, but is
## offered by Canonical and the respective vendors as a service to Ubuntu
## users.
# deb http://archive.canonical.com/ubuntu hardy partner
# deb-src http://archive.canonical.com/ubuntu hardy partner
deb http://security.ubuntu.com/ubuntu hardy-security main restricted
deb-src http://security.ubuntu.com/ubuntu hardy-security main restricted
deb http://security.ubuntu.com/ubuntu hardy-security universe
deb-src http://security.ubuntu.com/ubuntu hardy-security universe
deb http://security.ubuntu.com/ubuntu hardy-security multiverse
deb-src http://security.ubuntu.com/ubuntu hardy-security multiverse

Теперь выполните:

apt-get update
apt-get upgrade

4.3 Модификации

/bin/sh является символической ссылкой на /bin/dash, однако нам нужен /bin/bash, а не /bin/dash. Поэтому мы делаем следующее:

ln -sf /bin/bash /bin/sh

Мы отключим AppArmor (на dom01 и dom02), сделав следующее:

/etc/init.d/apparmor stop
update-rc.d -f apparmor remove

5. Конфигурация сети (dom01, dom02, lb1, lb2, web1, web2)

5.1 Настройка IP-адресов

Чтобы отредактировать конфигурацию сети в Ubuntu, выполните:

vi /etc/network/interfaces

Теперь мы сделаем каждую конфигурацию сети по очереди. Я предполагаю, что вы используете 2 сетевые карты, eth0 - это та, которая подключена к интернету, а eth1 - та, которая с кроссоверным кабелем. Я не буду писать конфигурационный файл индивидуально, только для dom01.example.com, пожалуйста, измените соответственно этот список:

dom01.example.com

eth0 : 192.168.1.100
eth1 : 192.168.0.100

dom02.example.com

eth0 : 192.168.1.101
eth1 : 192.168.0.101

lb1.example.com

eth0 : 192.168.1.102
eth1 : 192.168.0.102

lb2.example.com

eth0 : 192.168.1.103
eth1 : 192.168.0.103

web1.example.com

eth0 : 192.168.1.104
eth1 : 192.168.0.104

web2.example.com

eth0 : 192.168.1.105
eth1 : 192.168.0.105

Пример конфигурации сети dom01.example.com:

Сделайте файл /etc/network/interfaces выглядеть так:

# Этот файл описывает сетевые интерфейсы, доступные на вашей системе
# и как их активировать. Для получения дополнительной информации смотрите interfaces(5).
# Циклический сетевой интерфейс
auto lo
iface lo inet loopback
# Основной сетевой интерфейс, подключенный к интернету
auto eth0
iface eth0 inet static
        address 192.168.1.100
        netmask 255.255.255.0
        network 192.168.1.0
        broadcast 192.168.1.255
        gateway 192.168.1.1
# Вторичный сетевой интерфейс, подключенный к кроссоверному кабелю на другом сервере
auto eth1
iface eth1 inet static
        address 192.168.0.100
        netmask 255.255.255.0
        network 192.168.0.0
        broadcast 192.168.0.255

Теперь сохраните файл и выполните:

/etc/init.d/networking restart

5.2 Имя хоста

vi /etc/hosts

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

dom01.example.com

127.0.0.1       localhost.localdomain   localhost
127.0.1.1       dom01.example.com dom01
192.168.1.101   dom02.example.com     dom02
192.168.1.102   lb1.example.com     lb1
192.168.1.103   lb2.example.com     lb2
192.168.1.104   web1.example.com     web1
192.168.1.105   web2.example.com     web2
# Следующие строки желательны для хостов, поддерживающих IPv6
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

echo dom01.example.com > /etc/hostname
/etc/init.d/hostname.sh start

dom02.example.com

127.0.0.1       localhost.localdomain   localhost
127.0.1.1       dom02.example.com dom02
192.168.1.100   dom01.example.com     dom01
192.168.1.102   lb1.example.com     lb1
192.168.1.103   lb2.example.com     lb2
192.168.1.104   web1.example.com     web1
192.168.1.105   web2.example.com     web2
# Следующие строки желательны для хостов, поддерживающих IPv6
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

echo dom02.example.com > /etc/hostname
/etc/init.d/hostname.sh start

lb1.example.com

127.0.0.1       localhost.localdomain   localhost
127.0.1.1       lb1.example.com lb1
192.168.1.100   dom01.example.com     dom01
192.168.1.101   dom02.example.com     dom02
192.168.1.103   lb2.example.com     lb2
192.168.1.104   web1.example.com     web1
192.168.1.105   web2.example.com     web2
# Следующие строки желательны для хостов, поддерживающих IPv6
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

echo lb1.example.com > /etc/hostname
/etc/init.d/hostname.sh start

lb2.example.com

127.0.0.1       localhost.localdomain   localhost
127.0.1.1       lb2.example.com lb2
192.168.1.100   dom01.example.com     dom01
192.168.1.101   dom02.example.com     dom02
192.168.1.102   lb1.example.com     lb1
192.168.1.104   web1.example.com     web1
192.168.1.105   web2.example.com     web2
# Следующие строки желательны для хостов, поддерживающих IPv6
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

echo lb2.example.com > /etc/hostname
/etc/init.d/hostname.sh start

web1.example.com

127.0.0.1       localhost.localdomain   localhost
127.0.1.1       web1.example.com web1
192.168.1.100   dom01.example.com     dom01
192.168.1.101   dom02.example.com     dom02
192.168.1.102   lb1.example.com     lb1
192.168.1.103   lb2.example.com     lb2
192.168.1.105   web2.example.com     web2
# Следующие строки желательны для хостов, поддерживающих IPv6
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

echo web1.example.com > /etc/hostname
/etc/init.d/hostname.sh start

web2.example.com

127.0.0.1       localhost.localdomain   localhost
127.0.1.1       web2.example.com web2
192.168.1.100   dom01.example.com     dom01
192.168.1.101   dom02.example.com     dom02
192.168.1.102   lb1.example.com     lb1
192.168.1.103   lb2.example.com     lb2
192.168.1.104   web1.example.com     web1
# Следующие строки желательны для хостов, поддерживающих IPv6
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

echo web2.example.com > /etc/hostname
/etc/init.d/hostname.sh start

6. Установка программного обеспечения (dom01, dom02, lb1, lb2, web1, web2)

Запустите:

apt-get install binutils cpp fetchmail flex gcc libarchive-zip-perl libc6-dev libcompress-zlib-perl libdb4.3-dev libpcre3 libpopt-dev lynx m4 make ncftp nmap openssl perl perl-modules unzip zip zlib1g-dev autoconf automake1.9 libtool bison autotools-dev g++ build-essential

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.