1.8. Виртуальный сервер Linux

Виртуальный сервер Linux (LVS, Linux Virtual Server) представляет собой комплект программных компонентов, целью которых является обеспечение баланса загрузки IP между набором настоящих серверов. LVS выполняется на паре аналогично настроенных компьютеров, один из которых исполняет функции активного маршрутизатора LVS, а второй -- резервного маршрутизатора. Назначение активного маршрутизатора LVS:
  • Обеспечивать баланс загрузки между настоящими серверами.
  • Выполнять проверку целостности служб на каждом реальном сервере.
Резервный маршрутизатор LVS следит за работой активного маршрутизатора, в случае сбоя которого управление будет передано резервному.
Рисунок 1.19, «Components of a Running LVS Cluster» provides an overview of the LVS components and their interrelationship.
Components of a Running LVS Cluster

Рисунок 1.19. Components of a Running LVS Cluster

На обоих компьютерах выполняется демон pulse. На резервном маршрутизаторе LVS pulse отправляет тактовый импульс общему интерфейсу активного маршрутизатора, чтобы проверить корректность его работы. На активном маршрутизаторе pulse запустит демон lvs и ответит на полученные от резервного маршрутизатора LVS запросы тактового импульса.
Сначала демон lvs вызывает утилиту ipvsadm для выполнения конфигурации и обеспечения поддержки работы таблицы маршрутизации сервера IPVS (IP Virtual Server) в ядре, а также на каждом реальном сервере запускает процесс nanny для каждого настроенного виртуального сервера. Процесс nanny проверяет состояние одной службы для каждого настоящего сервера и сообщает демону lvs о неполадках. Если обнаружены проблемы, lvs укажет ipvsadm удалить соответствующий настоящий сервер из таблицы маршрутизации IPVS.
Если резервный маршрутизатор LVS не получил ответ от активного маршрутизатора, активируется send_arp, что позволит переназначить все виртуальные адреса IP аппаратным адресам NIC (MAC) резервного маршрутизатора LVS. Затем активному маршрутизатору будет направлена команда завершения работы демона lvs и через общий, и через частный сетевые интерфейсы, а на резервном маршрутизаторе будет запущен демон lvs, для того чтобы получать запросы от настроенных виртуальных серверов.
Пользователь, пытающийся получить доступ к службе (например, к сайту или приложению) извне, видит LVS как один сервер, хотя на самом деле обращение осуществляется к настоящим серверам, скрытым за маршрутизаторами LVS.
Поскольку LVS не обладает встроенными компонентами для разделения данных между реальными серверами, можно выбрать один из следующих вариантов:
  • Синхронизировать данные между серверами.
  • Добавить третий слой топологии для доступа к разделяемым данным.
Первый вариант предпочтителен для серверов, которые не допускают закачку или изменение данных на реальных серверах большим числом пользователей. Если же сервер разрешает большому числу пользователей изменять данные (актуально для сайтов электронной коммерции, например), то рекомендуется добавить дополнительный слой.
Существует множество методов синхронизации данных между серверами. Например, с помощью сценариев оболочки можно одновременно публиковать обновленные веб-страницы на настоящих серверах. Также можно использовать такие программы как rsync для периодической синхронизации измененных данных на всех серверах. Но в окружениях, где пользователи часто закачивают файлы на сервер или обращаются к базе данных, вместо rsync или сценариев оболочки для синхронизации данных больше подходит применение трехуровневой топологии.

1.8.1. Two-Tier LVS Topology

Рисунок 1.20, «Two-Tier LVS Topology» shows a simple LVS configuration consisting of two tiers: LVS routers and real servers. The LVS-router tier consists of one active LVS router and one backup LVS router. The real-server tier consists of real servers connected to the private network. Each LVS router has two network interfaces: one connected to a public network (Internet) and one connected to a private network. A network interface connected to each network allows the LVS routers to regulate traffic between clients on the public network and the real servers on the private network. In Рисунок 1.20, «Two-Tier LVS Topology», the active LVS router uses Network Address Translation (NAT) to direct traffic from the public network to real servers on the private network, which in turn provide services as requested. The real servers pass all public traffic through the active LVS router. From the perspective of clients on the public network, the LVS router appears as one entity.
Two-Tier LVS Topology

Рисунок 1.20. Two-Tier LVS Topology

