域名解析是客户端访问系统的第一步。在架构设计中,DNS Server除了解析域名,还能干点什么呢?又有哪些“挖坑”的用法需要避免呢?
典型的互联网架构中,我们通过Nginx的反向代理来做负载均衡。客户端通过域名访问时,DNS Server将域名解析到nginx服务器的IP,客户端先访问nginx,nginx再将请求分发到下层的web-server。
我们可以通过增加web-server来扩充web层的性能,但nginx仍是整个系统的唯一入口。如果系统吞吐超过nginx的单机性能极限,此时就需要通过DNS轮询来水平扩展nginx了。
具体做法是:增加多台nginx,对于同一个域名配置多个ip,每个ip指向一台nginx。每次DNS解析,会轮询返回不同的ip,这样就能实现nginx的水平扩展了。
既然DNS轮询可以将请求分派到不同的ip上,那可不可以去掉nginx,直接用DNS轮询来做负载均衡呢?
通过DNS来实施负载均衡虽然能减少一层网络请求,但也有问题。
首先,DNS只具备解析功能,并不能保证ip对应的服务器可用。而nginx做反向代理时,与web-server之间有保活探测机制,当web-server挂掉时,能够自动迁移流量;
其次,当web-server需要扩容时,虽然可以通过增加域名解析的ip来实现扩容,但解析的生效时间长,而nginx则是完全自己可控,扩容更实时、更方便。
因为上面两个原因,所以架构上,一般都使用nginx来做高可用反向代理。