在很多分布式系统里面会遇到一个均衡节点选取的问题:一般是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)算法,并将其应用于智慧矿山软件平台解决负载均衡问题。...
在已有的WMN负载均衡算法基础上,提出一种新的基于多网关协作机制的WMN负载均衡调度算法。该算法以源节点到网关节点的跳数信息和网络负载信息相结合作为网关的选择和切换标准,通过多个网关的协作机制,结合高效的网关...
提出一种新的特征选取算法,实验表明,该特征选取算法与一般特征选取算法(如F-Score算法)相比,对同一测试数据集计算的结果具有相同的降序排列结果,而且有更好的特征刻画量化指标,分界线更明显,表明新的特征...
负载均衡用于从“upstream”模块定义的后端服务器列表中选取一台服务器接受用户的请求。一个最基本的upstream模块是这样的,模块内的server是服务器列表: #动态服务器组 upstream dynamic_zuoyu { server ...
针对无线传感器网络节点数量多、通信距离短、能量有限的特点, 提出一种查询增益路由算法以及基于路由的负载均衡机制。查询增益路由算法通过查询增益矩阵维护路由信息, 并依据历史查询成功记录来选取路由节点; 而基于...
对当前各种负载指标进行分析,并在此基础上提出了两种相对适中的计算节点性能评价指标,通过分析对比最终选取其中一种,即“CPU利用率*连接数”,并以此种指标作为节点负载大小的量度,实现了简单的负载均衡系统。...
是最小二乘支持向量机的缺点之一,针对导致模型复杂度提高和模型训练、识别速度降低的问题,从数据挖掘和支持向量的几何分布含义两个方面出发,提出了一种新的支持向量预选取算法。一方面对原数据集的每类数据分别进行K...
在传统的k-means聚类算法中,聚类结果会随着初始聚类中心点的不同而波动,针对这个确定,提出一种优化初始聚类中心的算法。
基于此,提出了一种针对规则更新操作的测试数据包选取算法PCRU。该算法从两处选取测试数据包,即被添加或者被删除的规则的顶点和规则冲突区域。理论分析和仿真实验表明,与现有测试算法相比,在进行规则更新时,PCRU...
提出一种GF(p)上椭圆曲线密码系统的并行基点选取算法,该算法由并行随机点产生算法和并行基点判断算法两个子算法组成,给出了算法性能的理论分析和实验结果。结果表明:各并行处理器单元具有较好的负载均衡特性;当执行...
针对SDN中静态网络结构不能适应动态流量变化所引起的控制器负载不均衡问题,提出一种阶段式动态负载均衡策略。阶段一,以控制器负载均值化为目标,确定迁入控制器候选集,且综合考虑时延、负载,设计指标函数,选取待迁移...
针对SDN多控制器负载均衡过程中交换机迁移僵化和迁移冲突问题,对现有的交换机迁移模型实施优化,提出了一种阶段式控制器负载均衡策略。在阶段1,综合控制器的各类开销代价,基于遗传算法优化迁移目标,选取交换机...
而消费者就须要在这些对等的服务器中选择一个来执行相关的业务逻辑,其中比较典型的是消息中间件中的生产者,消费者负载均衡。 消息中间件中发布者和订阅者的负载均衡,linkedin开源的KafkaMQ和阿里开源的 metaq都...
23 关于LVS说法错误的是( ) ipvs和iptables能同时共存于系统 通过向ipvs中写规则来过滤数据流,从而达到分发控制数据流向,均衡服务器负载的目的 24 路由器是工作在(____)层的设备。 物理层 网络层 25 国际标准化...
一种用于WLAN室内定位的新AP选取算法.docx
针对目前 IP over WDM网络中的路由算法在负载均衡方面存在的问题,提出了一种考虑负载均衡的新型联合路由算法———负载均衡算法(LBA) 。该算法在链路(包括逻辑链路和物理链路)权值分配过程中考虑了节点负载的影响,...
1. 客户端负载均衡配置方法是在客户端tnsnames.ora文件中设置LOAD_BALANCE=YES,当客户端发起连接时,会从地址列表中随机选取一个,把连接请求随机分散给各个实例。这个技术的最大缺点在于不能根据各个实例的真实...
一种新的基于STD和SLR融合的AP选取算法.docx
基于一种改进粒子群算法的SVM参数选取,主要介绍一种新的优化算法
易语言源码魔术棒选取算法.rar 易语言源码魔术棒选取算法.rar 易语言源码魔术棒选取算法.rar 易语言源码魔术棒选取算法.rar 易语言源码魔术棒选取算法.rar 易语言源码魔术棒选取算法.rar