Replies: 1 comment
-
概念和基础设施
公共部分ActorID
例如:
之所以统一使用
objstore
我们知道,在 经过分析,我们认为:
当然,由于在算法层面,一些关键的环节还不支持基于对象存储的抽象(例如 piece store
这里的 由于 venus-worker 部分sealing store
每个 通常来说, remote store
目前在 完成封装、等待上链的扇区数据会从 实际上, processor
通常来说, external processor
等极其灵活的搭配方式。 除了方便计算资源的配置和隔离之外,
等选项变得易于集成。使用者可以任意选择多种定制化的 sealing store 、 processor 和 sector 的关系在之前的段落中我们提到, 答案是肯定的,原因如下: 在任何一个特定阶段,一个 在 举例来说: 通常,基于成本和硬件规格考虑,可规划的 这使得硬件资源的高密度利用变得可行。 venus-sector-manager 部分基础服务API这是 这些服务和接口为 chain.API这是一组定义在 messager.API这是一组定义在 market.API这是一组定义在 RandomnessAPI这是对 这一层封装使得 MinerInfoAPI这是对 SectorManager这是管理扇区分配的模块。主要负责根据 可以为多个 DealManager这是管理订单的模块,主要负责为空白的扇区分配可容纳的订单 CommitmentManager这是管理扇区消息上链的模块。主要负责按照预先指定的策略对 SectorStateManager这是管理进行中的扇区的状态的模块。主要负责接收来自 SectorIndexer这是管理已完成的扇区位置的模块。主要负责定位指定的扇区,常用在 |
Beta Was this translation helpful? Give feedback.
-
原文 by @dtynn
简述
我们的不少合作伙伴曾大量、深度使用过
lotus
的封装组件,也不乏自行定制的经历。使用过程中,他们遇到不少痛点,也总结出许多经验。我们将这些思考汇总起来,尝试提供一套与
lotus
封装组件思路不完全相同、以简洁、效率和灵活为最优先考虑,但同样具备竞争力的集群方案,供广大的SP
(Storage Provider,存储供应商)选择。设计思路
venus-cluster
主要包含venus-sector-manager
和venus-worker
两个组件,其功能大致与lotus-minr
和lotus-seal-worker
的组合相当。venus-cluster
着眼于实现一套满足:等目标的高效封装集群方案。
当然,明确且针对性强的设计意图可能导致这套方案并不普适于所有用户。例如,如果使用者已经拥有大量针对封装的不同阶段单独配置、形成搭配的设备,那么
venus-cluster
方案可能并不能有效地提升。具体情形,可以在阅读完后续文档后,由用户自行判断。lotus 封装组件的模式
在介绍
venus-cluster
的具体设计思路之前,我们有必要回顾一下louts
相关组件的工作模式。lotus
的封装组件是一套标准的中心化调度集群:lotus-miner
是中心调度服务,对任务进行分配、管理;lotus-seal-worker
是封装执行体,负责完成分配到其之上的具体任务,并反馈给lotus-miner
;lotus-miner
作为发起方,与lotus-seal-worker
之间通过 RPC 交互。这套设计优点十分明显:
lotus-seal-worker
是几乎无状态的工作进程,理论上很方便进行横向扩容;lotus-miner
可以灵活地将任务在lotus-worker
之间进行调度。但是这套机制也存在另一面:
lotus-miner
作为调度核心:导致内部逻辑(状态机)复杂、异常处理难以细化。
lotus-seal-worker
被完全设计为无状态的模式。继而产生了一些问题,例如:
由于各个阶段之间对硬件资源的要求迥异,为了保证资源的合理分配,通常会将
lotus-seal-worker
设置成每个实例支持一个阶段任务的模式,在同一机器上部署多个不同的实例,通过操作系统级别的资源控制(cgroup、docker、numa 等)进行隔离。这导致在大规模集群中,
lotus-seal-worker
数量众多,编排和管理都较为复杂。任何中心化任务调度机制都很有可能需要考虑计算和存储资源的匹配、亲和性等。
我们说
lotus-seal-worker
几乎无状态,但是事实上,扇区封装过程中存在着 临时文件 这样一种特殊的“上下文”。对于这类 “上下文”,lotus-miner
长期以来简单地对其进行整体搬移。这导致了巨大的网络带宽开销,以及一系列随之产生的网络、存储异常的可能性。直到 PR 7453 提出 “存储分组”概念之后,亲和性问题才初步解决,但这一方案给
worker
的编排又增加了额外的复杂度。大规模集群中存在着大量可能导致任务异常的因素,包括但不限于:计算错误、存储失效、网络抖动。而
lotus-miner
内部缺乏有效感知异常根因的手段,使得其难以根据具体原因选择不同的异常恢复机制,只能统一粗粒度地处理或等待人工介入。venus-cluster 的设计思路
基于我们的目标和过去的经验,
venus-cluster
在设计之初就确立了几点思路:下面我们会具体进行阐述。
简化逻辑
我们重新规划了上下游组件之间的责任划分:
venus-sector-manager
负责:Ticket
和Seed
的获取,消息的独立或聚合提交等WindowPoST
等venus-worker
负责:通过这样的划分,使得
venus-sector-manager
只需被动地接收必须传递的信息,不必实现一套复杂的感知和调度系统;同时venus-worker
直接管理各类本地异常,便于执行不同的处理策略。这样,两者的业务逻辑都不会频繁出现分支,相对便于理解及修改。
优化流程
在
lotus
的封装流程中,最大的问题就是上文提到的,对封装过程中的临时文件的处理。此外还存在一些不尽如人意的点,例如:等。这些都会到封装的整体效率产生影响。
隔离异常
一方面,主要的异常处理被移动到了
venus-worker
一层,且在与venus-sector-manager
交互的接口设计中,就尽早考虑了区分网络异常和逻辑异常,从而使得venus-worker
比较容易感知到异常的具体原因。另一方面,我们将封装过程中可能产生的错误类型归为四个级别,并设定了不同的处理方式:
temp(orary),临时:
这个级别的错误通常明确属于临时性的,或者我们知道重试不会带来负面影响的。
对于这类错误,
worker
会自动尝试重试(以recover_interval
为间隔,最多max_retries
次)。当重试次数超过设定的上限时,会自动升级到
perm
级别。RPC 错误是比较典型的临时错误类型。
perm(anent),持续:
这个级别的错误通常出现在
sealing
的过程中,无法简单判断是否可以安全重试,或一旦修复会有较大的收益(如不必重新完成 pre commit phase1)。这类错误会阻塞
worker
线程,直到人工介入完成处理。crit(tical),严重:
严重级别的错误在各个方面都与持续级别的错误比较相似。
比较显著的区别是,严重级别的错误通常明确来自运行的环境而非
sealing
的过程。如可甄别的本地文件系统异常、本地持久化数据库异常等都归入此类。
严重级别的错误同样也会阻塞
worker
线程直到人工介入。abort,终止:
遇到这个级别的错误,
worker
会直接放弃当前的sealing
进度,尝试重新开始一个新的流程。这使得
venus-worker
能够在更多不需要人工介入的异常场景下自行恢复,同时也给予将来用户定制异常处理策略提供了空间。降低部署复杂度
venus-worker
降低部署复杂度的努力主要体现在三个方面:venus-worker
是以一台设备一个实例的部署方式为目标设计的,同时内部融入了精简但足够的资源控制和隔离方式。使用者可以根据实际情况决定资源的分配策略以期达到最高的使用效率。同时,扇区粒度的任务隔离也可以做到确保部分硬件的失效不会蔓延影响到其他扇区任务。venus-sector-manager
被设计为一个实例可以为多个不同的SP
服务,同时得益于venus
系列链服务组件的设计,可以达成一些不太常见的运行模式:SP
联合体SP
共享算力设备下的动态调配灵活替换功能组件
venus-cluster
内的大量功能组件都是按照先抽象接口,再具体实现的路径设计的。这样做可以确保我们仅对必要的部分进行约束,保留不同实现并存的可能性,从而能够更容易地提供对诸如:定制化或闭源的封装算法执行器
共享的订单数据存储
部分阶段外包服务
等功能的支持。
总结
我们并不将
venus-cluster
定义为一套全能的封装集群方案,我们希望它是在特定的场景下,满足对简洁、高效、灵活有需求的使用者的一种选择。同时我们期待有更多的参与者为其引入更丰富的功能组件实现。
我们认为扩大 “特定场景” 的覆盖范围有助于扩大
venus-cluster
的受众,但也不会贸然允诺对于venus-cluster
的全部功能需求,尤其是那些对其自身特质有影响的部分。Beta Was this translation helpful? Give feedback.
All reactions