如何使用DigitalOcean扩展您的基础架构

来自菜鸟教程
跳转至:导航、​搜索

借助 DigitalOcean 具有 API 访问权限和完整根级别访问权限的简单界面,这是创建可按需扩展的自动化设置的绝佳机会。 您可以让您的网站自动扩大或缩小以满足流量需求。

使用此 API 可以实现垂直和水平可扩展性,只需一个 bash 脚本即可访问。 最好创建一个在所有其他 Droplet 上都有其公钥的管理 Droplet。 这将允许您使用 rsync 推送网页更新,以及向其他 Droplet 发出命令,并查询它们的 Nagios、NRPE 和 SNMPD 生命体征。 您需要创建自己的逻辑级别来确定您希望如何以及何时进行扩展——例如,如果服务器达到 85% 的 CPU 使用率,则将 RAM 加倍(垂直扩展)或创建克隆(水平扩展)。 选择是价格收益分析,留给读者。

这是一个开始工作的 bash 脚本。 确保从 API 访问页面 将 Client_Key 和 API_Key 修改为您自己的变量 - 单击“生成新的 API 密钥”。 对于我们的示例,我们有以下内容:

Client Key: A2a9SfT4NeFBl6df5cu42
API Key: mnqWGdu4OfLBwwJPee6cpjkeY70qv9mKicqZYvtHJ

缩放器.sh:

#!/bin/bash
# Be Sure To Change This!
Client_Key=A2a9SfT4NeFBl6df5cu42
API_Key=mnqWGdu4OfLBwwJPee6cpjkeY70qv9mKicqZYvtHJ

droplets()
{
echo "Your current droplets:"
All_Droplets=`curl -s "https://api.digitalocean.com/droplets/?client_id=$Client_Key&api_key=$API_Key"`
echo $All_Droplets | sed -e 's/,/\n/g' | sed -e 's/{/\n/g' | sed -e 's/}/\n/g' | sed -e 's/"//g'
}

spinup()
{
Droplet_Name=$1
Size_ID=$2
Image_ID=$3
Region_ID=$4
echo "Spinning up a new droplet $Droplet_Name"
curl -s "https://api.digitalocean.com/droplets/new?name=$Droplet_Name&size_id=$Size_ID&image_id=$Image_ID&region_id=$Region_ID&client_id=$Client_Key&api_key=$API_Key"
}

resize()
{
Droplet_ID=$1
Size_ID=$2
echo "Resizing a droplet ID: $Droplet_ID to Size ID: $2"
curl -s "https://api.digitalocean.com/droplets/$Droplet_ID/resize/?size_id=$Size_ID&client_id=$Client_Key&api_key=$API_Key"
}

sizes()
{
sizes=`curl -s "https://api.digitalocean.com/sizes/?client_id=$Client_Key&api_key=$API_Key"`
echo $sizes | sed -e 's/,/\n/g' | sed -e 's/{//g' | sed -e 's/}//g' | sed -e 's/"//g' | sed -e 's/\[/\n/g'
}

snapshot()
{
Droplet_ID=$1
Snapshot_Name=$2
echo "Taking a snapshot of Droplet $1 with Name: $Snapshot_Name"
curl -s "https://api.digitalocean.com/droplets/$Droplet_ID/snapshot/?name=$Snapshot_Name&client_id=$Client_Key&api_key=$API_Key"
}


go()
{
# Display all current droplets.  Region_ID: 1 for US, 2 for Amsterdam.
droplets

# Show possible Size IDs, for RAM, also tied to amount of CPU cores and HDD allocated - refer to https://www.digitalocean.com/pricing
echo "Possible droplets sizes by RAM:"
sizes

# Take a snapshot of an existing droplet
# The syntax is: snapshot Droplet_ID Snapshot_Name
# For example to take a snapshot of droplet with ID "72100":
#snapshot 72100 domain.com

# Vertical Scaling - Increase RAM, CPU, Disk
# The syntax is: resize Droplet_ID New_Size_ID
# For example to resize a 512MB droplet to a 1GB droplet with ID "72100":
#resize 72100 63

# Horizontal Scaling - Clone a server from a snapshot
# The syntax is: spinup Droplet_Name Size_ID Image_ID Region_ID
# For example, to spinup a 512MB clone of domain.com webserver with image ID "12573" in New York datacenter (Region 1):
#spinup domain.com 66 12574 1
}

