如何自动上DigitalOcean你的Web应用程序的缩放

在本教程中,我们将演示如何使用API​​ DigitalOcean水平缩放您的服务器设置。要做到这一点,我们将使用** ** DOProxy,一个相对简单的Ruby脚本,一旦配置,提供了一个命令行界面来扩展你的HTTP应用服务器层向上或向下。 本教程的主要目的是教需要通过API编程扩展您的DigitalOcean服务器架构所需的最小概念。

介绍

在本教程中,我们将演示如何使用DigitalOcean API横向扩展服务器设置。 要做到这一点,我们将使用DOProxy ,即,一旦配置了一个相对简单的Ruby脚本,提供了一个命令行界面来扩展你的HTTP应用服务器层向上或向下。

DOProxy专门为本教程而编写,提供了一种创建和删除应用程序服务器Droplet的简单方法,使用DigitalOcean API,并在HAProxy负载均衡器后自动管理它们。 此基本扩展模型允许用户通过HAProxy服务器访问您的应用程序,HAProxy服务器将它们转发到负载平衡的后端应用程序服务器。

DOProxy执行三个主要功能:

  • 创建一个Droplet,并将其添加到负载平衡器
  • 删除Droplet,并将其从负载均衡器中删除
  • 保持其创建的Droplet的清单,直到它们被删除

DOProxy创建

注:本教程的主要目的是教需要通过API编程扩展您的DigitalOcean服务器架构所需的最小概念。 您不应在生产环境中以其当前形式运行DOProxy; 它没有考虑弹性设计,它执行刚好足够的错误检查。 据说,如果你对通过API学习横向扩展感到好奇,那是一个很好的开始。

先决条件

本教程涉及您可能需要阅读的各种技术,然后再继续,包括:

因为DOProxy是用Ruby编写的,Ruby的知识是一个加号,但不是必要的; 我们将提供伪代码来解释DOProxy代码的要点。 此外,我们将使用官方DigitalOceanRuby包装, DropletKit ,这使我们能够轻松地在我们的Ruby代码API调用。

在我们进入DOProxy作品的细节之前,我们将在服务器上安装和使用它。 让我们现在在Ubuntu 14.04Droplet上安装DOProxy。

安装DOProxy

首先,创建于NYC3地区的一个Ubuntu 14.04Droplet(如果配置你可以使用一个支持专用网络用户数据区域的任何region中的变量doproxy.yml文件安装DOProxy后)。 此Droplet将运行HAProxy负载平衡器和DOProxy缩放脚本,因此请选择您认为适合您所需的缩放潜力的大小。 因为本教程是缩放的基本演示,它不会接收任何实际流量,1GB大小可能是足够的。

我们将把这个Droplet作为DOProxy服务器

接下来,登录并按照安装配置 (包括doproxy配置使用用户数据 )的部分DOProxy GitHub的库在此服务器上安装DOProxy。 使用示例doproxy.ymluser-data.yml通过复制它们,如在方向指出的文件。 一定要更换tokenssh_key_ids的DOproxy配置文件中的值,否则脚本将无法工作。

现在您已经在您的服务器上安装了DOProxy和HAProxy,让我们尝试并扩展我们的环境。

运行DOProxy

登录到您的DOProxy服务器根目录 ,并切换到你克隆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 <LINE_NUMBER>    # Delete a droplet and reload
doproxy.rb reload                  # Generate HAProxy config and reload HAProxy
doproxy.rb generate                # Generate HAProxy config based on inventory

目前,DOProxy没有产生任何Droplet。 让我们创建一些来使我们的HTTP服务在线,并向上扩展。

放大(创建)

运行create命令创建由DOProxy管理的第一个Droplet:

ruby doproxy.rb create

这将需要一些时间,然后返回到提示符(因为脚本通过API创建一个新的Droplet,并等待它启动)。 我们将讨论如何调用API,稍后,当我们通过DOProxy代码。

完成后,您应该会看到包含DropletID的成功消息,如下所示:

Success: 4202645 created and added to backend.

如果您在Web浏览器中访问您的DOProxy服务器的公共IP地址。 您应该看到一个页面,列出了新的Droplet的主机名 ,ID公网IP地址

我们将使用DOProxy创建两个更多的Droplet,总共三个。 随意创造更多,如果你想要:

ruby doproxy.rb create
ruby doproxy.rb create

