uCarp, на мой взгляд, лучшее решение для создания простейших отказоустойчивых кластеров на Ubuntu, проверенное уже много раз во многих организациях при промышленной эксплуатации систем. Отлично подходит для серверов приложений и других задач, где нет совсем или минимальны изменения данных на серверах.
Идея проста — при выходе из строя одного сервера (сервера целиком, а не каких-то определенных сервисов на нем!), все обращения автоматически перенаправляются к другому.
Для этого создается виртуальный кластер с определенным IP адресом — ucarp-vip, состоящий из двух или более одинаковых (в смысле софта) серверов, физических или виртуальных, каждый из которых имеет свой собственный IP. Клиентские машины обращаются за сервисом по IP-адресу кластера (ucarp-vip), по которому откликается один из серверов. При выходе из строя этого сервера (завис, вырубилось питание, оборвалась связь — короче становится невидимым в сети) IP адресом кластера завладевает другой сервер. Никаких других функций в Ubuntu (типа балансировки нагрузки, репликации и т.п.) uCarp не выполняет. Для репликации совместно с ucarp спользуются другие пакеты — я, например, использую Glasterfs или Unison в зависимости от конкретных задач.
Для примера, пусть будет кластер с IP-адресом 192.168.5.10, состоящий из двух серверов:
node1 - 192.168.5.20 node2 - 192.168.5.21
Устанавливается ucarp из стандартного репозитория Ubuntu на всех серверах кластера:
sudo apt-get install ucarp
Настройки на каждом сервере осуществляются непосредственно в файле /etc/network/interfaces. Для node1 в нем прописываем:
auto eth0 iface eth0 inet static address 192.168.5.20 netmask 255.255.255.0 gateway 192.168.2.1
#ID виртуального кластера ucarp-vid 1 #IP-адрес вируального кластера ucarp-vip 192.168.5.10 #Пароль для шифрования трафика. Один для всех серверов кластера!!! ucarp-password ubuntu #Вес сервера в кластере ucarp-advskew 1 #Интервал апдейта в секундах ucarp-advbase 1 #Роль сервера. Роль мастера устанавливаем у одного, у остальных - no ucarp-master yes
iface eth0:ucarp inet static address 192.168.5.10 netmask 255.255.255.0
Для node2:
auto eth0 iface eth0 inet static address 192.168.5.21 netmask 255.255.255.0 gateway 192.168.2.1
#ID виртуального кластера ucarp-vid 1 #IP-адрес вируального кластера ucarp-vip 192.168.5.10 #Пароль для шифрования трафика. Один для всех серверов кластера!!! ucarp-password ubuntu #Вес сервера в кластере ucarp-advskew 10 #Интервал апдейта в секундах ucarp-advbase 1 #Роль сервера. Роль мастера устанавливаем у одного, у остальных - no ucarp-master no
iface eth0:ucarp inet static address 192.168.5.10 netmask 255.255.255.0
Далее нужно перегрузить сервера и кластер по адресу 192.168.2.10 заработает. Можно выключить любой из серверов кластера, но адрес кластера и сервисы всегда будут доступны. Серверов в кластере может быть несколько, тогда при выходе из строя мастера, происходят выборы «боевого сервера» по критериям:
- Мастер — высший приоритет
- advbase + advskew/255 — чем меньше, тем приоритет выше
- IP — чем меньше, тем приоритет выше
В одной сети может быть несколько кластеров, нужно только следить, чтобы ID виртуальных кластеров (ucarp-vid) различались.