节点存活(isActive): 心跳上报时间间隔<30s的节点isActive为false;
metanode最大可用内存 > master配置中设置的metanode保留内存;
metanode已用内存/metanode总内存 不高于限制比例 (默认: 0.75)
metanode mp 数量 < 最大mp数量(默认:10000)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| //master server
//master 进程服务
type Server struct {
cluster *Cluster //
//...
}
//
type Cluster struct {
Name string
vols map[string]*Vol
dataNodes sync.Map
metaNodes sync.Map
fsm *MetadataFsm
partition raftstore.Partition
t *topology
//...
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
| // cmd/cmd.go
// 入口
main(){
server :=- master.NewServer()
server.Start(cfg)
}
//
// master/server.go
(m *server)Start() {
m.newReverseProxy() //启动反向代理服务
raftstore.NewRocksDBStore() //
m.createRaftServer() //创建raft服务
m.initCluster() //初始化集群
m.initUser() //初始化用户
m.cluster.scheduleTask() //
m.startHTTPService()
metricsService.start()
}
func (m *Server)createRaftServer() {
m.raftStore, err = raftstore.NewRaftStore()
m.initFsm() //--> loadMetadata()
//...
}
func (m *Server)loadMetadata() {
}
// master/cluster.go
func (c *Cluster) scheduleTask() {
c.scheduleToCheckDataPartitions()
c.scheduleToLoadDataPartitions()
c.scheduleToCheckReleaseDataPartitions()
c.scheduleToCheckHeartbeat()
c.scheduleToCheckMetaPartitions()
c.scheduleToUpdateStatInfo()
c.scheduleToCheckAutoDataPartitionCreation()
c.scheduleToCheckVolStatus()
c.scheduleToCheckDiskRecoveryProgress()
c.scheduleToCheckMetaPartitionRecoveryProgress()
c.scheduleToLoadMetaPartitions()
c.scheduleToReduceReplicaNum()
}
|
1
2
3
| type IDAllocator struct{
dataPartitionID uint64
}
|
chubaofs 创建vol由master的http提供接口,http uri为/admin/createVol
。流程如下:
master接收到上述uri请求后,进入master/api_service.go
中的(m *Server)createVol()
;流程如下:
首先解析参数;
然后通过cluster.createVol()
创建vol;
associateVolWithUser()
关联新建的卷和用户;
返回结果给用户;
cluster.createVol()
流程如下:
checkVolInfo()
检查zone信息;
通过(c *Cluster)doCreateVol()
在master内存中分配并初始化一个Vol
对象;
通过vol.initMetaPartitions()
初始化vol的mp, 该命令会选择合适的metanode并在其上新建mp;
master在创建dp,mp时,通过carry来选择有效的metanode,datanode进资源分配,保证资源均匀分布在各个节点上。
master/meta_partition_manager.go
master开启一个后台goroutine, 默认每5秒检查一遍BadMetaPartitionIDs中个mp的状态;
metapartition 各副本MaxInodeID
和第一个副本差距> 1000, 则将该分片IsRecover设为true,开启分片数据同步;