现在请在Web浏览器中再次访问您的DOProxy服务器的公共IP地址。 如果刷新页面,您会注意到页面上的信息将改变,它将循环通过您创建的Droplet。 这是因为它们都由HAProxy进行负载平衡 - 每个Droplet在创建时都会添加到负载均衡器配置中。

如果你碰巧看到DigitalOcean控制面板,你会注意到,这些新的Droplet将列出(与其他Droplet一起):

控制面板中的Droplet

让我们仔细看看通过查看DOProxy的库存创建的Droplet。

DOProxy提供了一个打印命令,将打印出所有那些其库存的一部分Droplet的:

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)

在示例输出中,我们看到有关我们创建的三个Droplet的信息,例如它们的主机名,状态和DropletID。 主机名和ID应该与您访问HAProxy负载均衡器时看到的一致(通过DOProxy的公共IP地址)。

正如你可能已经注意到,DOProxy只打印它创建的Droplet的信息。 这是因为它保持了其产生的Droplet的库存。

检查出的内容, inventory现在文件:

cat inventory

你应该看到每个Droplet的ID,每行一个。 每次创建Droplet时,其ID都存储在此清单文件中。

正如你可能已经猜到了,DOProxy的print通过在清单文件Droplet的ID命令迭代并执行API调用来检索每一个Droplet的信息。

应该注意,将服务器库存存储在单个文件中不是最好的解决方案 - 它可以容易地损坏或删除 - 但它演示了一个简单的实现。 分布式键值存储,如ETCD,将是一个更好的解决方案。 您还需要在清单中保存不仅仅是DropletID(因此,您不必在每次想要查看某些Droplet信息时都调用API调用)。

缩小(删除)

DOProxy也有一个删除命令,让您删除清单中的Droplet。 delete命令要求您提供Droplet的行号删除(由所显示print命令)。

在运行此命令之前,您可能需要打印您的清单:

ruby doproxy.rb print

因此,举例来说,如果你要删除的第三Droplet,您将提供2的行号:

ruby doprorxy.rb delete 2

稍后,您会看到确认讯息:

Success: 4205675 deleted and removed from backend.

delete命令通过API删除Droplet,将其从HAProxy配置中删除,并将其从清单中删除。 使用DOProxy打印命令或通过检查DigitalOcean控制面板,随意确认Droplet已删除。 您还将注意到它不再是负载均衡器的一部分。

HAProxy配置

我们没有讨论的最后一个DOProxy是如何配置HAProxy。

在运行createdelete DOProxy命令,在库存中每个Droplet的信息的检索,以及一些的信息被用来创建一个HAProxy的配置文件。 特别地,DropletID和私有IP地址用于将每个Droplet添加为后端服务器。

查看生成的最后几行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部分应包含您DOProxy服务器的公网IP地址,以及backend部分应包含指向每个创建的Droplet的线条。

