`
hulianwang2014
  • 浏览: 694945 次
文章分类
社区版块
存档分类
最新评论
  • bcworld: 排版成这样,一点看的欲望都没有了
    jfinal

一种服务器的负载均衡选取算法

 
阅读更多

在很多分布式系统里面会遇到一个均衡节点选取的问题:一般是1个负载管理服务器,多个应用服务单元。当有连接或者业务来是,先会去询问负载管理器获取一个负载轻的服务单元,一般的选取就是选取负载最轻的那个。通常情况下是不会有问题的,如果你的应用服务器单元跑的是类似视频服务这种应用,就会出现这样一种情况,某个视频服务A崩溃或者异常了,这个视频服务的所有用户在瞬间会转移到负载最轻的B上,这个时候可能B也异常了,B 和A的用户又全部转到C,这样会产生多咪若效应,所有的服务在瞬间全部不可用。碰到这样的问题我们该怎么避免?问题的根本是负载评估是周期性的,不是每接入一个用户就报一次负载给负载管理器。最理想的是,根据负载管理上所有单元的负载做权重随机。

算法描述如下

假设有N个服务单元,(服务单元的负载是1 ~ 100,100是满负荷运转)。他们的负载分别是L1 L2 L3 .... Ln。

第i台服务的选中的权值 Ti = 100 - Li;

那么整个掉落区间就为 Mn= T1 + T2 + T3 + ... + Tn;

T0 = 0;

随进产生一个0 ~ Mn之间的数V,如果 V < T0 + T1 +...Ti 并且V > T0 + T1 + ... +T(i - 1),那么就 选取第i台服务作为处理新业务的服务单元。


代码实现:

节点负载结构:

typedef struct NodeLoadInfo
{
	uint32_t	node_id;		//节点ID
	uint16_t	node_load;		//节点负载值,0到100,100表示负载最大

	NodeLoadInfo()
	{
		node_id = 0;
		node_load = 100;
	};
}NodeLoadInfo;
选取区间结构:

typedef struct NodeRange
{
	int32_t		min_value;//T0 + T1 + ... + T(i-1)
	int32_t		max_value;//T0 + T1 + ... + Ti
	uint32_t	node_id;//节点的服务ID

	NodeRange()
	{
		min_value = 0;
		max_value = 0;
		node_id = 0;
	};
}NodeRange;
负载选取器的实现接口:

class CNodeLoadManager
{
public:
	CNodeLoadManager();
	~CNodeLoadManager();

	void			add_node(const NodeLoadInfo& info);//添加一个新的节点负载
	void			update_node(const NodeLoadInfo& info);//更新一个节点的负载
	void			del_node(uint32_t node_id);//删除一个节点

	uint32_t		select_node();//选取一个适合的节点

private:
	NodeLoadInfoMap	node_info_map_;		//节点负载表
	NodeRangeArray	node_ranges_;		//一定周期的概率区间表
	
	bool			create_range_;	//是否需要重建概率选取表
	int32_t			region_;	//概率全区间
};
在上面的接口当中,select_node是核心函数,一下是select_node的伪代码实现:

uint32_t select_node()
{
	uint32_t ret = 0;

	node_ranges_.clear();
	region_ = 0;

	int32_t interval = 0;
	NodeRange range;
	//计算各个节点的掉落区间
	for(NodeLoadInfoMap::iterator it = node_info_map_.begin(); it != node_info_map_.end(); ++it)
	{
		if(it->second.node_load <= MAX_LOAD_VALUE) //计算负载区间,如果负载太大,不参与计算
		{
			interval = MAX_LOAD_VALUE - it->second.node_load + 1;

			range.node_id = it->second.node_id;
			range.min_value = region_;
			region_ += interval;
			range.max_value = region_ - 1;

			node_ranges_.push_back(range);
		}
	}

	if(region_ > 0) //随机概率选取
		ret = locate_server(region_);

	return ret;
}
在上面的代码中,实现了区间的计算。locate_server函数查找对应的服务节点,伪代码:

uint32_t locate_server(int32_t region)
{
	uint32_t ret = 0;

	//产生一个随机数
	int32_t seed = rand() % region;
	int32_t ranges_size = node_ranges_.size();

	int32_t max_pos = ranges_size;
	int32_t min_pos = 0;
	int32_t pos = 0;

	//2分法查询掉落到的节点
	do {
		pos = (min_pos + max_pos) / 2;
		if(pos > ranges_size - 1){
			ret = node_ranges_[ranges_size - 1].node_id;
			break;
		}

		if(pos < 0){
			ret = node_ranges_[0].node_id;
			break;
		}

		if(node_ranges_[pos].max_value >= seed && node_ranges_[pos].min_value <= seed){
			ret = node_ranges_[pos].node_id;
			break;
		}
		else if(node_ranges_[pos].max_value < seed){
			min_pos = pos + 1;
		}
		else if(node_ranges_[pos].min_value > seed){
			max_pos = pos - 1;
		}
	} while (true);

	return ret;
}

完全的代码在revolver的base_nodes_load.hbase_nodes_load.cpp之中。


测试结果:

我们模拟了10个节点,随机指定10 ~ 100的负载值,然后选取1000次业务处理的节点,结果如下图:



从结果看来是比较均衡的选取,比较理想。



分享到:
评论

相关推荐

    负载均衡算法在智慧矿山软件平台中的应用

    针对现有负载均衡算法在处理智慧矿山系统数据时存在处理速度慢、无法合理利用现有资源完成任务调度等问题,提出一种基于布谷鸟搜索的加权最小连接数(CS-WLC)算法,并将其应用于智慧矿山软件平台解决负载均衡问题。...

    基于多网关的无线Mesh网络负载均衡调度算法

    在已有的WMN负载均衡算法基础上,提出一种新的基于多网关协作机制的WMN负载均衡调度算法。该算法以源节点到网关节点的跳数信息和网络负载信息相结合作为网关的选择和切换标准,通过多个网关的协作机制,结合高效的网关...

    论文研究-支持向量机的一种特征选取算法.pdf

    提出一种新的特征选取算法,实验表明,该特征选取算法与一般特征选取算法(如F-Score算法)相比,对同一测试数据集计算的结果具有相同的降序排列结果,而且有更好的特征刻画量化指标,分界线更明显,表明新的特征...

    详解Nginx服务器之负载均衡策略(6种)

    负载均衡用于从“upstream”模块定义的后端服务器列表中选取一台服务器接受用户的请求。一个最基本的upstream模块是这样的,模块内的server是服务器列表: #动态服务器组 upstream dynamic_zuoyu { server ...

    论文研究-一种无线传感器网络环境下的查询路由与负载均衡机制.pdf

    针对无线传感器网络节点数量多、通信距离短、能量有限的特点, 提出一种查询增益路由算法以及基于路由的负载均衡机制。查询增益路由算法通过查询增益矩阵维护路由信息, 并依据历史查询成功记录来选取路由节点; 而基于...

    计算节点性能评价及负载均衡调度

    对当前各种负载指标进行分析,并在此基础上提出了两种相对适中的计算节点性能评价指标,通过分析对比最终选取其中一种,即“CPU利用率*连接数”,并以此种指标作为节点负载大小的量度,实现了简单的负载均衡系统。...

    一种改进的LSSVM支持向量预选取算法

    是最小二乘支持向量机的缺点之一,针对导致模型复杂度提高和模型训练、识别速度降低的问题,从数据挖掘和支持向量的几何分布含义两个方面出发,提出了一种新的支持向量预选取算法。一方面对原数据集的每类数据分别进行K...

    一种改进的K-means初始聚类中心选取算法

    在传统的k-means聚类算法中,聚类结果会随着初始聚类中心点的不同而波动,针对这个确定,提出一种优化初始聚类中心的算法。

    论文研究-针对规则更新操作的测试数据包选取算法.pdf

    基于此,提出了一种针对规则更新操作的测试数据包选取算法PCRU。该算法从两处选取测试数据包,即被添加或者被删除的规则的顶点和规则冲突区域。理论分析和仿真实验表明,与现有测试算法相比,在进行规则更新时,PCRU...

    论文研究-GF(p)上椭圆曲线密码的并行基点选取算法研究.pdf

    提出一种GF(p)上椭圆曲线密码系统的并行基点选取算法,该算法由并行随机点产生算法和并行基点判断算法两个子算法组成,给出了算法性能的理论分析和实验结果。结果表明:各并行处理器单元具有较好的负载均衡特性;当执行...

    基于SDN的动态负载均衡策略_刘毅.pdf

    针对SDN中静态网络结构不能适应动态流量变化所引起的控制器负载不均衡问题,提出一种阶段式动态负载均衡策略。阶段一,以控制器负载均值化为目标,确定迁入控制器候选集,且综合考虑时延、负载,设计指标函数,选取待迁移...

    论文研究-SDN中基于迁移优化的控制器负载均衡策略.pdf

    针对SDN多控制器负载均衡过程中交换机迁移僵化和迁移冲突问题,对现有的交换机迁移模型实施优化,提出了一种阶段式控制器负载均衡策略。在阶段1,综合控制器的各类开销代价,基于遗传算法优化迁移目标,选取交换机...

    分布式协调工具-ZooKeeper实现动态负载均衡

    而消费者就须要在这些对等的服务器中选择一个来执行相关的业务逻辑,其中比较典型的是消息中间件中的生产者,消费者负载均衡。 消息中间件中发布者和订阅者的负载均衡,linkedin开源的KafkaMQ和阿里开源的 metaq都...

    网络安全员题库答案解析.xls

    23 关于LVS说法错误的是( ) ipvs和iptables能同时共存于系统 通过向ipvs中写规则来过滤数据流,从而达到分发控制数据流向,均衡服务器负载的目的 24 路由器是工作在(____)层的设备。 物理层 网络层 25 国际标准化...

    一种用于WLAN室内定位的新AP选取算法.docx

    一种用于WLAN室内定位的新AP选取算法.docx

    基于负载均衡的联合路由策略 (2009年)

    针对目前 IP over WDM网络中的路由算法在负载均衡方面存在的问题,提出了一种考虑负载均衡的新型联合路由算法———负载均衡算法(LBA) 。该算法在链路(包括逻辑链路和物理链路)权值分配过程中考虑了节点负载的影响,...

    [Oracle] RAC 之 – 负载均衡深入解析

    1. 客户端负载均衡配置方法是在客户端tnsnames.ora文件中设置LOAD_BALANCE=YES,当客户端发起连接时,会从地址列表中随机选取一个,把连接请求随机分散给各个实例。这个技术的最大缺点在于不能根据各个实例的真实...

    一种新的基于STD和SLR融合的AP选取算法.docx

    一种新的基于STD和SLR融合的AP选取算法.docx

    基于一种改进粒子群算法的SVM参数选取

    基于一种改进粒子群算法的SVM参数选取,主要介绍一种新的优化算法

    易语言源码魔术棒选取算法.rar

    易语言源码魔术棒选取算法.rar 易语言源码魔术棒选取算法.rar 易语言源码魔术棒选取算法.rar 易语言源码魔术棒选取算法.rar 易语言源码魔术棒选取算法.rar 易语言源码魔术棒选取算法.rar

Global site tag (gtag.js) - Google Analytics