Как работать с балансировщиками нагрузки DigitalOcean с помощью Doctl

Вступление

Балансировщики нагрузки DigitalOcean - это простой способ распределения трафика HTTP, HTTPS и TCP между несколькими внутренними серверами. В этом руководстве мы будем использоватьdoctl - официальный клиент командной строки для API DigitalOcean - для создания и настройки балансировщика нагрузки для нескольких внутренних веб-серверов.

Предпосылки

Перед тем, как начать это руководство, вы должны ознакомиться сdoctl и балансировщиками нагрузки DigitalOcean. Следующие статьи будут полезны:

Перед продолжением убедитесь, что у вас установлена ​​и аутентифицированаdoctl версии 1.6.0 или выше. Проверьте версиюdoctl, запустивdoctl version. Вам также нужно будет добавить ключ SSH к вашей учетной записи DigitalOcean.

[[step-1 -—- setting-up-the-backend-web-servers]] == Шаг 1. Настройка внутренних веб-серверов

Во-первых, мы будем использоватьdoctl для создания двух веб-серверов, на которые наш балансировщик нагрузки будет направлять трафик. Мы начнем с двух серверов с предустановленным стеком LAMP (Linux, Apache, MySQL, PHP) и обновим их, чтобы каждый из них обслуживал уникальные веб-страницы. Это поможет нам убедиться, что балансировщик нагрузки действительно распределяет соединения между несколькими серверами.

Чтобы создать два сервера, нам сначала нужно знать регион, в котором мы хотим, чтобы они находились, и отпечаток ключа SSH, который мы хотим использовать. В этом уроке мы будем использовать регионnyc1. Вы можете перечислить все регионы и их сокращенные ярлыки с помощьюdoctl:

doctl compute region list
OutputSlug    Name               Available
nyc1    New York 1         true
sfo1    San Francisco 1    true
nyc2    New York 2         true
ams2    Amsterdam 2        true
sgp1    Singapore 1        true
lon1    London 1           true
nyc3    New York 3         true
ams3    Amsterdam 3        true
fra1    Frankfurt 1        true
tor1    Toronto 1          true
sfo2    San Francisco 2    true
blr1    Bangalore 1        true

Выберите слаг для того региона, который вы хотите использовать.

[.note] #Note: Балансировщик нагрузки и его целевые капли должны находиться в одном регионе.
#

Чтобы найти отпечаток вашего ключа SSH, снова используйтеdoctl:

doctl compute ssh-key list
OutputID         Name          FingerPrint
7738555    sammy@host    your_ssh_key_fingerprint

В выводе обратите внимание на отпечаток ключа SSH, который вы будете использовать. Нам понадобится это для следующей команды.

Мы собираемся использовать образ стека LAMP одним щелчком, работающий под Ubuntu 16.04, и поместим его в каплю объемом 512 МБ. Различные параметры, доступные для изображений и размеров капель, также могут быть перечислены с помощьюdoctl, используя командуlist. Вы можете узнать больше об этом вCreating, Deleting, and Inspecting Droplets section обязательной статьи.

Теперь, когда у нас есть вся наша информация, мы можем создать два сервера в одной команде:

doctl compute droplet create web-1 web-2 \
    --region nyc1 \
    --image lamp-16-04 \
    --ssh-keys your_ssh_key_fingerprint \
    --enable-private-networking \
    --size 512mb

web-1 иweb-2 будут именами серверов. Мы также выбрали--enable-private-networking. Это гарантирует, что трафик от балансировщика нагрузки к целевым каплям будет оставаться в неизмеренной частной сети DigitalOcean.

Командаcreate выведет информацию о новых каплях:

OutputID          Name     Public IPv4    Private IPv4    Public IPv6    Memory    VCPUs    Disk    Region    Image                   Status    Tags
48463543    web-1                                                  512       1        20      nyc1      Ubuntu LAMP on 16.04    new
48463544    web-2                                                  512       1        20      nyc1      Ubuntu LAMP on 16.04    new

Наши два сервера сейчас готовятся. Подождите несколько минут, чтобы завершить процесс, а затем перечислите свои веб-дроплеты:

doctl compute droplet list web-*

Командаlist принимает подстановочный знак*. В этом случае мы будем показывать только капли с хотя быweb- в своем имени:

OutputID          Name      Public IPv4        Private IPv4    Public IPv6    Memory    VCPUs    Disk    Region    Image                   Status    Tags
48603683    web-1    111.111.111.111     111.111.111.333                   512       1        20      nyc1      Ubuntu LAMP on 16.04    active
48603684    web-2    111.111.111.222     111.111.111.444                   512       1        20      nyc1      Ubuntu LAMP on 16.04    active

Обратите внимание, что каплям теперь назначены IPv4-адреса, и они перечислены какactive. Если вы перейдете к одному из публичных адресов Droplets в своем веб-браузере, будет загружена страница-заменитель Apache по умолчанию. Давайте добавим к каждой новую уникальную страницу, чтобы мы могли отличитьweb-1 отweb-2.

