节点管理¶
节点是区块链系统工作的最小单元,目前FISCO BCOS系统中的节点有3种类型(游离节点、观察节点以及共识节点,3种节点类型可相互转换)、2种状态(启动状态、停止状态)。
为了有更好的可扩展性和运维性,更能适应真实业务场景,FISCO BCOS 2.0+引入了多群组架构,支持节点启动多个群组,群组间交易处理、数据存储、区块共识相互隔离,保障隐私性的同时又可以降低系统的运维复杂度。
节点类型¶
游离节点¶
游离节点指已启动但还未加入群组的节点。新扩容的节点在启动后,加入群组前就是游离节点。
console命令:
- removeNode–将共识/观察节点设置为游离节点。
对于游离节点,需考虑如下场景:
(1)针对共识、观察节点可以removeNode成功。
(2)客户端(如java-sdk)配置的直连节点为游离节点,该直连节点不能接受客户端发过来的请求。
(3)游离节点不同步链上数据。
观察节点¶
观察节点不能参与共识,但能实时同步链上的数据。
console命令:
- addObserver–将共识/游离节点设置为观察节点。
- getObserverList–查看当前group的观察节点列表。
对于观察节点,需考虑如下测试点:
(1)针对游离、共识节点addObserver成功。节点被设置为观察节点后,不参与打包出块,能实时同步链上数据。
(2)console在addObserver时未校验是否在节点的P2P连接列表中,即共识节点、游离节点未启动,addObserver也能成功(go sdk有校验)。
(3)客户端(如java-sdk)配置的直连节点为观察节点,该直连节点能接受客户端发过来的交易并转发给其他节点。
共识节点¶
共识节点可以参与群组共识,拥有群组的所有数据,能正常工作。搭链时默认生成的都是共识节点。
console命令:
- addSealer–将观察/游离节点设置为共识节点
- getSealerList–查看当前group的共识节点列表
针对共识节点,需注意:
(1)对游离、观察节点addSealer成功。节点被设置为共识节点后,能够正常打包出块。
(2)观察节点已同步到链上最新数据,addSealer后可正常工作。
(3)观察节点未同步到链上最新数据,addSealer后会继续同步数据,数据同步完成后正常工作。
(4)游离、观察节点未启动,addSealer失败,错误提示信息合理。
(5)客户端(如java-sdk)配置的直连节点为共识节点,该直连节点能接受客户端发过来的交易。
(6)addSealer操作可能会打破群组原来的容错平衡。
由于新节点加入共识列表可能导致群组工作异常,实际操作时需注意下列场景:<br> - 背景:群组原有2个节点,采用PBFT共识,2个节点均正常工作且块高较大 - 操作步骤:新的游离节点加入共识列表 - 结果:新节点同步到最新块高需要一定时间。在该节点同步到最新块高期间,群组因不满足3f+1<=N而不能正常工作。
结论:在生产环境中,为避免上述现象发生,在扩容、退网时一般按照如下顺序:<br> - 扩容顺序:启动新节点–>查看新节点跟链上其他节点P2P连接是否正常–>将新节点设置为观察节点,使新节点开始同步链上数据–>待新节点同步到链上的最新数据后,将新节点加入到群组共识列表中。 - 为避免破坏链的正常工作形态,节点A退出顺序:节点A removeNode退出群组–>清空节点A的P2P连接列表并重启节点A–>对于链上其他节点,将节点A从自身的P2P连接列表中移除(若有)并重启对应节点。
不同的节点类型有不同的表现形式,在实际压测过程中,可以让节点频繁地在3种类型之间来回转换,观察各种类型的节点表现是否符合预期以及对压测的影响。
节点状态¶
正常操作下,节点只有2种状态:启动、停止。
停止共识节点后,若群组剩下的正常节点不满足共识算法的规则,群组工作异常。
停止观察节点后,该节点不再同步群组数据,不影响群组正常工作。
停止游离节点后,该节点跟其他节点网络断开,不影响群组的正常工作。
实际环境中,节点可能因为服务器资源使用率等因素导致进程挂起(进程存在,但不能正常处理业务),在平常测试过程中,可以多模拟类似异常场景。
group管理¶
多群组架构中,基于具体业务场景,节点可以根据业务关系选择群组加入,参与到相关账本的数据共享和共识过程中。一个节点下的各群组独立运作,互不影响,各群组有自己独立的账本。
创建群组¶
console命令:
- generateGroup、generateGroupFromFile–为指定节点动态创建一个新群组
测试点如下:
(1)指定节点必须为console直连节点(即在getAvailableConnections的返回结果中)才能创建成功。创建群组后,会在该节点下生成conf/group.x.genesis、conf/group.x.ini文件和data/groupx目录。
(2)若新group的sealerList只有一个节点,创建成功后可直接startGroup,然后在新group上部署合约调用合约。
(3)若新group的sealerList有多个节点,generateGroup命令中通过空格分隔,generateGroupFromFile通过逗号分隔,需要在每个节点对应的console都执行generateGroup/generateGroupFromFile操作。
(4)generateGroupFromFile中groupPeers有多个时,各个节点的创建结果应互不影响(即groupPeers配置了A、B节点,A节点的新group创建失败不影响B节点新group创建)。
启、停、删除、恢复群组¶
console命令:
- startGroup–为指定节点启动群组
- queryGroupStatus–查看指定节点相关群组的状态
- stopGroup–为指定节点停止群组
- removeGroup–为指定节点删除群组
- recoverGroup–为指定节点恢复指定群组
测试点如下:
(1)创建群组后默认是STOPPED状态,需要为新group的各个节点启动新群组,启动成功后是RUNNING状态。
(2)新群组RUNNING状态的节点个数满足对应共识算法规则时,可以在新群组成功部署、调用合约。
(3)已stopGroup才可进行removeGroup操作,removeGroup后群组会变为DELETED状态,不会删除后台对应的conf/group.x.genesis、conf/group.x.ini文件和data/groupx目录。
(4)已removeGroup才可成功recoverGroup,recoverGroup后群组变为STOPPED状态。
(5)当节点群组由STOPPED状态变为RUNNING状态后,若此时该群组的数据落后于其他节点,会自动同步到最新数据。
(6)节点的多个group之间互不影响(如节点有A、B两个group,group A非RUNNING状态,group B为RUNNING状态,group B仍可正常工作)。
(7)多群组下,节点属于多个群组,且节点在各个群组的类型不同,不会影响各自群组正常工作(如节点1在group A为共识节点,在group B为观察或游离节点,节点1在各个群组的表现互不影响)。