Отказоустойчивый веб-сайт с DNS-балансировкой нагрузки

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

Чтобы настроить отказоустойчивый веб-сайт с DNS-балансировкой нагрузки:

Подготовка к работе

Перед тем, как создавать виртуальные машины:

  1. Перейдите в консоль управления Яндекс.Облака и выберите каталог, в котором будете выполнять операции.
  2. Убедитесь, что в выбранном каталоге есть сеть с подсетями в зонах доступности ru-cental1-a и ru-central1-b. Для этого на странице каталога нажмите плитку Yandex Virtual Private Cloud. Если в списке есть сеть — нажмите на нее, чтобы увидеть список подсетей. Если нужных подсетей или сети нет, создайте их.

Создать виртуальные машины с предустановленным веб-сервером

Последовательно создайте две виртуальные машины по инструкции:

  1. На странице каталога нажмите кнопку Создать ресурс и выберите Виртуальная машина.

  2. В поле Имя введите имя виртуальной машины:

    • для первой машины — dns-lb-tutorial-web-ru-central1-a;
    • для второй машины — dns-lb-tutorial-web-ru-central1-b.
  3. Выберите зону доступности:

    • для первой машины — ru-central1-a;
    • для второй машины — ru-central1-b.
  4. Выберите один публичный образ для обеих виртуальных машин:

    • LEMP для Linux, nginx, MySQL, PHP;
    • LAMP для Linux, Apache, MySQL, PHP.
  5. В блоке Вычислительные ресурсы выберите тип использования ядра (частичное или полное), укажите необходимое количество vCPU и объем RAM. Характеристики обеих виртуальных машин должны совпадать.

    Для функционального тестирования хватит минимальной конфигурации:

    • Гарантированная доля vCPU — 5%.
    • vCPU — 1.
    • RAM — 1 ГБ.
  6. В блоке Сетевые настройки выберите, к какой подсети необходимо подключить виртуальную машину при создании.

  7. Укажите данные для доступа на виртуальную машину:

    • В поле Логин введите имя пользователя.
    • В поле SSH ключ вставьте содержимое файла открытого ключа. Пару ключей для подключения по SSH необходимо создать самостоятельно. Для создания ключей используйте сторонние инструменты, например утилиты ssh-keygen в Linux и macOS или PuTTygen в Windows.
  8. Нажмите кнопку Создать ВМ.

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

При создании виртуальной машине назначаются IP-адрес и имя хоста (FQDN). Эти данные можно использовать для доступа по SSH.

См. также

Загрузить файлы веб-сайта

Для виртуальных машин dns-lb-tutorial-web-ru-central1-a и dns-lb-tutorial-web-ru-central1-b выполните:

  1. В блоке Сеть на странице виртуальной машины в консоли управления найдите публичный IP-адрес виртуальной машины.

  2. Подключитесь к виртуальной машине по протоколу SSH. Для этого можно использовать утилиту ssh в Linux и macOS и программу PuTTy для Windows.

    Рекомендуемый способ аутентификации при подключении по SSH — с помощью пары ключей. Не забудьте настроить использование созданной пары ключей: закрытый ключ должен соответствовать открытому ключу, переданному на виртуальную машину.

  3. Выдайте права на запись для вашего пользователя на директорию /var/www/html:

    $ sudo setfacl -m u:<имя вашего пользователя>:w /var/www/html
    
  4. Загрузите на виртуальную машину файлы веб-сайта с помощью протокола SCP.

    Используйте утилиту командной строки scp:

    $ scp -r <путь до директории с файлами> <имя вашего пользователя>@<IP адрес виртуальной машины>:/var/www/html
    

    С помощью программы WinSCP скопируйте локальную директорию с файлами в директорию /var/www/html на виртуальной машине.

Создать виртуальные машины для DNS-балансировщиков

