Построение отказоустойчивого web-сервиса. Пошаговое руководство
19.12.2016
Перед нами стоит задача: построить отказоустойчивый web-сервис с минимальными затратами. Для решения поставленной задачи предлагается достаточно много вариантов реализации. У каждой из реализаций присутствует ряд проблем или скрытых моментов, о которых авторы не упоминали.
В итоге решение было найдено достаточно простое и красивое. Не берем в расчет руководства, основывающиеся на ручном переключении сетевых кабелей и подобные им.
Для построения полноценного отказоустойчивого решения мы использовали два виртуальных сервера с ОС Ubuntu 16.04 server и параметрами: 1CPU, 512 ОЗУ,10Гб HDD. Параметры сети для каждого из серверов test1:10.254.2.21, test2:10.254.2.22, где ip адрес 10.254.2.23 будет перемещаться с одного сервера на другой, на случай, если один из серверов какое-то время будет недоступен.
Для решения данной задачи был выбран протокол отказоустойчивой маршрутизации Ucarp. Ucarp может использоваться для организации кластеров маршрутизации в различных Unix-системах, в том числе в Linux.
Тем самым мы указали, что будет еще дополнительный (виртуальный) интерфейс с плавающим ip адресом 10.254.2.23. Сохраняем.
Для второго сервера действуем по аналогии:
Правка файлов vip-up, vip-down (для первого сервера).
Во время установки у нас появляются 2-а файла: vip-up, vip-down в директории /usr/share/ucarp/, на базе которых будем выполнять дальнейшую настройку. На обоих серверах файлы /usr/share/ucarp/vip-up и /usr/share/ucarp/vip-down делаем исполняемыми: mv /usr/share/ucarp/vip-up /usr/share/ucarp/vip-up.sh mv /usr/share/ucarp/vip-down /usr/share/ucarp/vip-down.sh
vip-up.sh – отвечает за поднятие интерфейса. vip-down.sh – отвечает за выключение интерфейса.
Редактируем строку /sbin/ifup $1:ucarp , приводим к виду $1:ucarp:0 . Это необходимо для того, чтобы указать, что первый виртуальный интерфейс будет нулевым (это как?). В более общем случае можно создать более, чем 2 виртуальных интерфейса.
Редактируем строку /sbin/ifdown $1:ucarp , приводим к виду $1:ucarp:0:
Чтобы скрипт запускался при загрузке, необходимо прописать его в файле /etc/rc.local до строчки exit 0. Если данный файл отсутствует, создайте его и вставьте в него следующее содержимое:
Разберем подробно добавляемую строку: ucarp – команда для обращения к протоколу. -i – интерфейс (к какому интерфейсу идет привязка). eth0 – наш сетевой интерфейс. -s – реальный ip адрес на сетевом интерфейсе eth0. 10.254.2.21 – ip адрес на сетевом интерфейсе eth0. -v – виртуальный ip идентификатор, который может быть в диапазоне от 1 до 255, в нашем случае мы выбрали 10. -p – пароль который используется для авторизации, в нашем случае это «secret». -a – виртуальный шаред ip адрес (плавающий ip), в нашем случае это 10.254.2.23. --upscript=/usr/share/ucarp/vip-up.sh – указатель для скрипта, который будет поднимать шаред ip адрес и путь к скрипту. --downscript=/usr/share/ucarp/vip-down.sh – указатель для скрипта, который будет выключать шаред ip адрес и путь к скрипту. -P – означает первичный(master), без указания по умолчанию вторичный(slave) -B – запускать как демон.
В результате мы получили два сервера с отказоустойчивым ip-адресом. При выходе из строя любого из серверов downtime переключения ip будет равен 0. Решение данной задачи, как показала практика, не трудоемкое и требует минимальных облачных ресурсов.
Следите за дальнейшими публикациями в нашем Блоге.