开头先理解一下所谓的“均衡”
不能狭义地理解为分配给所有实际服务器一样多的工作量 , 因为多台服务器的承载能力各不相同 , 这可能体现在硬件配置、网络带宽的差异 , 也可能因为某台服务器身兼多职 , 我们所说的“均衡” , 也就是希望所有服务器都不要过载 , 并且能够最大程序地发挥作用 。
一、http重定向
当http代理(比如浏览器)向web服务器请求某个URL后 , web服务器可以通过http响应头信息中的Location标记来返回一个新的URL 。这意味着HTTP代理需要继续请求这个新的URL , 完成自动跳转 。
性能缺陷:
1、吞吐率限制
主站点服务器的吞吐率平均分配到了被转移的服务器 。现假设使用RR(Round Robin)调度策略 , 子服务器的最大吞吐率为1000reqs/s , 那么主服务器的吞吐率要达到3000reqs/s才能完全发挥三台子服务器的作用 , 那么如果有100台子服务器 , 那么主服务器的吞吐率可想而知得有大?相反 , 如果主服务的最大吞吐率为6000reqs/s , 那么平均分配到子服务器的吞吐率为2000reqs/s , 而现子服务器的最大吞吐率为1000reqs/s , 因此就得增加子服务器的数量 , 增加到6个才能满足 。
2、重定向访问深度不同
有的重定向一个静态页面 , 有的重定向相比复杂的动态页面 , 那么实际服务器的负载差异是不可预料的 , 而主站服务器却一无所知 。因此整站使用重定向方法做负载均衡不太好 。
我们需要权衡转移请求的开销和处理实际请求的开销 , 前者相对于后者越小 , 那么重定向的意义就越大 , 例如下载 。你可以去很多镜像下载网站试下 , 会发现基本下载都使用了Location做了重定向 。
二、DNS负载均衡
DNS负责提供域名解析服务 , 当访问某个站点时 , 实际上首先需要通过该站点域名的DNS服务器来获取域名指向的IP地址 , 在这一过程中 , DNS服务器完成了域名到IP地址的映射 , 同样 , 这样映射也可以是一对多的 , 这时候 , DNS服务器便充当了负载均衡调度器 , 它就像http重定向转换策略一样 , 将用户的请求分散到多台服务器上 , 但是它的实现机制完全不同 。
使用dig命令来看下”baidu”的DNS设置
文章插图
可见baidu拥有三个A记录
相比http重定向 , 基于DNS的负载均衡完全节省了所谓的主站点 , 或者说DNS服务器已经充当了主站点的职能 。但不同的是 , 作为调度器 , DNS服务器本身的性能几乎不用担心 。因为DNS记录可以被用户浏览器或者互联网接入服务商的各级DNS服务器缓存 , 只有当缓存过期后才会重新向域名的DNS服务器请求解析 。也说是DNS不存在http的吞吐率限制 , 理论上可以无限增加实际服务器的数量 。
特性:
1、可以根据用户IP来进行智能解析 。DNS服务器可以在所有可用的A记录中寻找离用记最近的一台服务器 。
2、动态DNS:在每次IP地址变更时 , 及时更新DNS服务器 。当然 , 因为缓存 , 一定的延迟不可避免 。
不足:
1、没有用户能直接看到DNS解析到了哪一台实际服务器 , 加服务器运维人员的调试带来了不便 。
2、策略的局限性 。例如你无法将HTTP请求的上下文引入到调度策略中 , 而在前面介绍的基于HTTP重定向的负载均衡系统中 , 调度器工作在HTTP层面 , 它可以充分理解HTTP请求后根据站点的应用逻辑来设计调度策略 , 比如根据请求不同的URL来进行合理的过滤和转移 。
3、如果要根据实际服务器的实时负载差异来调整调度策略 , 这需要DNS服务器在每次解析操作时分析各服务器的健康状态 , 对于DNS服务器来说 , 这种自定义开发存在较高的门槛 , 更何况大多数站点只是使用第三方DNS服务 。
4、DNS记录缓存 , 各级节点的DNS服务器不同程序的缓存会让你晕头转向 。
5、基于以上几点 , DNS服务器并不能很好地完成工作量均衡分配 , 最后 , 是否选择基于DNS的负载均衡方式完全取决于你的需要 。
推荐阅读
- 老人每天晚上坚持揉它十分钟,返老还童不是梦!
- 关于垃圾收集器Parallel Scavenge的GCTimeRatio参数的理解
- 什么是负载隔离开关
- 怎么理解可怜天下父母心 可怜天下父母心的意思
- 如何理解人生 什么是人生
- 该如何理解死缓与无期 为什么说死缓比无期好
- 博士后|博士和“博士后”看起来差别不大,实际上却大有不同,别理解错了
- 画家和牧童阅读理解 画家和牧童
- 伏三伏三九的含义解释怎么理解的 三伏天什么意思
- 天气|“回南天”多夸张?网友纷纷晒视频:北方人难以理解的恐惧