动态调整负载均衡切换流量

这篇是从我百度的博客转过来的,要不然今年都没更新过javaeye.

原文地址是 http://hi.baidu.com/icej/blog/item/c4f964f079f788b3a50f5298.html

 

在总部的Puppet集群的管理中,美国大师介绍了他为保证Puppet集群稳定会动态的对一些访问流量做取舍。

我们吸取了经验,在之前提到的CMDB和Collectd实时分析流量的基础上,计划给我们的一些重要系统提供这样的服务。

我们的一些重要系统特别是还没有部署在云计算平台的系统,系统的负载取决于其它系统的请求或用户的访问状态,一般我们部署业务都会按照预计最大访问量来评估和规划服务器数量,但对于内部系统,系统的压力不一定总是保持在一个恒定的大压力下,有时候会为了节省资源一个大的服务下会在配置几个小服务,或者这一重要服务本身的请求流量在系统中可以被划分为三六九等,比如实时支持产品的流量请求要优先满足,支持内部系统异步请求的流量可以暂时扔掉或降低,属于二流流量。

 

这样的情况下,我们计划开发一套简单的系统,可以根据当前的负载动态对流量或服务进行变更,当压力在短时间内增大,并随后降低的过程中,优先保证重要的请求,其它请求暂时忽略,以保证服务稳定,当然如果压力时刻保持在很大,这说明需要增加服务器了,要是乎高乎低,能够保证一个周期大压力,一个周期压力很低,并且向我描述的可以划分流量质量则可以这么做。






如图,我们设计了2组Haproxy pool,一个是重要的业务请求,一个是低级别请求,两组proxy共同指向一组业务服务器。CMDB中保存了proxy,pool和业务服务器的指向关系,通过pool名可以查到下面的HAproxy服务器和代理的业务服务器,通过HAproxy的名字可以查询它所代理的pool和业务服务器。

collectd filter会保留下所有业务服务器的load,调度脚步会定时查询并计算当前平均Load是否超过设置上线,当超过上线则会通过API去修改CMDB中的HAproxy pool 业务服务器的对照关系,对普通业务的HAproxy中的一台删除取消代理,也就是当前的所有请求量下降了1成,vip业务没有影响,只是降低了普通业务的请求。 当一个周期调度后发现load没有降低,则继续取消下一个HAproxy代理,以此类推直到所有普通业务的proxy均停止工作,或load稳定在安全值,直到load下降,逐个proxy恢复代理,在这个反复调整的过程中调度程序会根据load不断增加或减少普通业务的Proxy,以保证重要业务的性能良好,而尽可能恢复普通业务的流量,直到找到一个平衡点。 这个周期需要反复通过观察才能确定,要避开抖动。

这样当压力增大时,重要服务始终保持良好,而可以停止工作的服务,则被迫返回暂停。这种方式非常简单,不需要太复杂的设计,程序也非常简单,SHELL就可以实现,性价比非常高,属于好用不贵。

 

猜你喜欢

转载自icej.iteye.com/blog/1345178