Filecoin源码分析(1)--Lotus-storage-miner架构解析

3,923 阅读3分钟

本文作者-麦客存储 原创作品 转载需征得作者同意

Lotus是Filecoin分布式存储网络的一个简单实现,采用Go语言进行编写,实现了挖矿,存储,数据检索主要功能,Miner是Lotus的存储挖矿实现。Lotus的部署和一些简单命令可以查看该文档 Lotus部署文档

Miner整个代码结构是非常模块化的,Miner有如下命令行指令,分别对应不同的实现 麦客存储

对应的实现在cmd/lotus-storage-miner目录: 麦客存储

其中最主要的是其中的run命令的实现,Lotus通过 lotus-storage-miner run 去启动Miner服务。

Lotus执行Run命令后,其中的各个模块的加载都是通过 DI注入的方式去实现

所有的初始化函数的类型和参数的类型都会注册到一个Settings的Map容器中,当加载的时候通过反射的方式去将类型对应的实例找出来,使用这种方式可以解决很多初始化函数互相耦合依赖的问题。 麦客存储

每一个Miner服务全局的Miner结构,这个结构是StorageMinerAPI 麦客存储

StorageMinerAPI包含了存储挖矿,存储提供商,全节点通信,Sector管理等对象。其中挖矿涉及到的最主要的是其中的storage.Miner对象 麦客存储 Miner包含了Miner的地址,通信接口,Sector管理和矿工对象。其中最主要的是sectorstorage.SectorManagersealing.Sealing 麦客存储 SectorManager主要负责Worker的管理,这里的Worker包含本地Worker和远程Worker。Miner本身也是一个Worker,当初始化SectorManager时会创建一个LocalWorker对象。本地的Worker可以自由选择需要执行的任务类型,如果做挖矿的集群挖矿方案(后期会有介绍)可以通过配置文件设置不让本地Worker执行这些任务。 麦客存储 SectorManager内部还包含一个调度器scheduler对象,该对象负责对Worker做任务分发和对Worker进行管理调度。 麦客存储 scheduler通过一个for循环不断的监听channel里面的数据,主要有对Worker的监听和对事件请求的监听,监听到的事件后会对候选的Worker进行检查,然后进行预分配。判断是否可以执行任务,任务份分发也包含几个原则,1.任务优先级;2.Worker资源的利用率(CPU和内存状态),3.首选具有指定任务的Worker去执行;4.请求时间。 这样可以保证每次选择一个最优的Worker去执行任务。 麦客存储

Sealing是Miner内部的挖矿对象,负责管理挖矿的整个流程,内部是通过状态机去驱动。 麦客存储 statemachine.StateGroup是状态机的管理对象: 麦客存储 其中StateHandler是事件回调函数,sms是状态机管理对象,不同的扇区ID对应不同的状态机。 状态机会启动一个循环不断的去监听channel里面的事件,然后根据事件的状态去调用事件的状态响应函数。 下面是状态转移的过程: 麦客存储 每个事件最终会进入到Manager里面的scheduler监听的channel里面,然后会被分发到manager管理的worker对象去执行,远程worker通过RPC的方式与Miner进行交互,目前远程worker支持的任务类型有AddPiece,Pre-commit1,Pre-commit2,commit1,commit2。分配的任务最终会调用底层的Rust代码执行任务。

下面为Lotus的整体架构图 麦客存储