介绍
DigitalOcean负载平衡器是在多个后端服务器之间分发HTTP,HTTPS和TCP流量的简单方法。 在本教程中,我们将使用doctl
(DigitalOcean API的官方命令行客户端)为多个后端Web服务器创建和配置负载均衡器。
先决条件
在开始本教程之前,您应该熟悉doctl
和DigitalOcean负载平衡器。 以下文章将会有所帮助:
您应该确保在继续之前安装并验证了doctl 1.6.0或更高版本。 通过运行doctl version
来检查你的doctl version
。 您还需要在您的DigitalOcean帐户中添加一个SSH密钥。
第1步 - 设置后端Web服务器
首先,我们将使用doctl
创建我们的负载均衡器将引导流量的两个Web服务器。 我们将从预装有LAMP(Linux,Apache,MySQL,PHP)的两台服务器开始,并将它们更新为每个服务器提供唯一的网页。 这将有助于我们验证负载平衡器确实在多个服务器之间分配连接。
为了创建两个服务器,我们首先需要知道我们想要的区域,以及要使用的SSH密钥的指纹。 本教程将使用nyc1区域。 您可以使用doctl
列出所有地区及其缩短的doctl
:
doctl compute region list
OutputSlug Name Available
nyc1 New York 1 true
sfo1 San Francisco 1 true
nyc2 New York 2 true
ams2 Amsterdam 2 true
sgp1 Singapore 1 true
lon1 London 1 true
nyc3 New York 3 true
ams3 Amsterdam 3 true
fra1 Frankfurt 1 true
tor1 Toronto 1 true
sfo2 San Francisco 2 true
blr1 Bangalore 1 true
选择您要使用的区域的s。。
注意:您的负载平衡器及其目标Droplet必须位于同一区域。
要找到您的SSH密钥指纹,再次使用doctl
:
doctl compute ssh-key list
OutputID Name FingerPrint
7738555 sammy@host your_ssh_key_fingerprint
在输出中,记下要使用的SSH密钥的指纹。 我们需要下一个命令。
我们将使用运行Ubuntu 16.04的一键式LAMP映像,我们将把它放在512mb的Droplet上。 使用list
命令,可以使用doctl
列出图像和Droplet大小的不同选项。 您可以在Prequisite文章的“ 创建,删除和检查Droplet”部分阅读更多信息。
现在我们有了所有的信息,我们可以在一个命令中创建两个服务器:
doctl compute droplet create web-1 web-2 \
--region nyc1 \
--image lamp-16-04 \
--ssh-keys your_ssh_key_fingerprint \
--enable-private-networking \
--size 512mb
web-1
和web-2
将是服务器的名称。 我们还选择了--enable-private-networking
。 这将确保从负载平衡器到目标Droplet的流量将保留在DigitalOcean的未计量的专用网络上。
create
命令将输出有关新的Droplet的信息:
OutputID Name Public IPv4 Private IPv4 Public IPv6 Memory VCPUs Disk Region Image Status Tags
48463543 web-1 512 1 20 nyc1 Ubuntu LAMP on 16.04 new
48463544 web-2 512 1 20 nyc1 Ubuntu LAMP on 16.04 new
我们的两台服务器现在正在供应。 等待几分钟的时间完成,然后列出你的网络Droplet:
doctl compute droplet list web-*
list
命令接受*
通配符。 在这种情况下,我们只会以他们的名字显示至少web-
的“Droplet”:
OutputID Name Public IPv4 Private IPv4 Public IPv6 Memory VCPUs Disk Region Image Status Tags
48603683 web-1 111.111.111.111 111.111.111.333 512 1 20 nyc1 Ubuntu LAMP on 16.04 active
48603684 web-2 111.111.111.222 111.111.111.444 512 1 20 nyc1 Ubuntu LAMP on 16.04 active
注意,Droplet现在已经分配了IPv4地址,并被列为active
。 如果您浏览到Web浏览器中的任一个Droplet的公共地址,将会加载默认的Apache占位符页面。 我们为每个添加一个新的唯一页面,所以我们可以将web-1与web-2分开。
我们可以通过doctl
SSH到我们的服务器:
doctl compute ssh web-1
这将使用您在创建时指定的SSH密钥连接并以root身份登录。 在服务器上打开一个新的HTML文件。 我们将使用nano
文本编辑器:
nano /var/www/html/test.html
粘贴到以下HTML代码段中:
<h1 style="color:blue">Hello from web-1!</h1>
保存文件并退出文本编辑器。 这不是一个完整的HTML文件,但浏览器是宽恕的,这对我们的目的是足够的。
导航到以下地址,以确保新页面正常投放。 请确保将正确的IP替换为突出显示的部分:
http://web-1_public_ip_address/test.html
在页面上,您应该看到web-1的标题Hello! 我们刚刚创建。
退出SSH会话:
exit
现在,SSH进入第二台服务器,并重复该过程,在HTML页面中使用不同的消息:
doctl compute ssh web-2
打开新的HTML文件:
nano /var/www/html/test.html
粘贴内容:
<h1 style="color: orange">Hello from web-2!</h1>
保存并退出文本编辑器,然后退出SSH会话:
exit
使用浏览器检查web-2是否正确地为新网页提供服务。 如果是这样,我们已经准备好创建一个负载平衡器来在我们的两台服务器之间分配负载。
第2步 - 创建负载平衡器
我们将在nyc1区域中创建新的负载均衡器。 再次注意,负载平衡器及其目标Droplet需要位于相同的区域,因此请务必使用您的Droplet所在的区域:
doctl compute load-balancer create \
--name load-balancer-1 \
--region nyc1 \
--forwarding-rules entry_protocol:http,entry_port:80,target_protocol:http,target_port:80
此命令在nyc1
区域中创建名为load-balancer-1
。 每个负载均衡器需要至少一个规则,在--forwarding-rules
标志下。 这些规则描述了负载平衡器如何接受流量以及如何将其转发到目标上。 上述转发规则表示我们正在将端口80上的HTTP流量直接传递到目标服务器。
其他 - --forwarding-rules
协议选项是https
和tcp
,您可以为入口和目标选择任何有效的端口。 如果需要指定多个转发规则,请使用引号将整个规则列表环绕起来,并在每条规则之间使用空格。 以下示例将启用HTTP和HTTPS转发:
--forwarding-rules "entry_protocol:http,entry_port:80,target_protocol:http,target_port:80 entry_protocol:https,entry_port:443,target_protocol:https,target_port:443"
我们刚刚运行的create
命令将输出有关我们新的负载平衡器的信息:
OutputID IP Name Status Created At Algorithm Region Tag Droplet IDs SSL Sticky Sessions Health Check Forwarding Rules
ae3fa042-bfd2-5e94-b564-c352fc6874ef load-balancer-1 new 2017-05-10T19:28:30Z round_robin nyc1 false type:none,cookie_name:,cookie_ttl_seconds:0 protocol:http,port:80,path:/,check_interval_seconds:10,response_timeout_seconds:5,healthy_threshold:5,unhealthy_threshold:3 entry_protocol:http,entry_port:80,target_protocol:http,target_port:80,certificate_id:,tls_passthrough:false
注意上面突出显示的负载均衡器的ID,我们将在下一步中使用它来添加我们的目标Droplet。 还有一些我们没有设置的默认配置的信息,如健康检查规则和粘性会话。 您可以在必备的负载均衡器文章中找到有关这些选项的更多信息。 要了解有关如何使用doctl
设置这些选项的详细信息,可以始终使用--help
标志运行create
命令。 对于负载均衡器的创建,这将是这样的:
doctl compute load-balancer create --help
这将输出所有可用的命令行标志和选项的列表。 您可以在任何doctl
命令上使用--help
标志。
现在我们的Load Balancer已经创建,我们需要添加目标Droplet。 我们将在下一节中做。
第3步 - 将Droplet添加到负载平衡器
我们再次列出我们两个Droplet的信息,所以我们可以得到他们的ID:
doctl compute droplet list web-*
OutputID Name Public IPv4 Private IPv4 Public IPv6 Memory VCPUs Disk Region Image Status Tags
48603683 web-1 111.111.111.111 111.111.111.333 512 1 20 nyc1 Ubuntu LAMP on 16.04 active
48603684 web-2 111.111.111.222 111.111.111.444 512 1 20 nyc1 Ubuntu LAMP on 16.04 active
ID在上面的示例输出中突出显示。 确保使用您的实际ID,而不是示例。
现在我们使用add-droplets
命令将目标add-droplets
添加到我们的负载平衡器。 指定我们在上一步中创建的负载平衡器的ID:
doctl compute load-balancer add-droplets
ae3fa042-bfd1-4e94-b564-c352fc6874ef \
--droplet-ids 48463543,48463544
我们现在可以使用get
命令来检索我们的负载均衡器的更新信息:
doctl compute load-balancer get ae3fa042-bfd1-4e94-b564-c352fc6874ef
OutputID IP Name Status Created At Algorithm Region Tag Droplet IDs SSL Sticky Sessions Health Check Forwarding Rules
ae3fa042-bfd1-4e94-b564-c352fc6874ef 111.111.111.555 load-balancer-1 active 2017-05-10T19:28:30Z round_robin nyc1 48603683,48603684 false type:none,cookie_name:,cookie_ttl_seconds:0 protocol:http,port:80,path:/,check_interval_seconds:10,response_timeout_seconds:5,healthy_threshold:5,unhealthy_threshold:3 entry_protocol:http,entry_port:80,target_protocol:http,target_port:80,certificate_id:,tls_passthrough:false
请注意,状态现在已active
,我们分配了IP,并列出了我们的目标Droplet。 在浏览器中浏览此新的负载平衡IP,再次加载test.html
页面。 网址将如下所示:
http://load-balancer-1_ip_address/test.html
您的浏览器将从web-1或web-2加载消息。 刷新页面,您应该看到其他服务器的消息。 我们的负载平衡器处于循环模式,这意味着它会向每个请求列表中的下一个Droplet发送连接。 替代方案是最小连接模式,其中负载平衡器将新的流量发送到具有最少活动连接的目标。
现在我们知道我们的负载均衡器正在工作,我们来禁用服务器,看看它如何处理中断。
第4步 - 测试失败
负载平衡器的一大优点是增加了对各个后端Web服务器的问题的容忍度。 负载均衡器以预定的间隔运行运行状况检查(默认情况下每隔10秒)。 默认运行状况检查是在目标服务器上获取网页。 如果此检查连续几次失败,目标将被取出旋转,并且在其恢复之前不会发送流量。
我们来测试故障切换功能,通过健康检查失败。 SSH回到web-2 :
doctl compute ssh web-2
现在关闭Apache Web服务器:
systemctl stop apache2
返回浏览器并刷新负载平衡页面几次。 起初你可能会得到一些503服务不可用的错误。 默认情况下,从池中删除服务器之前,负载平衡器等待三次运行状况检查失败。 这将需要大约30秒钟。 之后,您只会看到web-1的响应。
启动Apache备份web-2 :
systemctl start apache2
再次,在短时间之后,负载平衡器将检测到web-2已经启动,并且它将被添加回池中。 刷新页面时,您将开始看到web-2响应。
您的负载平衡器现在恢复健康。
继续阅读可以采取的一些后续步骤,使您的负载平衡器生产就绪。
结论
在本教程中,我们使用doctl
创建一个DigitalOcean负载平衡器和一些后端Web服务器,配置了负载均衡器以向后端服务器发送HTTP流量,并测试了负载平衡器的运行状况检查功能。 您可以采取以下几个步骤来使您的负载平衡器准备投入生产:
- 您需要在负载均衡器上指定一个域名,因此您的用户不会输入不友好的IP地址。 您可以通过我们的教程如何使用DigitalOcean设置主机名来学习如何做到这一点 。
- DigitalOcean可以让您标记您的Droplet,以便您可以保持它们的组织,并将一组滴滴作为一组。 您可以配置负载平衡器,以将流量发送到特定标签中的所有Droplet,而不是单独添加Droplet。 这将允许您更加动态地向池添加新的后端服务器。 您可以了解DigitalOcean标签如何标记DigitalOcean Droplet 。
- 如果您需要将HTTPS安全性添加到负载平衡网站,我们将通过以下两种不同的方式实现教程 : SSL通过和SSL终止 。