更新:查看我在AWS上最终设置的解决方案提供的答案。
我目前正在尝试实现Digital Ocean上我的应用服务器的全局负载均衡层的方法,但还有一些部分我需要整合。
目标
通过将所有连接路由到SFO、NYC、LON和最终的新加坡的最近的“集群”服务器,为我的用户提供高可用性的服务。
此外,我最终希望编写一个守护进程来自动化维护该系统,可以监视、扩展和修复系统中的任何服务器。或者我将组合各种服务以实现相同的自动化目标。首先,我需要手动弄清楚如何做。
堆栈
- Ubuntu 14.04
- Nginx 1.4.6
- node.js
- 来自Compose.io(前身为MongoHQ)的MongoDB
全局域名分配
一旦我把所有东西都连起来,我的域名会像这样:
**GLOBAL**
global-balancing-1.myapp.com
global-balancing-2.myapp.com
global-balancing-3.myapp.com
**NYC**
nyc-load-balancing-1.myapp.com
nyc-load-balancing-2.myapp.com
nyc-load-balancing-3.myapp.com
nyc-app-1.myapp.com
nyc-app-2.myapp.com
nyc-app-3.myapp.com
nyc-api-1.myapp.com
nyc-api-2.myapp.com
nyc-api-3.myapp.com
**SFO**
sfo-load-balancing-1.myapp.com
sfo-load-balancing-2.myapp.com
sfo-load-balancing-3.myapp.com
sfo-app-1.myapp.com
sfo-app-2.myapp.com
sfo-app-3.myapp.com
sfo-api-1.myapp.com
sfo-api-2.myapp.com
sfo-api-3.myapp.com
**LON**
lon-load-balancing-1.myapp.com
lon-load-balancing-2.myapp.com
lon-load-balancing-3.myapp.com
lon-app-1.myapp.com
lon-app-2.myapp.com
lon-app-3.myapp.com
lon-api-1.myapp.com
lon-api-2.myapp.com
lon-api-3.myapp.com
如果任何给定区域的任何一层出现了任何压力,我可以启动一个新的droplet来帮助解决:nyc-app-4.myapp.com
,lon-load-balancing-5.myapp.com
等。
当前工作方法
最少三个
global-balancing
服务器接收所有流量。这些服务器采用“DNS轮询”平衡,如本文所示(非常令人困惑):如何配置DNS轮询负载平衡.使用Nginx GeoIP模块和MaxMind GeoIP数据确定任何请求的来源,直至
$geoip_city_continent_code
。global-balancing
层然后将请求路由到适当集群的load-balancing
层中连接最少的服务器:nyc-load-balancing-1
,sfo-load-balancing-3
,lon-load-balancing-2
等。该层也是最少三个droplets。区域
load-balancing
层然后将请求路由到app或api层中连接最少的服务器:nyc-app-2
,sfo-api-1
,lon-api-3
等。
有关Nginx kung fu的详细信息,请参见本教程:Villiage Idiot: Setting up Nginx with GSLB/Reverse Proxy on AWS。有关Nginx负载均衡的更多一般信息,请参见此处和此处。
问题
我应该把global-balancing
服务器放在哪里?
让我觉得奇怪的是,我要么把它们都放在一个地方,要么将该层分散到全球。例如,我将它们全部放在纽约。然后来自法国的人点击我的域名。请求将从法国发送到纽约,然后返回到LON。或者如果我在SFO、NYC和LON中各放一个,那么从多伦多(Parkdale,代表)发出的用户请求仍然可能会被发送到LON,然后再路由回NYC吗?
是否将后续请求路由到同一IP地址?
例如,如果多伦多的用户发送了一个global-balancing
层确定应该前往NYC的请求,则来自相同来源的下一个请求是否直接发送到NYC,或者仍然需要通过最近的global-balancing
服务器(在这种情况下为NYC)随机选择呢?
会话怎么办?
我已经配置了Nginx使用