配置高可用的循环复用DNS负载均衡
提供:ZStack社区
前言
如何利用云主机提供商的全球部署来最合理的分布你的应用?这个话题在技术圈充满争议,不过DNS(即,IP转发列表)应该算是一个好方案。特别是,如果你不想在那些高端网络硬件上砸银子,那么用DNS实现高可用可以说是最好的方案了。
本文以DigitalOcean为例,介绍如何使用管理DNS响应的方式来利用云主机提供商在全球的数据中心分布来实现应用的地域分布、高可用、宕机时间最小化(也就是数据丢失最小化)的部署。
传统的应用部署架构
传统上(也是最常见的情况),大部分应用的相关组件都是部署在同一个地域的,这多半是因为:
- 主机提供商无法提供其他地域的资源
- 跨地域部署的成本太高
- 跨地域部署在技术上难以实现
就算你的应用跑在了多台服务器上,多台服务器通过负载均衡(或反向代理)被访问,就算你的数据库也用类似的方式实现了一定的可靠性与数据丢失的保护措施,但也仍然无法避免由于多个层面同时出错而造成偶尔的宕机。
更加可靠的系统架构,是将数据和服务器分布到全球的不同地域(比如旧金山和纽约)。
高可用
一个业务型应用需要保持7天24小时在线,可能的话最好完全没有中断。如果你的服务器都部署在同一个数据中心内,那么如果这个数据中心出了问题,你的业务就无法继续服务了。而另一方面,跨地域部署能够提供更好的稳定性,提升应用的在线服务等级。
用IT系统设计的话来说,这就叫做高可用。
DigitalOcean目前在两个大陆、五个地域设置了数据中心,因此DigitalOcean的用户有这个条件将自己的应用设计成全球部署。
你可以设置一个浮动IP(Floating IP)作为该应用的公共入口,该浮动IP可以即时的被映射到任意一个指定的云主机上,这使得整个基础架构有更好的灵活性和响应能力。有关浮动IP的用法可参考这篇文章。
高可用应用的部署架构
简单来说,高可用应用的部署会将客户端发来的请求发送到不同的数据中心,并从不同的数据中心获得响应结果以返回给客户端。
此类架构的实现有不同的方法,而DNS应该是最简单、最便宜的方法。
一个极简的DNS配置差不多是这样的:
________________
| |
| CLIENT |
| WEB BROWSER |
|________________|
||
||
_______\/_______
| |
| DNS SERVER |
|________________|
||
||
_______/ \_______
/ \
/ \
____________________ ____________________
| | | |
| SAN FRANCISCO | | SAN FRANCISCO |
|____________________| |____________________|
| ______________ | | ______________ |
| | | | | | | |
| | WEB SERVER | | | | WEB SERVER | |
| | LOAD BALANCE | | | | LOAD BALANCE | |
| | PROXY | | | | PROXY | |
| |_____ _____| | | |_____ _____| |
|________| |________| |________| |________|
|| __ __ ||
||<=====||==================||=====>||
\/ \/ \/ \/
____________________ ____________________
| | | |
| SAN FRANCISCO | | NEW YORK |
|____________________| |____________________|
| ______________ | | ______________ |
| | | | | | | |
| | APP SERVER | | | | APP SERVER | |
| |______ ______| | | |______ ______| |
| ______||______ | | ______||______ |
| | | | | | | |
| | DATABASE |<==================>| DATABASE | |
| |______________| | | |______________| |
|____________________| |____________________|
如何使用DNS实现高可用
当用户在浏览器里访问一个域名时,浏览器会呼叫域名服务器(name server)以询问该域名对应的机器IP。这是通过一系列预定义的规则(比如网络协议)来完成的。当浏览器获得这个IP后,它会将访问请求(以及其他一些数据)发送给这个IP背后的机器,并解析获得的响应内容。
DNS可以记录多个IP对应一个域名,因此可以将多个主机列为一个应用的服务器。
如果是上图所示的那种架构,如果你将两个位于不同地域的负载均衡器/反向代理器的IP列在DNS记录中(每一个地域的负载均衡器为该地域下的、跨数据中心的多个应用服务器进行负载均衡),则当一个数据中心不可用时,浏览器会自动去访问DNS记录中列出的下一个IP,直到成功获取网站内容为止。
这样的负载均衡就叫做循环复用DNS负载均衡(Round Robin DNS load-balancing)。
小结
总结一下上面所说的内容:
- DNS可以针对同一个域名记录多条内容
- DNS可以针对同一个域名返回多个IP
- 当浏览器请求页面时,它会依次尝试列表中的IP直到接收响应为止
- 这些IP应当指向负载均衡器/反向代理服务器,而不是应用服务器
- 接入反向代理的服务器应该位于多个地域
- 当一个数据中心不可用、浏览器无法从这里的IP获取响应时,会尝试请求另一个数据中心的IP
- 因为两个数据中心同时不可用的几率比较小,所以浏览器有很大几率从第二个负载均衡器获得响应
- Web应用服务器应当是无状态的(stateless),以方便负载均衡器进行工作
- 数据库服务器应以多副本的方式(replicated)进行配置。
如何部署高可用的应用
注:本教程可适用于任何编程语言(框架)、任何Web服务器引擎的应用。
设置负载均衡器/反向代理服务器
首先,设置两个或多个负载均衡反向代理,它们将负责应用服务器之间的通讯。
在两个地域启动两个云主机:在DigitalOcean上就是创建两个Droplet,详细可参阅这个教程。
在每个云主机上设置负载均衡/反向代理:安装配置Nginx、Apache或HAProxy,详见“Nginx作为前端代理”、“在Ubuntu上配置HAProxy负载均衡”二文。
获取负载均衡器的IP:输入
/sbin/ifconfig
,找到云主机的IP。比如:inet addr:107.170.40.112
设置DNS记录
DNS A记录(A Records)能够将域名(比如www.digitalocean.com
)翻译成机器能看懂的IP地址。
完成了上述两个负载均衡器的配置之后,接下来就是将两个A记录添加到DigitalOcean的DNS服务里,让你的域名指向这两个IP。
登陆到DigitalOcean的管理界面中,点击左侧的
DNS
菜单,添加域名以指向负载均衡器的云主机。添加新的A记录:点击“Add Record”以添加新的A记录,填入另一个负载均衡器云主机的IP。
设置应用服务器
接下来是应用服务器的设置。
全球分布的实现不仅需要刚才创建的负载均衡服务器,还需要多个应用服务器。我们将创建两个新的云主机作为应用服务器的主机。
注:你也可以在刚才安装负载均衡器的服务器上运行你的应用服务器,然而这不是推荐的做法。
在两个不同的区域创建云主机,比如:
- NY 1和NY 2各一个;
- AMS 1和AMS 2各一个;
- SF 1和NY 2各一个,等等。
创建配置完毕后,在负载均衡器上配置两个应用服务器的代理连接(详细可参考之前介绍的负载均衡器配置文章)。
设置数据库
Web应用多半都是需要数据库的。将应用分布部署在多个服务器上,这其中最大的挑战恐怕就在数据库这块。
针对不同的数据库跨地域多副本的部署方式,有不同的文章介绍,详见:
多副本结构创建完毕后,将应用的数据库连接指向刚才创建的数据库服务器,即可完成。
本文来源自DigitalOcean Community。英文原文:How To Configure DNS Round-Robin Load-Balancing For High-Availability by O.S. Tezer