ChubaoFS MetaNode

ChubaoFS MetaNode

简介

源码分析


启动流程

1
2
3
4
5
main=>start: main
doStart=>subroutine: 启动
et=>end: 结束

main->doStart->et
1
2
3
4
5
doStart=>start: doStart 
parseConfig=>operation: 解析配置
et=>end: 结束

doStart->parseConfig

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// cmd/cmd.go
    main() --> (*MetaNode) server.Start() --> doStart()
// metanode.go
    func doStart() {
        m.parseConfig()          //解析配置
        m.register()            //将本metanode节点注册到master上
        m.startRaftServer()     //启动RaftServer
        m.startMetaManager()    //启动meta管理器, metaManager-> start() -> onStart() -> loadPartitions()
        m.registerAPIHandler()  //注册api处理函数
        exporter.Init()         //初始化监控
        m.checkLocalPartitionMatchWithMaster()   //
        m.startServer()         //启动主服务
        exporter.RegistConsul() //注册监控Consul
    }

// manager.go
// 加载所有metaPartition
func (m *metaManager) loadPartitions() {


}

metaPartition

1
2
3
4
5
6
7
// metaPartition 启动
func (mp *metaPartition) onStart() {
    mp.load()           //加载metadata、inode、dentry、extend、multipart、applyID
    mp.startSchedule()  //启动一个协程管理内存数据持久化
    mp.startFreeList()  //启动FreeList清理相关工作
    mp.startRaft()      //
}
1
2
3
4
5
6
7
//后台清理服务
func (mp *metaPartition) startFreeList() {
    mp.delInodeFp, err = os.OpenFile() 
    go mp.updateVolWorker()
    go mp.deleteWorker()
    mp.startDeleteExtents()
}
1

基本数据结构

Inode

  • Inode代表mp中的一个文件;

  • mp的所有inode 通过btree组织为起来,key为Inode ID;

  • 通过btree,可以对所有的inode进行get和范围scan;

  • Inode中的Extents记录该文件的有序extent记录,通过extents可从datanode上读取文件数据;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
// 
type Inode struct {
    sync.RWMutex
    Inode      uint64 // Inode ID
    Type       uint32
    Uid        uint32
    Gid        uint32
    Size       uint64
    Generation uint64
    CreateTime int64
    AccessTime int64
    ModifyTime int64
    LinkTarget []byte // SymLink target name
    NLink      uint32 // NodeLink counts
    Flag       int32
    Reserved   uint64 // reserved space
    //Extents    *ExtentsTree
    Extents *SortedExtents
}

Dentry

  • Dentry代表文件名和Inode之间的映射关系,

  • 通过ParentId将所有的文件名组织为一个树形结构;

  • Dentry Btree以ParentID + Name为key进行排序;

1
2
3
4
5
6
type Dentry struct {
    ParentId uint64 // FileID value of the parent inode.
    Name     string // Name of the current dentry.
    Inode    uint64 // FileID value of the current inode.
    Type     uint32
}

Extend

  • extend用于记录文件的扩展属性;

  • extend btree 以 inode id 为key;

  • 扩展属性以kv形式存储在dataMap字段;

1
2
3
4
5
type Extend struct {
    inode   uint64
    dataMap map[string][]byte
    mu      sync.RWMutex
}

操作

创建软连接

  • 新建一个新的Inode,Inode的LinkTarget为软连接目标文件的文件路径;
  • 新建dentry, dentry Inode为新Inode ID;

创建硬链接

  • 增加旧inode的NLink计数;

  • 新增dentry,dentry Inode为旧Inode ID;

mp分裂

updatedupdated2024-05-102024-05-10