Последовательно создайте две виртуальные машины по инструкции:

  1. На странице каталога нажмите кнопку Создать ресурс и выберите Виртуальная машина.

  2. В поле Имя введите имя виртуальной машины:

    • для первой машины — dns-lb-tutorial-slb-ru-central1-a;
    • для второй машины — dns-lb-tutorial-slb-ru-central1-b.
  3. Выберите зону доступности:

    • для первой машины — ru-central1-a;
    • для второй машины — ru-central1-b.
  4. Выберите публичный образ Ubuntu или CentOS. Поддерживаемые версии для Ubuntu: 16.04 или выше.

  5. В блоке Вычислительные ресурсы выберите тип использования ядра (частичное или полное), укажите необходимое количество vCPU и объем RAM. Характеристики обеих виртуальных машин должны совпадать.

    Для функционального тестирования хватит минимальной конфигурации:

    • Гарантированная доля vCPU — 5%.
    • vCPU — 1.
    • RAM — 1 ГБ.
  6. В блоке Сетевые настройки выберите, к какой подсети необходимо подключить виртуальную машину при создании.

  7. Укажите данные для доступа на виртуальную машину:

    • В поле Логин введите имя пользователя.
    • В поле SSH ключ вставьте содержимое файла открытого ключа. Пару ключей для подключения по SSH необходимо создать самостоятельно. Для создания ключей используйте сторонние инструменты, например утилиты ssh-keygen в Linux и macOS или PuTTygen в Windows.
  8. Нажмите кнопку Создать ВМ.

Создание виртуальной машины может занять несколько минут. Когда виртуальная машина перейдет в статус RUNNING, вы можете установить и настроить ПО DNS-балансировщика.

При создании виртуальной машине назначаются IP-адрес и имя хоста (FQDN). Эти данные можно использовать для доступа по SSH.

См. также

Установить и настроить ПО DNS-балансировщика

