Как автоматизировать масштабирование вашего веб-приложения на DigitalOcean Ubuntu 14.04 Droplets

Вступление

В этом руководстве мы покажем, как использовать API DigitalOcean для горизонтального масштабирования настроек вашего сервера. Для этого мы будем использоватьDOProxy, относительно простой сценарий Ruby, который после настройки предоставляет интерфейс командной строки для увеличения или уменьшения уровня сервера приложений HTTP.

DOProxy, который был написан специально для этого руководства, предоставляет простой способ создания и удаления капель сервера приложений, используя API-интерфейс DigitalOcean, и автоматически управляет ими за балансировщиком нагрузки HAProxy. Эта базовая модель масштабирования позволяет пользователям получать доступ к вашему приложению через сервер HAProxy, который перенаправляет их на серверы приложений с балансировкой нагрузки.

DOProxy выполняет три основные функции:

  • Создайте каплю и добавьте ее в балансировщик нагрузки

  • Удалите капельку и удалите ее из балансировщика нагрузки

  • Ведите инвентарь капель, которые он создал, пока они не будут удалены

DOProxy create

Note: Основная цель этого руководства - обучить минимально необходимым концепциям, необходимым для программного масштабирования архитектуры вашего сервера DigitalOcean с помощью API. Вы не должны запускать DOProxy в его текущей форме в производственной среде; он не был разработан с учетом устойчивости, и он выполняет достаточно проверки ошибок, чтобы обойтись. С учетом сказанного, если вам интересно узнать о горизонтальном масштабировании с помощью API, это отличный способ начать.

Предпосылки

В этом руководстве рассматриваются различные технологии, о которых вы, возможно, захотите прочитать, прежде чем продолжить, в том числе:

Поскольку DOProxy написан на Ruby, знание Ruby является плюсом, но не обязательно; мы предоставим псевдокод, чтобы объяснить суть кода DOProxy. Кроме того, мы будем использовать официальную оболочку DigitalOcean Ruby,DropletKit, которая позволяет нам легко выполнять вызовы API в нашем коде Ruby.

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

Установить DOProxy

Сначала создайте дроплет Ubuntu 14.04 в регионе NYC3 (вы можете использовать любой регион, который поддерживаетprivate networking иuserdata, если вы настроите переменнуюregion в файлеdoproxy.yml после установки ДОПрокси). Эта капля запустит балансировщик нагрузки HAProxy и сценарий масштабирования DOProxy, поэтому выберите размер, который, по вашему мнению, будет соответствовать желаемому потенциалу масштабирования. Поскольку этот учебник является базовой демонстрацией масштабирования, при котором не будет получен реальный трафик, размер 1 ГБ, вероятно, является адекватным.

Мы будем называть эту каплюDOProxy server.

Затем войдите в систему и следуйте разделамInstallation иConfiguration (включаяdoproxy config иUserdata) вDOProxy GitHub repository, чтобы установить DOProxy на этом сервере. Используйте образцы файловdoproxy.yml иuser-data.yml, скопировав их, как указано в инструкциях. Обязательно замените значенияtoken иssh_key_ids в файле конфигурации DOproxy, иначе сценарий не будет работать.

Теперь, когда на вашем сервере установлены DOProxy и HAProxy, давайте попробуем масштабировать нашу среду.

Запустите DOProxy

Войдите на свой сервер DOProxy какroot и перейдите в каталог, в котором вы клонировали DOProxy, если вы еще этого не сделали.

Теперь запустите DOProxy без аргументов:

ruby doproxy.rb

Это должно распечатать доступные команды следующим образом:

Commands:
doproxy.rb print                   # Print backend droplets in inventory file
doproxy.rb create                  # Create a new backend droplet and reload
doproxy.rb delete     # Delete a droplet and reload
doproxy.rb reload                  # Generate HAProxy config and reload HAProxy
doproxy.rb generate                # Generate HAProxy config based on inventory

В настоящее время DOProxy не создал ни одной капли. Давайте создадим некоторые из них, чтобы подключить наш HTTP-сервис к сети, и расширять его.

Scale Up (Создать)

Запустите команду create, чтобы создать первый дроплет, которым управляет DOProxy:

ruby doproxy.rb create

Это займет некоторое время, прежде чем вернуться к приглашению (потому что скрипт создает новую каплю с помощью API и ожидает ее загрузки). Мы поговорим о том, как осуществляется вызов API, позже, когда мы пройдемся по коду DOProxy.

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

