一个集群若是出现了负载不均衡问题,那么负载最大的机器每每将成为影响系统总体表现的瓶颈和短板。为了不这种状况的发生,须要动态负载均衡机制,以达到实时的最大化资源利用率,从而提高系统总体的吞吐。算法
OceanBase是一个具备自治功能的分布式存储系统,由中心节点RootServer、静态数据节点ChunkServer、动态数据节点UpdateServer以及数据合并节点MergeServer四个Server构成,以下图所示。架构
在一个集群中,Tablet的多个副本分别存储在不一样的ChunkServer,每一个ChunkServer负责一部分Tablet分片数据,MergeServer和ChunkServer通常会一块儿部署。负载均衡
图1.Tablet在三台ChunkServer上的分布分布式
图2.加入一台机器Tablet迁移后的分布.net
客户端链接到OceanBase以后一次读请求的读流程以下图所示:设计
分析以上的流程可知,在第2步客户端选择MergeServer时若是调度不均衡会致使某台MergeServer机器过载;在第4步MergeServer把子请求发送到数据所在的ChunkServer时,因为每一个tablet会有多个副本,选择副本的策略若是不均衡也会形成ChunkServer机器过载[下面为按照此处存在负载不均衡分析]。因为集群部署会在同一台机器会同时启动ChunkServer和MergeServer,没法简单区分过载的模块。接口
若是把热点ChunkServer上非热点Tablet的访问调度到其余Server,是能够缓解流量不均问题的,所以咱们设计了新的负载均衡算法为:以实时统计的ChunkServer上全部tablet的访问次数为Ticket,每次对Tablet的读请求会选择副本中得票率最低的ChunkServer。内存
同时考虑到流量不均衡的第二个缘由是请求的差别较大问题,ChunkServer对外提供的接口分为Get和Scan两种,Scan是扫描一个范围的全部行数据,Get是获取指定一行数据,所以两种访问方式的次数须要划分赋予不一样的权重(α,β)参与最终Ticket的运算:资源
除此以外,简单的区分两种访问模式仍是远远不够的,不一样的Scan占用的资源也是存在较大差别的,引入平均响应时间(avg_time)这个重要因素也是十分必要的:部署
负载均衡算法要求具备自适应性和强的实时性,一方面新的访问要实时累积参与下次的负载均衡的调度,另外一方面历史权重数据则须要根据统计周期进行非线性的衰减(y 衰减因子),减小对实时性的影响:
本文摘自: