毕业设计做弹性方面的评测,HBase作为分布式数据库,弹性必然是其重点的研究方面,它是如何实现弹性的呢?最重要的一点是它具有负载均衡功能。
首先,Region在HBase中定义为表按行方向切分的一个个数据区域,交由RegionServer负责管理,并向外提供数据读写服务。如果一个RegionServer上的Region过多,那么该RegionServer对应的就会承担过多的读写等服务请求,也就有可能在高并发访问的情况下,造成服务器性能下降甚至宕机。如此,RegionServer间Region的动态负载均衡,也就成了HBase实现高性能读写请求访问的一个需要解决的问题。那么,Region是如何在RegionServer间动态负载均衡的呢?
在HMaster中,有几个成员变量定义如下:
接下来,在finishInitialization()中,开始对上述实体进行初始化:
在initializeZKBasedSystemTrackers()方法中,
回到finishInitialization()中 ,
在getAndStartBalancerChore()方法中,
再次回到finishInitialization()中,balancer进行初始化
接下来介绍下BalancerChore类型的成员变量balancerChore,它为一个后台线程,会周期性的调用HMaster的balance()方法,周期性的完成实际的Region的负载均衡。它的定义如下:
它的父类Chore为HBase中的抽象线程类,HBase中很多工作线程都是继承自Chore,它的run()方法定义如下:
最后是我们的重点,HMaster的balance()方法:
这其中比较重要的就是这个迁移计划表的获取:
紧接着就开始循环处理这个移动计划列表plans,开始移动Region。移动计划的执行,实际上是由assignmentManager的balance()实现的。