Вступление
Балансировщики нагрузки 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.