如何使用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®ion_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 反向代理、专用负载均衡器设置等来完成。 选择将取决于您的基础架构需求和预算。