19 дек 2016

Построение отказоустойчивого web-сервиса. Пошаговое руководство

19.12.2016

Построение отказоустойчивого web-сервиса. Пошаговое руководство

Перед нами стоит задача: построить отказоустойчивый 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.


Инструкция по построению отказоустойчивой системы

  1. Устанавливаем ucarp на обоих серверах.
  2. apt-get install ucarp




  3. Редактируем файл /etc/network/interfaces.



  4. Добавляем строчки:

    iface eth0:ucarp:0 inet static
    address 10.254.2.23
    netmask 255.255.255.0.



    Тем самым мы указали, что будет еще дополнительный (виртуальный) интерфейс с плавающим ip адресом 10.254.2.23. Сохраняем.


  5. Для второго сервера действуем по аналогии:
  6.   


  7. Правка файлов 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

    chmod +x /usr/share/ucarp/vip-up.sh
    chmod +x /usr/share/ucarp/vip-down.sh

    vip-up.sh – отвечает за поднятие интерфейса.
    vip-down.sh – отвечает за выключение интерфейса. 






  8. Редактируем строку /sbin/ifup $1:ucarp , приводим к виду $1:ucarp:0 . Это необходимо для того, чтобы указать, что первый виртуальный интерфейс будет нулевым (это как?). В более общем случае можно создать более, чем 2 виртуальных интерфейса.







    Редактируем строку /sbin/ifdown $1:ucarp , приводим к виду $1:ucarp:0:




    Чтобы скрипт запускался при загрузке, необходимо прописать его в файле /etc/rc.local до строчки exit 0. Если данный файл отсутствует, создайте его и вставьте в него следующее содержимое:



    Добавляем строчку ucarp -i eth0 -s 10.254.2.21 -v 10 -p secret -a 10.254.2.23 --upscript=/usr/share/ucarp/vip-up.sh --downscript=/usr/share/ucarp/vip-down.sh -P -B.



    Разберем подробно добавляемую строку:
    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 – запускать как демон.

  9. Для второго сервера – все аналогично.

    ucarp -i eth0 -s 10.254.2.22 -v 10 -p secret -a 10.254.2.23 --upscript=/usr/share/ucarp/vip-up.sh --downscript=/usr/share/ucarp/vip-down.sh -B




     Осуществляем перезагрузку.


    В консоли видим следующий результат:




Выводы


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

Следите за дальнейшими публикациями в нашем Блоге.


Возврат к списку

comments powered by Disqus
top