HBase 负载均衡
HBase 可以根据当前集群的负载以region为单位进行rebalance。在HMaster中,后台会起一个线程定期检查是否需要进行rebalance,线 程叫做BalancerChore。线程每隔 hbase.balancer.period会定期执行 master.balance()函数,配置项默认300000毫秒,5分钟。每次balance最多执行
hbase.balancer.max.balancing,如果没有配置,则使用 hbase.balancer.period配置项的值。master.balance()首先通过loadBalancerTracker去zk上看是 否load balance开启,如果开启,则从AssignmentManager中检查当前是否有region处于in transition状态,如果有,则直接返回。否则将集群的状态给balancer以便后续做决策,HMaster的 assignmentManager成员内部维护着一个表在哪些机器上,这些机器上分别有哪些region。对于每张表,都会执行 balancer.balanceCluster()方法。HBase中load balance的策略是可插拔的,开发者可以根据自己业务的需求来开发自己的load balance策略。在HBase中,是通过接口LoadBalancer类实现的。具体使用哪个load balance策略由配置项hbase.master.loadbalancer.class决定,默认使用 StochasticLoadBalancer。所有的逻辑都在StochasticLoadBalancer这个负载均衡器的 balanceCluster()方法中。
StochasticLoadBalancer负载均衡器首先会根据每个region server上的region个数作决定要不要进行rebalance,具体方法是算出所有server的平均region个数,然后根据配置项 hbase.regions.slop产生一个区间[floor(average * (1-slop)), ceil(average * (1+slop))],配置项默认0.2,如果region 个数最多的region server不比右区间大,并且region个数最少的region server不比左区间小,则说明region个数比较平均,就不进行rebalance,直接退出,等待下次调度。否则,计算当前集群状态的cost 值,这个cost值的计算会考虑到移动region的成本,region 本地化策略,region count分布,每个server上table的分布等做一个加权平均。然后一共迭代computedMaxSteps次,次数由配置项 hbase.master.balancer.stochastic.maxSteps和 hbase.master.balancer.stochastic.stepsPerRegion,还有当前集群的region个数,server个数 共同决定。每次迭代,都会随机选择一种pick region的策略,一共有三种,分别为RandomRegionPicker,LoadPicker和LocalityBasedPicker。随机选 定一个picker策略后,这个picker就会从集群中选出两个用于的region或者选出一个用于迁移到其他server的region,然后更新集 群状态的数据结构,重新计算当前集群状态的cost值,如果发现新的cost比原来的小,则说明,这种region的交换或者迁移是有效的。每次迭代都是 基于上次的成果,总共做computedMaxSteps。最后产生出一系列的plan,每个plan就是交换region或者迁移region。对于所 有的表都做一次,把所有的plan都放入AssignmentManager的regionsPlans中。然后对于每个plan,都调用assignmentManager.balance(plan),这个函数会 调用unassign()方法,首先在zk上为这个region创建/hbase/region-in-transition /region_encoded_name节点,节点内容为这个原来在某个server上的region处于closing状态了,然后给这个 region原来所在的server发送close region命令对region进行卸载,随后再调用public void assign(HRegionInfo region, boolean setOfflineInZK)给region的目标region server发送open region的命令,目标region server是从regionPlans中查到的。最后删除zk上的节点。其中,每次做完一个plan后都会检查是否时间到了。
参考资料
hbase-server-0.98.3-hadoop2.jar
来自:http://www.cnblogs.com/foxmailed/p/3899574.html