Запросы служб, поступающие на маршрутизатор LVS, предназначаются виртуальному IP-адресу, который представляет собой общедоступный адрес, назначенный администратором полностью квалифицированному имени домена (в формате www.example.com). Этот адрес также соответствует одному или нескольким виртуальным серверам[1] Обратите внимание, что виртуальный адрес IP мигрирует с одного маршрутизатора LVS на другой в случае восстановления после отказа, тем самым обеспечивая доступность этого IP-адреса (его также называют «плавающий IP-адрес»).
Виртуальные IP-адреса могут быть обозначены в соответствии с именем устройства, соединяющего маршрутизатор LVS c общей сетью. Например, если к Интернету подключается eth0, то виртуальные серверы можно обозначить как eth0:1. Или же каждый виртуальный сервер может быть сопоставлен отдельному устройству для каждой службы. К примеру, обработка HTTP-трафика будет осуществляться на eth0:1, а FTP-трафика -- на eth0:2.
В определенный момент времени может быть активен только один маршрутизатор LVS. Роль активного маршрутизатора -- перенаправление запросов службы с виртуальных IP-адресов настоящим серверам, в основу которого положен один из восьми алгоритмов распределения загрузки:
  • Последовательный (RR, Round-Robin): распределяет каждый запрос последовательно между серверами в предопределенном наборе. В этом случае предпочтение не отдается никаким серверам, независимо от их емкости или загрузки.
  • Последовательный с коэффициентом (WRR, Weighted Round-Robin): распределяет каждый запрос последовательно между серверами в предопределенном наборе, но назначает серверам с большей емкостью больше задач. Емкость определяется заданным пользователем коэффициентом, который изменяется в зависимости от информации о загрузке. Такой метод является предпочтительным, если емкости серверов значительно отличаются. Но если загрузка запросов сильно изменяется, сервер с бóльшим коэффициентом может обработать большее число запросов.
  • Минимальное число соединений: распределяет больше запросов между серверами с меньшим числом активных соединений. Такой алгоритм динамического распределения предпочтителен в случаях, когда загрузка запросов значительно изменяется, и лучше всего подходит для набора реальных серверов, в котором все сервера обладают приблизительно одинаковой емкостью. Если же их емкость отличается, можно использовать следующий алгоритм.
  • Минимальное число соединений с коэффициентом (используется по умолчанию): распределяет больше запросов между серверами с меньшим числом активных соединений, которые зависят от емкости, которой соответствует определенный пользователем коэффициент. Коэффициент изменяется в зависимости от информации загрузки. Добавление коэффициента делает этот алгоритм идеальным выбором, если набор настоящих серверов содержит оборудование с различной емкостью.
  • Минимальное число соединений в зависимости от расположения: распределяет больше запросов между серверами с меньшим числом активных соединений, которые зависят от целевого IP-адреса. Такой алгоритм используется для кластеров сервера прокси-кэша. При этом пакеты, предназначенные IP-адресу на сервере, направляются этому серверу, если только емкость сервера не превышена, а загрузка сервера не достигла половины, в случае чего IP-адрес будет присвоен наименее загруженному настоящему серверу.
  • Минимальное число соединений в зависимости от расположения с дублированием: распределяет больше запросов между серверами с меньшим числом активных соединений, которые зависят от целевого IP-адреса. Такой алгоритм используется для кластеров сервера прокси-кэша. Он отличается от предыдущего алгоритма тем, что целевой IP-адрес сопоставляется набору настоящих серверов. Затем запросы направляются тому серверу, которому соответствует наименьшее число соединений. Если же емкость всех узлов для заданного IP-адреса превышена, будет выполнено дублирование нового сервера путем добавления настоящего сервера с минимальным числом подключений из общего набора в подмножество серверов для целевого IP-адреса. Максимально загруженный узел будет исключен из набора, что позволит избежать излишнего дублирования.
  • Хеш источника: распределяет запросы между реальными серверами в наборе, определяя IP-адрес источника из статической таблицы хеша. Этот алгоритм обычно применяется для маршрутизаторов LVS c несколькими межсетевыми экранами.
Активный маршрутизатор LVS динамически наблюдает за общим состоянием определенных устройств настоящих серверов с помощью сценариев send/expect. Также можно использовать внешние исполняемые компоненты для отслеживания состояния служб, работающих с динамическими данными (HTTPS, SSL). Если функциональность службы на сервере нарушена, активный маршрутизатор LVS прекратит отправку заданий до тех пор, пока сервер не начнет функционировать нормально.
Резервный маршрутизатор LVS исполняет роль системы, находящейся в режиме ожидания. Периодически маршрутизаторы обмениваются тактовыми импульсами через общий интерфейс или, в случае сбоя, через частный. Если по какой-то причине резервный маршрутизатор LVS не получил сообщение тактового импульса в течение ожидаемого времени, он начнет исполнять роль активного маршрутизатора. При этом виртуальные адреса будут обслуживаться посредством ARP-спуфинга. В этом случае резервный маршрутизатор LVS объявляет себя целевым назначением для всех IP-пакетов, предназначенных неисправному узлу. При восстановлении нормальной работы проблемного узла резервный маршрутизатор LVS возвращается в исходное состояние.
The simple, two-tier configuration in Рисунок 1.20, «Two-Tier LVS Topology» is suited best for clusters serving data that does not change very frequently — such as static web pages — because the individual real servers do not automatically synchronize data among themselves.


[1] Виртуальный сервер -- служба, настроенная на прослушивание заданного виртуального IP.