注意事项与最佳实践
区块链分布式结构的特点,使得其在管理上相对单点系统要复杂的多,需要从多个角度进行仔细考量和论证。这里总结一些在生产环境中使用 Fabric 网络需要注意的地方和最佳实践技巧。
节点角色差异
Fabric 网络中各个节点可以拥有不同的角色。不同角色的众多节点负责整个网络功能中不同环节的工作负载,呈现出了差异化的处理特性。
Ordering 服务需要排序整个网络中所有的交易消息,是全网的关键组件。Orderer 维护网络中所有通道的区块链结构,往往大量吞吐区块文件。因此,对于 Orderer 节点来讲需要加强网络(至少千兆网络)、存储和内存方面的配置,并且采用集群部署的方式提高其可靠性。
Peer 节点除了处理区块和背书交易(Endorser)之外,还需要对账本状态进行更新(Committer),对身份进行验证。同时,对于每个通道来说,加入通道的节点都需要维护一个针对该通道的账本结构(存放在数据库中)和区块链结构(存放在文件系统)。因此,Peer 节点需要加强CPU、内存、存储等资源配置,Endorser 还可以在签名处理方面进行加权。对于打开文件句柄较多的节点(如配置使用 CouchDB 作为状态数据库时),可能还需要对系统的 ulimit 等参数进行调整。
而对于链码容器来说,自身不需要维护太多状态信息,但是需要执行计算操作,因此需要提供较好的计算能力支持。
一般来讲,链码容器常常跟 Peer 节点在同一服务器上,建议为 Peer 服务预留 2 GB 以上的空闲内存,4 CPU 以上资源,并且一般每个链码容器分配 256 MB 运行内存和 1/10 的 CPU 核资源(根据链码逻辑进行调整)。
日志级别
日志级别越低,输出日志内容越详细,出现问题后方便进行调试。但输出过多日志会拖慢系统的吞吐性能,严重时甚至能降低几个数量级。
因此,在生产环境中必须要仔细调整日志级别。对于关键路径上的系统,通常要配置不低于 Warning 级别的日志输出;对于非关键路径上的系统,则可以采用不低于 Info 级别的日志输出。
Fabric 在日志级别上,支持对不同组件提供不同的级别。推荐将全局配置为 warning 级别,gRPC 组件由于需要处理大量交互消息,可以配置为更高的 error 级别。
如果要追踪区块链网络中的状态变化,可以通过事件监听等方式,降低对网络处理的压力。
链码升级
在 Fabric 2.x 的链码生命周期(Lifecycle)下,升级链码本质上是更新链码定义:递增序列号(--sequence)、更新版本号并重新打包安装后,由各相关组织重新批准(approve),在满足通道的生命周期背书策略(默认为大多数组织,Majority)后,由任一组织提交(commit)生效。详见“管理链上代码(Lifecycle)”一节。
与 1.x 旧 LSCC 机制不同,升级需要组织间达成共识;一旦新定义提交成功,便在通道范围内统一生效,而非由单个管理员单方面操作,也不会出现部分节点新旧版本并存的情况。
从数据一致性上考虑,新版本链码应能够正确读取旧版本写入的状态数据,避免数据结构不兼容导致读写错误。建议先在测试网络或个别组织上,用新版本(递增 --sequence)验证对原有数据的读写,确认无误后再在生产通道上推进批准与提交。
大多数现代链码无需显式的 Init 方法;如确有初始化需求,可在 approve 与 commit 时指定 --init-required,并在提交后用 --isInit 调用一次以保护原有数据。
组织结构
组织代表了维护网络的独立成员身份。一般来说,组成联盟链的各个成员,每个都拥有代表自己身份的组织。一个组织可以进一步包括多个资源实体,这些资源实体彼此具有较强的信任度,并且对外都呈现为同一组织身份。
由于 Gossip 协议目前在 MSP 范围内进行传播,因此,一般建议将组织与 MSP 一一对应,即每个组织拥有自己专属的 MSP。当一个组织拥有多个 MSP 时,不同成员之间的交互可能会带来障碍;当多个组织同属于一个 MSP 时,可能会发生不希望的跨组织的数据泄露。
另外,一个组织可以包括多个成员身份,多个 Peer 可以通过使用同一成员身份来提高高可用性。
证书管理
Fabric 网络中,CA 负责证书的管理。cryptogen 主要用于测试和开发环境中快速生成网络密钥材料,通常不应作为生产网络的证书签发和生命周期管理工具。生产网络应由各组织运营 Fabric CA 或符合企业安全要求的外部 PKI/中间 CA,用于注册、签发、轮换和吊销节点、管理员、客户端等身份。
Fabric CA 占据网络中安全和隐私的最核心位置,因此需要加强安全方面的防护。CA 不应该暴露在公共网络域中,并且只能由有限个具备权限的用户可以访问。
另外,根证书往往要进行离线保护处理,减少接触和泄露的可能性。通常使用中间层证书来完成实体证书的签发。同时,绝对不能直接用根证书作为组织管理员的身份证书。
账本备份和裁剪
Fabric 2.3 之后支持 Peer 账本快照(ledger snapshot),可用于让新 Peer 从某一高度加入通道,或在多个 Peer 间比较快照哈希以检查是否存在账本分叉。但快照不是完整备份,也不会对已加入通道的 Peer 执行账本归档或裁剪。
一方面,推荐用户根据业务需求和吞吐量来估算所需磁盘的大小。一般的,在平均每秒百次 TPS、交易消息不太大情况下,每年大约产生 3 TB 左右数据。生产环境应为区块文件、状态数据库、私有数据、历史数据库和快照目录分别规划容量和告警阈值。
账本文件一般位于默认的 /var/hyperledger/production 目录下,包括区块文件、状态数据库、私有数据存储、历史数据库和节点本地元数据。不要手动删除活跃 Peer 的旧区块文件来“裁剪”账本;这会破坏后续的 reset、rollback、rebuild-dbs 等管理操作,并可能导致节点无法一致恢复。
快照目录只包含加入通道所需的最小数据,例如公开状态、私有数据哈希、交易 ID 和集合配置历史;不包含私有数据明文、完整区块历史、MSP、节点配置或运行时数据库文件。因此:
快照可以压缩、分发给新 Peer,或用于一致性校验;
快照不能替代 Peer 完整备份,也不能作为回滚到历史高度的机制;
通过快照加入通道的 Peer 不具备完整历史区块,不能使用依赖完整区块文件的
reset、rollback或rebuild-dbs命令;私有数据需要在加入后从有权限的集合成员 Peer 中重新协调拉取,可能需要额外时间;
Fabric 2.5 的私有数据 purge 只处理私有数据状态和历史,不等同于公开账本裁剪。
完整备份应在一致性窗口内覆盖 Peer 文件系统、状态数据库(如 CouchDB)、私有数据、MSP、TLS 材料和配置文件,并在恢复演练中验证节点能重新加入网络、同步区块、查询账本和处理链码调用。
系统优化
区块链作为分布式系统,对系统的计算、网络、存储等资源都有所需求,优化的系统配置可以有效提高资源效率。
例如,可以调整系统缓存策略、允许打开的文件句柄数、调整 TCP 连接超时时间等网络参数等。如果使用容器,还可以调整容器的资源限额和访问权限等。
此外,对于第三方软件也应该根据对应文档进行调整和优化。例如使用 CouchDB 作为状态数据库时,应单独规划认证、网络隔离、备份和容量告警。仍使用 Kafka 排序服务的旧 Fabric 2.x 网络,应先迁移到 Raft,再考虑升级到 Fabric 3.x。
最后更新于