Для виртуальных машин dns-lb-tutorial-slb-ru-central1-a и dns-lb-tutorial-slb-ru-central1-b выполните:

  1. В блоке Сеть на странице виртуальной машины в консоли управления найдите публичный IP-адрес виртуальной машины.

  2. Подключитесь к виртуальной машине по протоколу SSH. Для этого можно использовать утилиту ssh в Linux и macOS и программу PuTTy для Windows.

    Рекомендуемый способ аутентификации при подключении по SSH — с помощью пары ключей. Не забудьте настроить использование созданной пары ключей: закрытый ключ должен соответствовать открытому ключу, переданному на виртуальную машину.

  3. Установите необходимые зависимости:

    $ sudo apt-get update
    $ sudo apt-get install pdns-server pdns-backend-remote memcached python3-yaml python3-memcache python3-pip
    
    $ sudo yum check-update
    $ sudo yum -y install epel-release
    $ sudo yum -y install pdns pdns-backend-remote memcached python34-yaml python34-setuptools git nano
    $ sudo service memcached start
    $ sudo chkconfig pdns on
    $ sudo chkconfig memcached on
    
  4. Установите polaris-gslb:

    $ git clone https://github.com/polaris-gslb/polaris-gslb.git
    $ cd polaris-gslb
    $ sudo python3 setup.py install
    
  5. Скопируйте файлы конфигурации для polaris-gslb

    $ sudo cp /opt/polaris/etc/pdns.conf.dist /etc/powerdns/pdns.conf
    $ cd /opt/polaris/etc
    $ sudo cp polaris-lb.yaml.dist polaris-lb.yaml
    $ sudo cp polaris-health.yaml.dist polaris-health.yaml
    $ sudo cp polaris-pdns.yaml.dist polaris-pdns.yaml
    $ sudo cp polaris-topology.yaml.dist polaris-topology.yaml
    
    $ sudo cp /opt/polaris/etc/pdns.conf.dist /etc/pdns/pdns.conf
    $ cd /opt/polaris/etc
    $ sudo cp polaris-lb.yaml.dist polaris-lb.yaml
    $ sudo cp polaris-health.yaml.dist polaris-health.yaml
    $ sudo cp polaris-pdns.yaml.dist polaris-pdns.yaml
    $ sudo cp polaris-topology.yaml.dist polaris-topology.yaml
    $ sudo cp -a /opt/polaris/bin/polaris-health /etc/init.d/polaris-health
    $ sudo chkconfig polaris-health on
    
    $ sudo cp /opt/polaris/etc/pdns.conf.dist /etc/pdns/pdns.conf
    $ cd /opt/polaris/etc
    $ sudo cp polaris-lb.yaml.dist polaris-lb.yaml
    $ sudo cp polaris-health.yaml.dist polaris-health.yaml
    $ sudo cp polaris-pdns.yaml.dist polaris-pdns.yaml
    $ sudo cp polaris-topology.yaml.dist polaris-topology.yaml
    
  6. Узнайте внутренний адрес виртуальной машины:

    $ hostname -i
    
  7. В конфигурационном файле pdns.conf укажите внутренний IP-адрес виртуальной машины. Вы можете отредактировать конфигурационный файл с помощью утилиты nano:

    $ sudo nano /etc/powerdns/pdns.conf
    
    $ sudo nano /etc/pdns/pdns.conf
    

    Файл pdns.conf имеет вид:

    # Polaris specific PDNS configuration
    
    #################################
    # launch    Which backends to launch and order to query them in
    #
    # Python3 binary must be in the $PATH!
    launch=remote
    remote-connection-string=pipe:command=/opt/polaris/bin/polaris-pdns,timeout=2000
    
    local-address=<INTERNAL IP ADRESS>
    
    #################################
    # distributor-threads   Default number of Distributor (backend) threads to start
    #
    # distributor-threads=3
    
    # logs received from a Polaris remotebackend will be logged from loglevel 6
    #
    # loglevel=6
    
    # If not using the topology load balancing method, comment out the caching
    # options below to greatly improve the backend performance
    
    #################################
    # cache-ttl Seconds to store packets in the PacketCache
    #
    # cache-ttl=20
    cache-ttl=0
    
    #################################
    # negquery-cache-ttl    Seconds to store negative query results in the QueryCache
    #
    # negquery-cache-ttl=60
    negquery-cache-ttl=0
    
    #################################
    # query-cache-ttl   Seconds to store query results in the QueryCache
    #
    # query-cache-ttl=20
    query-cache-ttl=0
    

    Укажите внутренний IP-адрес в значении параметра local-address вместо <INTERNAL IP ADRESS>.

  8. Настройте polaris-gslb. Вы можете отредактировать конфигурационные файлы с помощью утилиты nano:

    1. $ sudo nano /opt/polaris/etc/polaris-lb.yaml

      Файл polaris-lb.yaml имеет вид:

      pools:
          www-example:
              monitor: http
              monitor_params:
                  hostname: www.example.com
                  url_path: /
              lb_method: wrr
              fallback: any
              members:
              - ip: <dns-lb-tutorial-web-ru-central1-a PUBLIC IP>
                name: dns-lb-tutorial-web-ru-central1-a
                weight: 1
              - ip: <dns-lb-tutorial-web-ru-central1-b PUBLIC IP>
                name: dns-lb-tutorial-web-ru-central1-b
                weight: 1
      
      globalnames:
          www.example.com:
              pool: www-example
              ttl: 1
      

      Укажите в файле:

      • Вместо www.example.com — имя вашего домена.
      • Вместо <dns-lb-tutorial-web-ru-central1-a PUBLIC IP> — публичный IP-адрес виртуальной машины dns-lb-tutorial-web-ru-central1-a.
      • Вместо <dns-lb-tutorial-web-ru-central1-b PUBLIC IP> — публичный IP-адрес виртуальной машины dns-lb-tutorial-web-ru-central1-b.

      Публичный адрес виртуальной машины вы можете найти в блоке Сеть на странице виртуальной машины в консоли управления.

    2. $ sudo nano /opt/polaris/etc/polaris-pdns.yaml

      Файл polaris-pdns.yaml имеет вид:

      ###############################
      # SOA record format
      # MNAME                RNAME                           SERIAL REFRESH RETRY EXPIRE MINIMUM
      # polaris.example.com. hostmaster.polaris.example.com. 42     3600    600   86400  1
      
      ###############################
      # SOA MNAME, must end with a dot.
      #
      SOA_MNAME: dns-lb-tutorial-slb-ru-central1-a.example.com.
      
      ###############################
      # SOA_RNAME, must end with a dot.
      #
      SOA_RNAME: hostmaster.example.com.
      
      ###############################
      # SOA serial can either be an absolute numeric value e.g. 1(default), or "auto",
      # which automatically sets the serial to seconds since the epoch of the last state
      # update.
      #
      # SOA_SERIAL: 1
      
      ###############################
      # SOA REFRESH
      #
      # SOA_REFRESH: 3600
      
      ###############################
      # SOA RETRY
      #
      # SOA_RETRY: 600
      
      ###############################
      # SOA EXPIRE
      #
      # SOA_EXPIRE: 86400
      
      ###############################
      # SOA MINIMUM
      #
      # SOA_MINIMUM: 1
      
      ###############################
      # TTL to set on SOA record
      #
      # SOA_TTL: 86400
      
      ################################
      # Whether to log a detailed request/response information to pdns.
      # If set to "true", pdns.conf "loglevel" option must be set to 6 or higher.
      #
      # Setting to "false" will improve the backend performance.
      #
      # LOG: false
      
      ################################
      # Memcache hostname/ip:port to use e.g. "192.168.1.10:12345",
      # if port is omitted the default memcache port is used.
      #
      # SHARED_MEM_HOSTNAME: 127.0.0.1
      

      Укажите в файле вместо www.example.com — имя вашего домена.

  9. Если на виртуальной машине установлена ОС CentOS 6, пропустите этот шаг.

    Настройте проверки состояния для polaris-gslb:

    1. Добавьте systemd Unit файл для проверки состояния polaris-gslb. Вы можете отредактировать файл с помощью утилиты nano:
      $ sudo mkdir -p /etc/systemd/system
      $ sudo nano /etc/systemd/system/polaris-health.service
      
      Приведите polaris-health.service файл к виду:
      [Unit]
      Description=Polaris-GSLB Health Check
      After=network-online.target
      
      [Service]
      ExecStart=/opt/polaris/bin/polaris-health start
      Type=forking
      Restart=on-failure
      RestartSec=1
      StartLimitInterval=0
      
      [Install]
      WantedBy=multi-user.target
      
    2. Добавьте polaris-health в автозагрузку операционной системы:
      $ sudo systemctl enable polaris-health
      
  10. Перезапустите PowerDNS:

    $ sudo service pdns restart
    
  11. Запустите проверку состояния polaris-health:

    $ sudo service polaris-health start
    
  12. Этот шаг нужно выполнять только на виртуальной машине с ОС CentOS 6.

    Откройте сетевой порт 53 с помощью утилиты iptables:

    $ sudo iptables -I INPUT -p tcp -m tcp --dport 53 -j ACCEPT
    $ sudo iptables -I INPUT -p udp -m udp --dport 53 -j ACCEPT
    $ sudo iptables-save | sudo tee /etc/sysconfig/iptables
    

