配置过Apache+Mod_JK+Tomcat的同学应该记得有一个workers.properties的文件,里面的格式如下:
worker.list = www
worker.NODE0.port=8800
worker.NODE0.host=localhost
worker.NODE0.type=ajp13
worker.NODE0.lbfactor = 1
worker.NODE0.redirect=NODE1
worker.NODE1.port=8801
worker.NODE1.host=localhost
worker.NODE1.type=ajp13
worker.NODE1.lbfactor = 1
worker.NODE1.redirect=NODE0
worker.www.type=lb
worker.www.balance_workers=NODE0,NODE1
worker.www.sticky_session=True
第一行:定义了www这个工作器,在这里他是一个虚拟的工作器。
第二行至第六行:定义了节点NODE0,其中lbfactor为负载均衡的权值,redirect定义了当这个节点失效时由谁来接管他的工作
最末一样定义了www对会话是有粘性的,也就是说对同一个会话在会话期间不会在NODE0和NODE1之间来回切换。
这就是典型的一个负载均衡机制,下面就跟据上面提到的简易负载均衡配置要点来构造我们的负载均衡器。
第一步,定义一个节点数组,至少包括节点名称、节点URL以及节点权重,考虑到对节点的均衡负载,我们还需要加入负载计数(在这里我们把权重为0的节点视为失效节点)
第二步,在各节点放置一个健康检查页面,同时在主站开发一个接口页面,通过主站页面的隐形JS调用向主站上报健康状态。
第三步,需要定义至少一个负载均衡工作器,他返回一个可用的节点URL。
那么我们在程序中定义一个函数,名字叫做getnode(),返回值为被分配的节点URL
为了实现粘性会话,我们需要这个函数在同一个会话中返回同一个节点名称。(在动态页面中粘性会话能很好的保全会话级变量,而在静态页面中可以很好的处理本地的缓存)。
其在内部处理上对各节点的权重及负载计数进行简单计算,以实现对节点的智能分配。
第四步,在程序中使用这个函数替换静态内容URL的站点部分,实现负载均衡。
第五步,针对不同的内容类型以及分布定义更多的负载均衡工作器并在页面中引用。
上面就是负载均衡器的思路,当然要实现就近访问还需要建立一个IP地址库,在getnode()函数拿着来访IP进行匹配,找到花费最小的节点并返回。
这些定义都属于Application级别的,需要存放在Application容器中。
如果有人说,这个squid不是可以很简单的搞定吗?是这样的,使用squid可以diy自己的CDN,但我们不是铁定了去租用廉价的虚拟主机吗。
本文出自 “专注信息系统一体化建设” 博客,谢绝转载!