Мы можем подключиться к нашему серверу по SSH черезdoctl:

doctl compute ssh web-1

Это подключится и войдет в систему какroot, используя ключ SSH, который вы указали при создании. Откройте новый файл HTML на сервере. Воспользуемся текстовым редакторомnano:

nano /var/www/html/test.html

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

/var/www/html/test.html

Hello from web-1!

Сохраните файл и выйдите из текстового редактора. Это не полный HTML-файл, но браузеры прощают, и этого достаточно для наших целей.

Перейдите по следующему адресу, чтобы убедиться, что новая страница обслуживается правильно. Обязательно замените правильный IP для выделенной части:

http://web-1_public_ip_address/test.html

На странице вы должны увидеть только что созданный заголовокHello from web-1!.

Выход из сеанса SSH:

exit

Теперь SSH на второй сервер и повторите процесс, используя другое сообщение на странице HTML:

doctl compute ssh web-2

Откройте новый файл HTML:

nano /var/www/html/test.html

Вставить в содержание:

/var/www/html/test.html

Hello from web-2!

Сохраните и выйдите из текстового редактора, затем выйдите из сеанса SSH:

exit

Используйте свой браузер, чтобы убедиться, чтоweb-2 также правильно обслуживает новую веб-страницу. Если это так, мы готовы создать балансировщик нагрузки для распределения нагрузки между нашими двумя серверами.

[[step-2 -—- creation-a-load-balancer]] == Шаг 2. Создание балансировщика нагрузки

Мы создадим наш новый балансировщик нагрузки в областиnyc1. Еще раз обратите внимание, что балансировщик нагрузки и его целевые капли должны находиться в одном регионе, поэтому обязательно используйте регион, в котором находятся ваши капли:

doctl compute load-balancer create \
    --name load-balancer-1 \
    --region nyc1 \
    --forwarding-rules entry_protocol:http,entry_port:80,target_protocol:http,target_port:80

Эта команда создает балансировщик нагрузки с именемload-balancer-1 в областиnyc1. Каждому балансировщику нагрузки требуется хотя бы одно правило под флагом--forwarding-rules. Эти правила описывают, как балансировщик нагрузки будет принимать трафик и как он будет перенаправлять его на цели. Приведенное выше правило переадресации указывает, что мы передаем HTTP-трафик через порт 80 напрямую на целевые серверы.

Другие параметры протокола--forwarding-rules - этоhttps иtcp, и вы можете выбрать любые допустимые порты как для входа, так и для цели. Если вам нужно указать несколько правил пересылки, заключите весь список правил в кавычки и используйте пробел между каждым правилом. Вот пример, который включил бы и пересылку HTTP и HTTPS:

--forwarding-rules "entry_protocol:http,entry_port:80,target_protocol:http,target_port:80 entry_protocol:https,entry_port:443,target_protocol:https,target_port:443"

Командаcreate, которую мы только что запустили, выведет информацию о нашем новом балансировщике нагрузки:

OutputID                                      IP    Name               Status    Created At              Algorithm      Region    Tag    Droplet IDs    SSL      Sticky Sessions                                Health Check                                                                                                                   Forwarding Rules
ae3fa042-bfd2-5e94-b564-c352fc6874ef          load-balancer-1    new       2017-05-10T19:28:30Z    round_robin    nyc1                            false    type:none,cookie_name:,cookie_ttl_seconds:0    protocol:http,port:80,path:/,check_interval_seconds:10,response_timeout_seconds:5,healthy_threshold:5,unhealthy_threshold:3    entry_protocol:http,entry_port:80,target_protocol:http,target_port:80,certificate_id:,tls_passthrough:false

Обратите внимание на идентификатор Load Balancer, выделенный выше, который мы будем использовать на следующем шаге, чтобы добавить наши целевые капли. Также есть информация о некоторых конфигурациях по умолчанию, которые мы не установили, таких как правила проверки работоспособности и липкие сеансы. Вы можете найти больше информации об этих опциях вprerequisite load balancer article. Чтобы узнать подробности о том, как установить эти параметры с помощьюdoctl, вы всегда можете запустить командуcreate с флагом--help. Для создания Load Balancer это будет выглядеть так:

doctl compute load-balancer create --help

Это выведет список всех доступных флагов командной строки и параметров. Вы можете использовать этот флаг--help в любой командеdoctl.

Теперь, когда наш балансировщик нагрузки создан, нам нужно добавить в него целевые капли. Мы сделаем это в следующем разделе.

[[step-3 -–- add-droplets-to-the-load-balancer]] == Шаг 3 - Добавление капель в Load Balancer

Давайте снова перечислим информацию для наших двух капель, чтобы мы могли получить их идентификаторы:

doctl compute droplet list web-*
OutputID          Name      Public IPv4        Private IPv4    Public IPv6    Memory    VCPUs    Disk    Region    Image                   Status    Tags
48603683    web-1    111.111.111.111    111.111.111.333                   512       1        20      nyc1      Ubuntu LAMP on 16.04    active
48603684    web-2    111.111.111.222     111.111.111.444                   512       1        20      nyc1      Ubuntu LAMP on 16.04    active