go

假设我们创建了一个网络服务器 droplet,其中包含配置了 Nagios、NRPE、SNMPD 的 Nginx/Apache/Memcached 堆栈。 我们的 admin droplet 的 SSH 密钥在 /root/.ssh/authorized_keys 和 iptables 规则中,只允许 admin droplet 通过 SSH 连接。 托管的域是 domain.com。

脚本的示例输出,其中显示了此网络服务器液滴:

id:72100
name:domain.com
image_id:12574
size_id:66
region_id:1
backups_active:null
ip_address:192.34.56.29
status:active

请注意,Droplet_ID 是 72100,Image_ID(快照)是 12574 要拍摄此水滴的快照,请取消注释以下行并运行它:

snapshot 72100 domain.com

拍摄名称为 domain.com 的 Droplet 72100 的快照

{"status":"OK","event_id":473473}

这会创建我们的 droplet 的快照并将其保存为“domain.com”:

要将此液滴从 512MB 垂直缩放到 1GB,请取消注释以下行并运行:

resize 72100 63
Resizing a droplet ID: 72100 to Size ID: 63
{"status":"OK","event_id":473530}

为了水平缩放这个液滴,我们将通过取消注释这一行并运行 Scaler.sh 来启动一个新液滴:

spinup domain.com 66 12574 1

启动一个新的 droplet domain.com

{"status":"OK","droplet":{"id":72124,"name":"domain.com","image_id":12574,"size_id":66,"event_id":473545}}

最新的 DigitalOcean 液滴尺寸和 ID:

ID 姓名
66 512MB
63 1GB
62 2GB
64 4GB
65 8GB
61 16 GB
60 32GB
70 48GB
70 48GB
69 64GB
68 96GB

最近 DigitalOcean 升级为 SSD 驱动器,最小的 droplet 配备 512MB 的 RAM 和 1 个 CPU 内核。 下一步是 1GB 的 RAM 和 1 个 CPU 内核。 您可以在后端运行 Nginx,使用 PHP-FPM 处理 PHP 请求,并在 Nginx 前面使用 Varnish 缓存。

使用 Nginx 和 PHP+FPM 的 Varnish 缓存基准显示每秒 420 个请求,而仅使用 Nginx 和 PHP-FPM 服务的请求数为 22.25 个/秒。

就 Droplet 而言,还有一个有趣的概念,即自我复制 VM。 主机可以自我意识到“过载”并决定克隆自己并将克隆添加到 DNS 轮换中。 有很多方法可以实现这一点,最简单的方法是使用 SNMPD 和 Nagios 来轮询数据。

您甚至可以设置在所有 VM 上都有其公钥的编排 VM。 自动化程度取决于您的想象力和对复杂性的渴望。

在要克隆的 Droplet 上拥有 Nagios、SNMPD、NRPE 和 SSH 密钥等基本监控工具非常重要。 它将允许您将新内容同步到该服务器,进一步自动化该过程。 您可以设置一个管理员 droplet,您将向其中上传网页,并且所有同步都将通过 crontab 完成。 此管理液滴应将其密钥放置在您的所有液滴上,并且仅允许来自该管理液滴的 IP 地址的 SSH 端口。 是否选择与此管理 droplet 建立 OpenVPN 连接取决于您。

从快照中启动新的网络服务器后,您需要将服务器置于轮换状态。 这可以通过 DNS 循环、Nginx 反向代理、专用负载均衡器设置等来完成。 选择将取决于您的基础架构需求和预算。

布拉特·哈米托夫