Success: 4202645 created and added to backend.

Если вы посещаете публичный IP-адрес вашего сервера DOProxy в веб-браузере. Вы должны увидеть страницу со спискомhostname,id иpublic IP address вашей новой капли.

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

ruby doproxy.rb create
ruby doproxy.rb create

Теперь снова посетите общедоступный IP-адрес вашего сервера DOProxy в веб-браузере. Если вы обновите страницу, вы заметите, что информация на странице изменится - она ​​будет циклически повторять созданные вами капли. Это потому, что все они балансируют нагрузку с помощью HAProxy - каждая капля добавляется в конфигурацию балансировщика нагрузки при ее создании.

Если вам случится заглянуть в панель управления DigitalOcean, вы заметите, что эти новые капли будут перечислены там (вместе с остальными каплями):

Droplets in Control Panel

Давайте внимательнее посмотрим на капли, которые были созданы, посмотрев на инвентарь DOProxy.

Инвентаризация печати

DOProxy предоставляет командуprint, которая распечатает все капли, входящие в его инвентарь:

ruby doproxy.rb print

Вы должны увидеть результат, который выглядит примерно так:

0) auto-nginx-0  (pvt ip: 10.132.224.168, status: active, id: 4202645)
1) auto-nginx-1  (pvt ip: 10.132.228.224, status: active, id: 4205587)
2) auto-nginx-2  (pvt ip: 10.132.252.42, status: active, id: 4205675)

В выходных данных примера мы видим информацию о трех созданных нами каплях, таких как их имена хостов, статус и идентификаторы капель. Имена и идентификаторы хостов должны совпадать с тем, что вы видели при доступе к балансировщику нагрузки HAProxy (через публичный IP-адрес DOProxy).

Как вы могли заметить, DOProxy печатал только информацию о созданных каплях. Это потому, что он поддерживает инвентарь капель, которые он создает.

Теперь проверьте содержимое файлаinventory:

cat inventory

Вы должны увидеть идентификатор каждой капли, по одному в строке. Каждый раз, когда создается капля, ее идентификатор сохраняется в этом файле инвентаря.

Как вы, возможно, догадались, команда DOProxyprint выполняет итерацию по идентификаторам капель в файле инвентаризации и выполняет вызов API для получения информации о каждой капле.

Следует отметить, что хранение инвентаризации вашего сервера в одном файле - не лучшее решение, его легко можно повредить или удалить, но оно демонстрирует простую реализацию, которая работает. Распределенное хранилище значений ключей, такое какetcd, было бы лучшим решением. Вы также хотели бы сохранить не только идентификатор капли в инвентаре (поэтому вам не нужно совершать вызовы API каждый раз, когда вы хотите просмотреть определенную информацию о капле).

Уменьшить (Удалить)

DOProxy также имеет команду удаления, которая позволяет удалять капли из вашего инвентаря. Команда удаления требует, чтобы вы указали номер строки удаляемой капли (как показано командойprint).

Перед выполнением этой команды вы, вероятно, захотите распечатать свой инвентарь:

ruby doproxy.rb print

Так, например, если вы хотите удалить третью каплю, вы должны указать2 в качестве номера строки:

ruby doprorxy.rb delete 2

Через некоторое время вы увидите подтверждающее сообщение:

Success: 4205675 deleted and removed from backend.

Команда delete удаляет каплю через API, удаляет ее из конфигурации HAProxy и удаляет из инвентаря. Не стесняйтесь проверить, что капля была удалена с помощью команды печати DOProxy или проверки панели управления DigitalOcean. Вы также заметите, что он больше не является частью балансировщика нагрузки.

Конфигурация HAProxy

Последний фрагмент DOProxy, который мы не обсуждали, - это настройка HAProxy.

Когда вы запускаете командуcreate илиdelete DOProxy, извлекается информация о каждой капле в инвентаризации, и некоторая информация используется для создания файла конфигурации HAProxy. В частности, идентификатор капли и частный IP-адрес используются для добавления каждой капли в качестве внутреннего сервера.

Посмотрите на последние несколько строк сгенерированного файлаhaproxy.cfg следующим образом:

tail haproxy.cfg

Вы должны увидеть что-то вроде этого:

    frontend www-http
       bind 104.236.236.43:80
       reqadd X-Forwarded-Proto:\ http
       default_backend www-backend

    backend www-backend

       server www-4202645 10.132.224.168:80 check # id:4202645, hostname:auto-nginx-0
       server www-4205587 10.132.228.224:80 check # id:4205587, hostname:auto-nginx-1

