HBase源码阅读-4-HMaster与HRegionServer的RPC

4.HMaster与HRegionServer的RPC

启动master时创建一个Server的实例,利用反射机制提供HMaster的方法调用服务;Server继承自抽象类HBaseServer;

HBaseServer通过异步io(nio包)提供了非阻塞的网络连接

4.1RPCServer的创建及启动过程

(1)HBaseServer初始化参数:绑定地址,端口,调用队列大小,最大连接数,最大闲置连接数等

(2)创建Listener(继承自Thread)实例,使用ServerSocketChannel绑定到监听端口,并向Selector注册接受新连接事件

对新连接连接,因为采用异步方式处理,所以为新连接创建一个Connection的实例维持连接状态,并在Selector注册相应的读事件,以读取请求;

对读事件,获取对应的Connection对象,由readAndProcess方法读取并处理请求;

处理请求时,创建Call对象,包含连接和RPC调用的具体参数信息,放入一个队列中,等待处理;

(一个连接Connection可能有多个Call???)

(3)创建10个Handler线程,互斥的从Call队列中取出Call的实例,传入参数调用call方法进行RPC调用(该方法由Server实现);

将处理完成的结果放入Call对应Connection的回复队列中,并向Selector注册写回复请求

(4)创建Responder实例线程;

该线程获取写回复请求,执行异步写,一次性回复一个Connection的所有Call调用结果

4.2HRegionServer访问master的RPC:在启动regionservre时,采用代理模式创建了接口HMasterRegionInterface的一个本地代理,在调用

接口方法时,委托给Invoker对象的invoke方法,该方法又通过HBaseClient作为客户端向HBaseServer发送请求,并获取返回结果

4.3HMaster与HRegionServer交互信息的格式

(1)HServerInfo:包括服务器地址,端口,主机名,regionserver的负载信息HServerLoad

(2)HRegionInfo:包括regionid,起、止Key,region包含的table信息,是否在线,regionName等

(3)HMsg:HMaster和HRegionServer通信的指令

master发送给regionserver的指令包括:启动指定region;停止指定region;分裂region;compactregion;停止regionserver;停止指定region而无需回复;停止所有用户region

从regionserver到master的指令:regionserver正在服务指定region;regionserver已不再服务指定region;regionserver正在关闭;已停用所有用户region;Flush缓存;运行MajorCompaction;分裂指定region

4.4交互协议

HRegionServer启动时:

(1)HRegionServer获取服务端协议版本并比较

(2)HRegionServer调用HMasterRegionInterface的regionServerStartup接口,报告该regionserver已启动;

HMaster将regionserver的管理都交给ServerManager;

HMaster返回hbase.regionserver.address,fs.default.name和hbase.rootdir等配置信息

(3)然后定期(hbase.regionserver.msginterval)定期调用HMasterRegionInterface的regionServerReport接口报告regionserver的状态,并接受指令

4.5master对regionserver的管理:ServerManager

ServerManager维护三个Map记录可用regionserver状况,

serversToServerInfo:从serverName到其HServerInfo的映射;

serversToLoad:从serverName到其最近HServerLoad的映射;

loadToServers:从HServerLoad到其serverName集合的映射(相同负载的regionserver);

一个SetdeadServers维护已死亡的regionserver信息;

(1)regionserver启动后向master报告:

a.ServerManager的regionServerStartup方法先检查是否已存在相同的regionserver,若存在且通过startCode判断其是否stale(???),若stale则终止该regionserver:

删除该regionserver对应的HServerInfo、HServerLoad,加入到deadServers队列,并向master的RegionServerOperation队列中增加一个关闭该server操作,等待处理

b.检查该regionserver是否在deadServers队列

c.然后在zookeeper的/hbase/rs/增加Znode中记录新的regionserver,并向该Znode增加一个ServerExpirer,在该节点被删除后expire该regionserver

d.serversToServerInfo,serversToLoad,loadToServers增加相应记录

(2)处理regionserver的heartbeat报告(这一部分逻辑比较复杂)

a.检查该regionserver是否已经dead(与deadServers中的记录进行比较)

b.第一条HMsg是:regionserver正在关闭

从serversToServerInfo中删除该regionserver;

调用RegionManager,使该regionserver上的所有meta和rootregion下线;

检查是否有root和metaregion正在该server启动,有则重新分配该region;

从serversToLoad和loadToServers从删除该regionserver的load信息;

然后依次读取后面每条msg,msg类型必需为:停止region;通过master的RegionManager来管理region

最后向regionserver返回空的HMsg.

c.第一条HMsg是:MSG_REPORT_QUIESCED,即regionserver关闭所有userregions,则quiescedServers记录该状态regionserver的数据

当master接受到shutdown请求时,而所有regionserver仅服务metarregions则关闭master

d.若master已关闭,则返回REGIONSERVER_STOP的msg

e.若serversToServerInfo中查不到该regionserver,也向regionserver发送REGIONSERVER_STOP的msg

f.前面处理掉所有异常情况,然后调用processRegionServerAllsWell处理regionserver的HMsg:

更新serversToServerInfo,serversToLoad,loadToServers中regionserver对应的信息;

依次处理每条HMsg:

regionserver正在处理open指定region的请求:累加该指令次数

regionserver已open指定region:

若region被重复打开了,则回复regionsever关闭

若是rootregion,则从未分配region列表中删除,并记录rootregion所在regionserver地址;

非rootregion,设置状态为open,向RegionServerOperationQueue添加ProcessRegionOpen操作,

连接至该region的metaregion所在regionserver,该regionserver客户端获得HRegionInterface的代理,put该region的信息到metaregion中(key为region名,CATALOG_FAMILY下有主机和端口、startCode两列)

若region是metaregion,则加入RegionManager中的扫描队列中。

regionserver已关闭指定region:

如果是rootregion则清理RegionManager中root

向master的RegionServerOperationQueue中增加ProcessRegionClose操作

MSG_REPORT_SPLIT,MSG_REPORT_SPLIT_INCLUDES_DAUGHTERS,regionserver分裂region操作:都委托给RegionManager

(3)ServerMonitor线程,定期dumpdeadServers和regionserver数量及每个regionserver的平均服务region数量

4.6regionserver处理master返回的HMsg:regionserver将master返回的消息放入一队列中,由其worker线程从队列中依次取出并处理

(1)处理MSG_REGIONSERVER_QUIESCE,关闭所有userregion:从HRegionServer记录的所有onlineregions中选出所有userregion,每个region启动一个线程进行执行关闭

(2)MSG_REGION_OPEN,打开指定region:若整个集群的rootregion还没打开,则不处理该指令,并重新放回队列中;

(3)MSG_REGION_CLOSE,关闭指定region:从onlineregions中选出要关闭的region,关闭该region,并给master回复已关闭的信息

(4)MSG_REGION_SPLIT,分裂指定region:先flush缓存数据;设置region的标识变量splitRequest为true;region放入CompactSplitThread线程的compactionQueue队列中等待分裂

(5)MSG_REGION_MAJOR_COMPACT和MSG_REGION_COMPACT:region放入CompactSplitThread线程的compactionQueue队列中等待Compaction

(6)MSG_REGION_FLUSH:flush指定region

相关推荐