注意:此时,你可能想要删除用DOProxy创建Droplet的其余部分( 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令牌并指定Droplet创建选项
  • haproxy.cfg.erb:HAProxy的配置模板。 用于生成带有适当后端服务器信息的负载平衡器配置
  • 库存 :库存Droplet文件。 存储创建的Droplet的ID
  • 用户data.yml:使用用户数据文件。 创建时将在新Droplet上运行的云配置文件

让我们先看看配置文件。

多巴氧化

在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在这里你可以配置你的读取和写入 API令牌。

其他行指定了DOProxy创建新Droplet时将使用的选项。 例如,它将安装指定的SSH密钥(通过ID或指纹),它将在主机名前面加上“auto-nginx”。

有关有效Droplet选项的详细信息,请查看DigitalOcean API文档

user-data.yml

该用户数据文件, user-data.yml ,就是将云中的init每一个新的Droplet被执行的文件,创建时。 这意味着您可以提供一个cloud-config文件或脚本来在每个新的Droplet上安装应用程序软件。

示例userdata文件包含一个简单的bash脚本,该脚本在Ubuntu服务器上安装Nginx,并用drop主机名,ID和公有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

Droplet信息(主机名,ID和IP地址)通过DigitalOcean元数据检索服务-这就是那些什么curl的命令在做什么。

显然,你会想做一些比这更有用的东西,比如安装和配置你的应用程序。 您可以通过执行自动安装SSH密钥以及连接到配置管理或监控工具等操作,自动将Droplet集成到整体基础架构中。

要了解有关userdata,cloud-config和元数据的更多信息,请查看以下链接:

haproxy.cfg.erb

该HAProxy的配置模板, haproxy.cfg.erb ,包含大多数负载均衡配置,以将与后端Droplet信息替换一些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 %>

此代码遍历清单中的每个Droplet,并为每个小部件添加一个新的HAProxy后端(基于专用IP地址)。

例如,将为每个Droplet产生这样的线:

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

每当创建或删除Droplet,DOProxy生成一个新的HAProxy的配置文件的haproxy.cfg ,你看前面的文件。

doproxy.rb

该DOProxy Ruby脚本, doproxy.rb ,主要由包含执行Droplet创建和删除,库存管理和HAProxy的配置生成的方法的DOProxy类。

如果你了解Ruby,请在GitHub上的文件: https://github.com/thisismitch/doproxy/blob/master/doproxy.rb

如果你不理解Ruby,这里是一些简化的伪代码,解释每个方法。 对照实际的Ruby代码来引用它可能是有用的,以帮助你理解发生了什么。

def初始化

每次DOProxy运行时执行,除非没有指定参数。

  1. 阅读doproxy.yml配置文件(API获得令牌,Droplet选项)。 2化。

def get_inventory

检索库存文件中每个Droplet的信息。 它必须在执行以下任何方法之前执行。

  1. 读取库存文件(其中包含DropletID)
  2. 对于每个DropletID,使用API​​检索Droplet信息

def print_inventory

当使用“doproxy.rb打印”命令时,将Droplet信息打印到屏幕上。 它依赖于get_inventory

  1. 对于库存每个Droplet,打印主机名,私有IP地址,状态和ID(这是由检索get_inventory

def create_server

当“doproxy.rb打造”使用命令,创建一个新的Droplet,并将其添加到清单文件,然后调用reload_haproxy产生HAProxy的配置并重新加载负载平衡器。

  1. 读取userdata文件
  2. 使用API​​根据提供的用户数据和选项创建Droplet
  3. 等待Droplet状态变为“活动” - 使用API​​每15秒检索一次Droplet信息,直到状态改变
  4. 当状态为“活动”时,将DropletID添加到清单文件
  5. 呼叫reload_haproxy产生HAProxy的配置并重新加载负载平衡器

def delete_server(line_number)

当“doproxy.rb删除”使用命令,删除指定的Droplet,从清单文件中删除其ID,然后调用reload_haproxy产生HAProxy的配置并重新加载负载平衡器。

  1. 从清单文件中删除指定的行(删除DropletID)
  2. 使用API​​通过其ID删除Droplet
  3. 呼叫reload_haproxy产生HAProxy的配置并重新加载负载平衡器

def generate_haproxy_cfg

这是一种基于库存中的Droplet创建新HAProxy配置文件的支持方法。

  1. 打开HAProxy的配置模板, haproxy.cfg.erb
  2. 对于库存中的每个Droplet,添加相应的后端服务器
  3. 写造成haproxy.cfg文件保存到磁盘

def reload_haproxy

这是一种将HAProxy配置文件复制到正确位置并重新加载HAProxy的支持方法。 这依赖于generate_haproxy_cfg

  1. HAProxy的配置文件复制haproxy.cfg到HAProxy的将重装读取该位置
  2. 重新加载HAProxy

这是使DOProxy工作的所有重要代码。 我们将讨论的最后一件事是DropletKit,我们在DOProxy中使用的API包装器。

DropletKitGem

DOProxy使用DropletKitGem ,官方DigitalOcean API V2Ruby包装,使DigitalOcean API调用。 DropletKit允许我们轻松地编写Ruby程序,这些程序执行以下操作:

  • 创建新的Droplet
  • 删除现有Droplet
  • 获取有关现有Droplet的信息,例如状态,IP地址,DropletID,区域等

本教程重点介绍这些特定的API端点,但请记住,还有许多其他端点可以帮助您对DigitalOcean服务器基础架构进行编程管理。

结论

现在您已经了解了一个简单的脚本如何帮助扩展服务器环境,通过利用DigitalOcean API,cloud-config和元数据,希望您可以应用这些概念来扩展您自己的服务器设置。 虽然DOProxy不是生产准备好,它应该给你一些实现自己的缩放解决方案的想法。

请记住,使用DOProxy描述的缩放设置非常好,但通过与监视系统结合使用可以大大提高。 这将允许您自动根据特定条件(如服务器资源利用率)上下调整应用程序服务器层。

有任何问题或意见吗? 随意发布他们下面!