ChubaoFS Master

ChubaoFS Master

简介

MetaNode管理

Metanode 是否可写

  • 节点存活(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()
}

ID分配

1
2
3
type IDAllocator struct{
    dataPartitionID uint64  
}

创建Vol

chubaofs 创建vol由master的http提供接口,http uri为/admin/createVol。流程如下:

  1. master接收到上述uri请求后,进入master/api_service.go中的(m *Server)createVol();流程如下:

    1. 首先解析参数;

    2. 然后通过cluster.createVol()创建vol;

    3. associateVolWithUser()关联新建的卷和用户;

    4. 返回结果给用户;

  2. cluster.createVol()流程如下:

    1. checkVolInfo()检查zone信息;

    2. 通过(c *Cluster)doCreateVol()在master内存中分配并初始化一个Vol对象;

    3. 通过vol.initMetaPartitions()初始化vol的mp, 该命令会选择合适的metanode并在其上新建mp;

vol zone信息

Carry

master在创建dp,mp时,通过carry来选择有效的metanode,datanode进资源分配,保证资源均匀分布在各个节点上。

metaPartition管理

  • master/meta_partition_manager.go

  • master开启一个后台goroutine, 默认每5秒检查一遍BadMetaPartitionIDs中个mp的状态;

  • metapartition 各副本MaxInodeID和第一个副本差距> 1000, 则将该分片IsRecover设为true,开启分片数据同步;

参考

updatedupdated2024-05-152024-05-15