介绍
在本教程中,我们将演示如何使用DigitalOcean API横向扩展服务器设置。 要做到这一点,我们将使用DOProxy ,即,一旦配置了一个相对简单的Ruby脚本,提供了一个命令行界面来扩展你的HTTP应用服务器层向上或向下。
DOProxy专门为本教程而编写,提供了一种创建和删除应用程序服务器Droplet的简单方法,使用DigitalOcean API,并在HAProxy负载均衡器后自动管理它们。 此基本扩展模型允许用户通过HAProxy服务器访问您的应用程序,HAProxy服务器将它们转发到负载平衡的后端应用程序服务器。
DOProxy执行三个主要功能:
- 创建一个Droplet,并将其添加到负载平衡器
- 删除Droplet,并将其从负载均衡器中删除
- 保持其创建的Droplet的清单,直到它们被删除
注:本教程的主要目的是教需要通过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.yml
和user-data.yml
通过复制它们,如在方向指出的文件。 一定要更换token
和ssh_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一起):
让我们仔细看看通过查看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。
在运行create
或delete
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运行时执行,除非没有指定参数。
- 阅读
doproxy.yml
配置文件(API获得令牌,Droplet选项)。 2化。
def get_inventory
检索库存文件中每个Droplet的信息。 它必须在执行以下任何方法之前执行。
- 读取库存文件(其中包含DropletID)
- 对于每个DropletID,使用API检索Droplet信息
def print_inventory
当使用“doproxy.rb打印”命令时,将Droplet信息打印到屏幕上。 它依赖于get_inventory
。
- 对于库存每个Droplet,打印主机名,私有IP地址,状态和ID(这是由检索
get_inventory
)
def create_server
当“doproxy.rb打造”使用命令,创建一个新的Droplet,并将其添加到清单文件,然后调用reload_haproxy
产生HAProxy的配置并重新加载负载平衡器。
- 读取userdata文件
- 使用API根据提供的用户数据和选项创建Droplet
- 等待Droplet状态变为“活动” - 使用API每15秒检索一次Droplet信息,直到状态改变
- 当状态为“活动”时,将DropletID添加到清单文件
- 呼叫
reload_haproxy
产生HAProxy的配置并重新加载负载平衡器
def delete_server(line_number)
当“doproxy.rb删除”使用命令,删除指定的Droplet,从清单文件中删除其ID,然后调用reload_haproxy
产生HAProxy的配置并重新加载负载平衡器。
- 从清单文件中删除指定的行(删除DropletID)
- 使用API通过其ID删除Droplet
- 呼叫
reload_haproxy
产生HAProxy的配置并重新加载负载平衡器
def generate_haproxy_cfg
这是一种基于库存中的Droplet创建新HAProxy配置文件的支持方法。
- 打开HAProxy的配置模板,
haproxy.cfg.erb
- 对于库存中的每个Droplet,添加相应的后端服务器
- 写造成
haproxy.cfg
文件保存到磁盘
def reload_haproxy
这是一种将HAProxy配置文件复制到正确位置并重新加载HAProxy的支持方法。 这依赖于generate_haproxy_cfg
。
- HAProxy的配置文件复制
haproxy.cfg
到HAProxy的将重装读取该位置 - 重新加载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描述的缩放设置非常好,但通过与监视系统结合使用可以大大提高。 这将允许您自动根据特定条件(如服务器资源利用率)上下调整应用程序服务器层。
有任何问题或意见吗? 随意发布他们下面!