Настроить DNS

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

В инструкции ниже описана настройка внешнего DNS-сервиса на примере reg.ru для доменных имен www.example.com и example.com.

Чтобы настроить внешний DNS-сервер, выполните:

  1. Найдите публичные IP-адреса виртуальных машин dns-lb-tutorial-slb-ru-central1-a и dns-lb-tutorial-slb-ru-central1-b в блоке Сеть на страницах виртуальных машин в консоли управления.
  2. Войдите в панель управления внешнего DNS-сервиса. Перейдите в список ваших доменов и нажмите на имя нужного домена.
  3. Создайте две A-записи:
    • Для виртуальной машины dns-lb-tutorial-slb-ru-central1-a:
      • IP Address — публичный IP-адрес вашей виртуальной машины.
      • Subdomaindns-lb-tutorial-slb-ru-central1-a.
    • Для виртуальной машины dns-lb-tutorial-slb-ru-central1-b:
      • IP Address — публичный IP-адрес вашей виртуальной машины.
      • Subdomaindns-lb-tutorial-slb-ru-central1-b.
  4. Создайте 2 NS-записи со значениями полей:
    • Для виртуальной машины dns-lb-tutorial-slb-ru-central1-a:
      • Subdomainwww.
      • Canonical namedns-lb-tutorial-slb-ru-central1-a.example.com..
    • Для виртуальной машины dns-lb-tutorial-slb-ru-central1-b:
      • Subdomainwww.
      • Valuedns-lb-tutorial-slb-ru-central1-b.example.com..
  5. Подождите 15-20 минут, пока изменения DNS-записей вводятся в действие. Время ожидания может отличаться для вашего DNS-сервиса.

Протестировать отказоустойчивость

DNS-балансировщики

  1. В блоке Сеть на странице виртуальной машины в консоли управления найдите публичный IP-адрес виртуальной машины dns-lb-tutorial-slb-ru-central1-a.
  2. Подключитесь к виртуальной машине по протоколу SSH.
  3. Остановите сервис DNS, чтобы сымитировать сбой в работе DNS-баласировщика:
    $ sudo service pdns stop
    
  4. Подключитесь к вашему веб-сайту через браузер. Несмотря на сбой в работе одного из DNS-балансировщиков, подключение должно пройти успешно.
  5. После завершения проверки запустите сервис DNS:
    $ sudo service pdns start
    

Веб-серверы

  1. В блоке Сеть на странице виртуальной машины в консоли управления найдите публичный IP-адрес виртуальной машины dns-lb-tutorial-web-ru-central1-a.

  2. Подключитесь к виртуальной машине по протоколу SSH.

  3. Остановите веб-сервис, чтобы сымитировать сбой в работе веб-сервера:

    $ sudo service apache2 stop
    
    $ sudo service nginx stop
    
  4. Подключитесь к вашему веб-сайту через браузер. Несмотря на сбой в работе одного из веб-серверов, подключение должно пройти успешно.

  5. После завершения проверки запустите веб-сервис:

    $ sudo service apache2 start
    
    $ sudo service nginx start