一、缘起
一个
http
请求从客户端到服务端,整个执行流程是怎么样的呢?
一个典型流程如上:
(1)
客户端通过域名
daojia.com
请求
dns-server
(2)dns-server
返回域名对应的外网
ip(1.2.3.4)
(3)
客户端访问外网
ip(1.2.3.4)
向反向代理
nginx
(4)
反向代理
nginx
配置了多个
后端
web-server
服务
内网
ip(192.168.0.1/192.168.0.2)
(5)
请求最终落到某一个
web-server
进行处理
其中,第一个步骤域名
daojia.com
到外网
ip(1.2.3.4)
的转换,发生在整个服务端外部,服务端不可控。
架构设计时,能够巧用
dns
做一些什么事情呢,是本文要讨论的问题。
二、
反向代理
水平扩展
典型的互联网架构中,可以通过增加
web-server
来扩充
web
层的性能,但
反向代理
nginx
仍是整个系统的唯一入口
,
如果系统吞吐超过
nginx
的性能极限,难以扩容
,此时就需要
dns-server
来配合
水平扩展。
具体做法是:在
dns-server
对于同一个域名可以配置多个
nginx
的外网
ip
,
每次
dns解析
请求,轮询返回不同的
ip
,这样就能实现
nginx
的水平扩展,这个方法叫“
dns
轮询
”。
三、
web-server
负载均衡
既然“
dns
轮询”可以将同一个域名的流量均匀分配到不同的
nginx
,那么也可以利用它来做
web-server
的负载均衡:
(1)架构中
去掉
nginx
层
(2)将多个
web-server
的
内网
ip
直接改为外网
ip
(3)在
dns
-server
将域名对应的外网
ip
进行
轮询
解析
和
nginx
相比,
dns
来实施负载均衡有什么优缺点呢?
优点
:
-
利用第三方
dns
实施,服务端架构不用动
-
少了一层网络请求
不足
:
-
dns
只具备解析功能,不能保证对应外网
ip
的可用性
(即使能够做
80
口的探测,实时性肯定也是比
nginx
差很多的),而
nginx
做反向代理时,与
web-server
之间有保活探测机制,当
web-server
挂掉时,能够自动迁移流量
-
当
web-server
需要扩容时,通过
dns
扩容生效时间长
,而
nginx
是服务端完全自己可控的部分,
web-server
扩容更实时更方便
因为上面两个原因,
架构上
很少取消反向代理层
,而直接使用
dns
来实施负载均衡。
四、用户就近访问
如文章“缘起”中所述,
http
请求的第一个步骤域名到外网
ip
的转换,发生在整个服务端外部,服务端不可控,那么如果要实施“
根据客户端
ip
来分配最近的服务器机房访问
”,就只能在
dns-server
上做了:
(1)
电信用户想要访问某一个服务器资源
(2)
浏览器向
dns-server
发起服务器域名解析请求
(3)dns-server
识别出访问者是电信用户
(4)dns-server
将电信机房的