Идентификаторы выделены в примере вывода выше. Be sure to use your actual IDs, not the examples.с

Теперь мы используем командуadd-droplets, чтобы добавить целевые капли в наш балансировщик нагрузки. Укажите идентификатор балансировщика нагрузки, который мы создали на предыдущем шаге:

doctl compute load-balancer add-droplets
    ae3fa042-bfd1-4e94-b564-c352fc6874ef \
    --droplet-ids 48463543,48463544

Теперь мы можем использовать командуget для получения обновленной информации для нашего балансировщика нагрузки:

doctl compute load-balancer get ae3fa042-bfd1-4e94-b564-c352fc6874ef
OutputID                                      IP                Name               Status    Created At              Algorithm      Region    Tag    Droplet IDs          SSL      Sticky Sessions                                Health Check                                                                                                                   Forwarding Rules
ae3fa042-bfd1-4e94-b564-c352fc6874ef    111.111.111.555    load-balancer-1    active    2017-05-10T19:28:30Z    round_robin    nyc1             48603683,48603684    false    type:none,cookie_name:,cookie_ttl_seconds:0    protocol:http,port:80,path:/,check_interval_seconds:10,response_timeout_seconds:5,healthy_threshold:5,unhealthy_threshold:3    entry_protocol:http,entry_port:80,target_protocol:http,target_port:80,certificate_id:,tls_passthrough:false

Обратите внимание, что статус теперьactive, нам назначен IP-адрес и перечислены наши целевые капли. Перейдите к этому новому IP-адресу с балансировкой нагрузки в своем браузере, снова загрузив страницуtest.html. URL будет выглядеть так:

http://load-balancer-1_ip_address/test.html

Ваш браузер загрузит сообщение изweb-1 илиweb-2. Обновите страницу, и вы должны увидеть сообщение другого сервера. Наш балансировщик нагрузки находится в режимеround robin, что означает, что он отправляет подключения к следующей капле в списке для каждого запроса. Альтернативой является режимleast connections, в котором балансировщик нагрузки отправляет новый трафик той цели, у которой меньше всего активных подключений.

Теперь, когда мы знаем, что наш балансировщик нагрузки работает, давайте отключим сервер и посмотрим, как он обрабатывает прерывания.

[[step-4 -–- testing-fail-over]] == Шаг 4. Тестирование отработки отказа

Одним из больших преимуществ балансировщиков нагрузки является повышенная устойчивость к проблемам с отдельными серверными веб-серверами. Балансировщик нагрузки выполняет проверку работоспособности с заданными интервалами (по умолчанию каждые 10 секунд). Проверка работоспособности по умолчанию - получение веб-страницы на целевом сервере. Если эта проверка не удалась несколько раз подряд, цель будет выведена из ротации, и трафик ей не будет отправлен, пока она не восстановится.

Давайте проверим функцию восстановления после отказа, не пройдя проверку работоспособности. SSH обратно вweb-2:

doctl compute ssh web-2

Теперь выключите веб-сервер Apache:

systemctl stop apache2

Вернитесь в браузер и обновите страницу с балансировкой нагрузки несколько раз. Сначала вы можете получить несколько ошибок503 Service Unavailable. По умолчанию балансировщик нагрузки ожидает три проверки работоспособности, прежде чем удалять сервер из пула. Это займет около тридцати секунд. После этого вы будете видеть только ответы отweb-1.

Запустите резервное копирование Apache наweb-2:

systemctl start apache2

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

Ваш балансировщик нагрузки теперь полностью восстановлен.

Продолжайте читать, чтобы узнать о следующих шагах, которые вы можете предпринять, чтобы подготовить балансировщик нагрузки к работе.

Заключение

В этом руководстве мы использовалиdoctl для создания балансировщика нагрузки DigitalOcean и некоторых внутренних веб-серверов, настроили балансировщик нагрузки для отправки HTTP-трафика на внутренние серверы и протестировали функциональность проверки работоспособности балансировщика нагрузки. Есть еще несколько шагов, которые можно предпринять, чтобы подготовить балансировщик нагрузки к работе:

  • Вы хотите указать доменное имя на вашем балансировщике нагрузки, чтобы ваши пользователи не вводили недружественный IP-адрес. Вы можете узнать, как это сделать, в нашем руководствеHow To Set Up a Host Name with DigitalOcean.

  • DigitalOcean позволяет пометить ваши капли, чтобы вы могли сохранить их организованность и обращаться к целым наборам капель в группе. Вы можете настроить балансировщик нагрузки на отправку трафика всем каплям в определенном теге, вместо того, чтобы добавлять капли по отдельности. Это позволит вам динамически добавлять новые серверы в пул. Вы можете узнать о тегах DigitalOcean вHow To Tag DigitalOcean Droplets.

  • Если вам нужно добавить безопасность HTTPS на свой веб-сайт с балансировкой нагрузки, у нас есть руководства по двум различным способам достижения этого:SSL passthrough иSSL termination.

Related