yuntable master代码阅读

Yuntable代码阅读(看到哪,写到哪,有写的不对的,后面回来更正)

Master

Master启动过程

Master调用load_master方法(在master.c中)。Load_master方法先读取基本配置文件,默认的配置文件是conf/master.conf,从中要读出端口号、duplicate_num(replica数量)、check_interval。随后有两个重要的步骤:1load_table_info_list2load_region_info_list。以上得到的所有信息都会添加到Master结构体中,最后update_master_info方法会根据Master中的内容更新Master

重要步骤:

1.Load_table_info_list

加载yuntable中已有的表。从master.conf文件中读取所有表名,表名间以逗号分隔。对表名列表进行遍列,从master.conf文件中读出所有以表名为前缀的行,根据这些行的内容构造表的信息并放到TableInfo结构体中,string_to_table_info方法完成对TableInfo结构体的构造。所有表的TableInfo被放到一个List中,这个List就是Master结构体中的tableInfoList

2.load_region_info_list

加载region信息。从master.conf文件中读取所有region的名字,遍列每个region名字。create_region_info会根据名字创建RegionInfo的实例,这些实例最终被放在MasterregionInfoList列表中。

3.Update_master_info

更新master,更新并检查region的信息,把有问题的region挑出来,统一做处理。遍列MastertableInfoList,调用update_region_info方法对其中的每一个RegionInfo进行检查。检查的过程是一个RPC调用的过程。MasterRegionInfo中的每一个region进行socket连接,并请求region的状态。Master检查region的状态,如果region返回的状态有问题,则调用handle_problem_regions方法去处理,目前0.9版本中该方法并没有做任何事情。

Master后台线程

Master有两个后台线程:1)定期更新region信息的线程;2)等待客户请求的线程

定期更新的时间间隔是在master.conf中设定的,存储在Master结构体中

客户对Master的请求分为以下几类:

1) GET_TABLE_INFO_MASTER_CMD

#define GET_TABLE_INFO_MASTER_CMD "get_table_info_master"

客户端传给Master一个表名,Master返回它保存的TableInfo结构体。Master根据客户端请求的表名,在自己的tableInfoList查找该表,并返回结果。

2) ADD_NEW_REGION_MASTER_CMD

#define ADD_NEW_REGION_MASTER_CMD "add_new_region_master"

增加一个regionmaster中,0.9版本只能增加一个regionMaster调用add_new_region_master(char *)方法增加region。它首先在masterregion列表中查找该region,如果找不到,则验证要添加的region是否正在运行并且角色是region(这里调用check_node_validity方法,在client添加master时也用该方法)。验证通过以后,把region添加到masterregion列表中,更新刚添加的region,并把region写到master的配置文件中。

3) CREATE_NEW_TABLE_MASTER_CMD

#define CREATE_NEW_TABLE_MASTER_CMD "create_new_table_master"

创建新表,master调用create_new_table_master函数创建新表。首先该函数检查表是否已存在。不存在时创建表。首先创建一个tableInfo的结构体,接下来的步骤有0.9版本的局限性。根据master中记录的duplicate_num参数创建相应个数的ReplicaQueue实例和tabletInfo实例。创建tabletmaster要请求region,因为tablet的数据在存储在region上的。Master需要传给region新的表名,region的操作参考region的命令处理。0.9版本的局限性就在于它只用了master上前duplicate_numregion,简化实现不考虑负载均衡。几个数据结构的关系:

MasterTableInfoTabletInfoRegionInfoReplicaQueue

Master->tableInfoList保存tableInfo

Master->regionInfoList保存regionInfo

tableInfo->replicaQueueList保存replicaQueue

replicaQueue->tabletInfoList保存tabletInfo

tabletInfo->regionInfo保存tablet所在的region

4) CHECK_PROBLEM_REGION_MASTER_CMD

#define CHECK_PROBLEM_REGION_MASTER_CMD "check_problem_region"

检查有问题的region。当客户端添加或删除数据出错时,客户端会向master发送该请求。check_problem_region_master函数负责处理有问题的region。先调用update_region_info函数更新master中保存的region的可用空间大小,该过程是由向region发送AVAILABLE_SPACE_REGION_CMD请求完成的。如果region确实有问题(region_has_problem函数去判断)handle_problem_regions去处理,但是当前0.9版本没有做任何处理就直接调用return语句返回了,原因是"This routine has not been tested, and stops now."。程序后面的内容是调用handle_infected_tablet,继而调用start_sync_job,该方法在region之间数据的同步和转移。

5) GET_METADATA_MASTER_CMD

#define GET_METADATA_MASTER_CMD "get_metadata_master"

得到所有regiontable信息,并返回给客户端。示例输出如下:

yuncli:show master

The Master Default Duplication Number: 1

The number of region node: 1.

The information about Region No'0.

        The Connection Info: 127.0.0.1:8302.

        The Available Size(MB): 0.

        Is Connecting Now: false.

        Is Serving Now: true.

The number of Tables: 1

Tables are: people 

6) GET_ROLE_CMD

#define GET_ROLE_CMD "get_role"

直接返回master进程的角色是"master"

当前用到的数据结构:MasterTableInfoTokensReplicaQueueRegionInfoRPCRequestRPCResponse

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值