Разделfrontend должен содержать общедоступный IP-адрес вашего сервера DOProxy, а разделbackend должен содержать строки, которые относятся к каждой из созданных капель.

Note: На этом этапе вы можете удалить остальные капли, созданные с помощью DOProxy (ruby doproxy.rb delete 0, пока все серверы не исчезнут).

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

Код DOProxy

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

Поскольку вы клонировали репозиторий на свой сервер, вы можете просмотреть файлы там, или вы можете просмотреть файлы в репозитории DOProxy(https://github.com/thisismitch/doproxy).

Важные файлы:

  • doproxy.rb: сценарий DOProxy Ruby. Предоставляет интерфейс командной строки и мозги за DOProxy

  • doproxy.yml: файл конфигурации DOProxy. Содержит токен API и указывает параметры создания капли

  • haproxy.cfg.erb: шаблон конфигурации HAProxy. Используется для генерации конфигурации балансировщика нагрузки с правильной информацией внутреннего сервера

  • inventory: файл инвентаризации капли. Хранит идентификаторы созданных капель

  • user-data.yml: файл пользовательских данных. Файл облачной конфигурации, который будет запускаться на новой капле при ее создании.

Давайте сначала погрузимся в файлы конфигурации.

doproxy.yml

Важные строки в файле конфигурации DOProxy,doproxy.yml, следующие:

token: 878a490235d53e34b44369b8e78
ssh_key_ids:           # DigitalOcean ID for your SSH Key
  - 163420
...
droplet_options:
  hostname_prefix: auto-nginx
  region: nyc3
  size: 1gb
  image: ubuntu-14-04-x64

token - это место, где вы можете настроить свой токен APIread and write.

Другие строки указывают параметры, которые будут использоваться, когда DOProxy создает новую каплю. Например, он установит указанный ключ SSH (по идентификатору или отпечатку пальца) и префиксирует имена хостов «auto-nginx».

Дополнительную информацию о допустимых параметрах капель см. ВDigitalOcean API documentation.

user-data.yml

Файл пользовательских данныхuser-data.yml - это файл, который будет выполняться cloud-init для каждой новой капли при ее создании. Это означает, что вы можете предоставить файл конфигурации облака или скрипт для установки прикладного программного обеспечения на каждую новую каплю.

Пример файла пользовательских данных содержит простой bash-скрипт, который устанавливает Nginx на сервер Ubuntu и заменяет его файл конфигурации по умолчанию на имя хоста, идентификатор и открытый IP-адрес дроплета:

#!/bin/bash

apt-get -y update
apt-get -y install nginx
export DROPLET_ID=$(curl http://169.254.169.254/metadata/v1/id)
export HOSTNAME=$(curl -s http://169.254.169.254/metadata/v1/hostname)
export PUBLIC_IPV4=$(curl -s http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/address)
echo Droplet: $HOSTNAME, ID: $DROPLET_ID, IP Address: $PUBLIC_IPV4 > /usr/share/nginx/html/index.html

Информация о капле (имя хоста, идентификатор и IP-адрес) извлекается через службу метаданных DigitalOcean - именно это и делают командыcurl.

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

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

haproxy.cfg.erb

Шаблон конфигурации HAProxy,haproxy.cfg.erb, содержит большую часть конфигурации подсистемы балансировки нагрузки с некоторым кодом Ruby, который будет заменен информацией о внутренней части.

Мы просто посмотрим на раздел Ruby, который генерирует конфигурацию сервера:

backend www-backend
   <% @droplets.each_with_index do |droplet, index| %>
   server www-<%= droplet.id %> <%= droplet.private_ip %>:80 check # id:<%= droplet.id %>, hostname:<%= droplet.name -%>
   <% end %>

Этот код перебирает каждую капельку в инвентаре и добавляет новый бэкэнд HAProxy для каждого (на основе частного IP-адреса).

Например, такая строка будет производиться для каждой капли:

server www-4202645 10.132.224.168:80 check # id:4202645, hostname:auto-nginx-0

Каждый раз, когда дроплет создается или удаляется, DOProxy генерирует новый файл конфигурации HAProxy - файлhaproxy.cfg, который вы просматривали ранее.

doproxy.rb

Сценарий DOProxy Ruby,doproxy.rb, состоит в основном из класса DOProxy, который содержит методы, которые выполняют создание и удаление капли, управление запасами и создание конфигурации HAProxy.

Если вы разбираетесь в Ruby, посмотрите файл на GitHub:https://github.com/thisismitch/doproxy/blob/master/doproxy.rb.

Если вы не понимаете Ruby, вот несколько упрощенных псевдокодов, объясняющих каждый метод. Может быть полезно сравнить это с реальным кодом Ruby, чтобы помочь вам понять, что происходит.

инициализация по умолчанию

Выполняется каждый раз, когда запускается DOProxy, если не указаны аргументы.

  1. Прочтите файл конфигурацииdoproxy.yml (получите токен API и параметры капли). 2ified.

def get_inventory

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

  1. Прочитать файл инвентаря (который содержит идентификаторы капель)

  2. Для каждого идентификатора капли используйте API для получения информации о капле

def print_inventory

При использовании команды «doproxy.rb print» выводит информацию о капле на экран. Он полагается наget_inventory.

  1. Для каждой капли в инвентаре выведите имя хоста, частный IP-адрес, статус и идентификатор (который был полученget_inventory)

def create_server

Когда используется команда «doproxy.rb create», создается новая капля и добавляется в файл инвентаризации, затем вызываетсяreload_haproxy для генерации конфигурации HAProxy и перезагрузки балансировщика нагрузки.

  1. Прочитайте файл userdata

  2. Используйте API для создания капли на основе предоставленных пользовательских данных и параметров

  3. Подождите, пока статус капель не станет «активным» - используйте API для получения информации о капельках каждые 15 секунд, пока статус не изменится

  4. Когда статус «активен», добавьте идентификатор капли в файл инвентаря

  5. Вызовreload_haproxy для генерации конфигурации HAProxy и перезагрузки балансировщика нагрузки.

def delete_server (номер_строки)

Когда используется команда «doproxy.rb delete», удаляет указанную каплю и удаляет ее идентификатор из файла инвентаризации, затем вызываетreload_haproxy для генерации конфигурации HAProxy и перезагрузки балансировщика нагрузки.

  1. Удалить указанную строку из файла инвентаризации (удалить идентификатор капли)

  2. Используйте API для удаления капли по ее идентификатору

  3. Вызовreload_haproxy для генерации конфигурации HAProxy и перезагрузки балансировщика нагрузки.

def generate_haproxy_cfg

Это вспомогательный метод, который создает новые файлы конфигурации HAProxy на основе капель в инвентаре.

  1. Откройте шаблон конфигурации HAProxy,haproxy.cfg.erb

  2. Для каждой капли в инвентаре добавьте соответствующий внутренний сервер

  3. Записать полученный файлhaproxy.cfg на диск

def reload_haproxy

Это вспомогательный метод, который копирует файл конфигурации HAProxy в нужное место и перезагружает HAProxy. Это зависит отgenerate_haproxy_cfg.

  1. Скопируйте файл конфигурации HAProxyhaproxy.cfg в место, откуда HAProxy будет читать при перезагрузке.

  2. Перезагрузить HAProxy

Вот и весь важный код, который заставляет работать DOProxy. Последнее, что мы обсудим, - это DropletKit, оболочка API, которую мы использовали в DOProxy.

DropletKit Gem

DOProxy используетDropletKit gem, официальную оболочку Ruby для DigitalOcean API v2, для выполнения вызовов DigitalOcean API. DropletKit позволяет нам легко писать программы на Ruby, которые выполняют такие вещи, как:

  • Создать новые капли

  • Удалить существующие капли

  • Получите информацию о существующих каплях, таких как статус, IP-адрес, идентификатор капли, регион и т. Д.

Это руководство было сфокусировано на этих конкретных конечных точках API, но имейте в виду, что есть много других конечных точек, которые могут помочь в программном управлении вашей серверной инфраструктурой DigitalOcean.

Заключение

Теперь, когда вы увидели, как простой сценарий может помочь масштабировать серверную среду, используя API-интерфейс DigitalOcean, cloud-config и метаданные, мы надеемся, что вы сможете применить эти концепции для масштабирования настроек вашего собственного сервера. Хотя DOProxy не готов к работе, он должен дать вам некоторые идеи для реализации собственного решения для масштабирования.

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

Есть вопросы или комментарии? Не стесняйтесь размещать их ниже!

Related