Hyperledger Fabric 1.1(Kafka共识):Kafka/ZooKeeper需持久化存储吗?
关于Hyperledger Fabric 1.1 + Kafka/ZooKeeper持久化与故障恢复的解答
针对你提出的几个问题,我来逐一拆解说明:
1. Kafka与ZooKeeper节点是否需要配置持久化存储?
必须配置。原因如下:
- ZooKeeper:负责维护Kafka集群的元数据(比如broker节点信息、分区副本状态、consumer组偏移量等),同时也管理Fabric orderer集群的节点状态。如果ZK不做持久化,一旦节点重启,所有集群元数据都会丢失,Kafka集群会陷入不可用状态,Fabric的orderer服务也无法正常选举和同步。
- Kafka:作为Fabric orderer的共识后端,存储了所有orderer节点广播的交易日志数据。如果Kafka不持久化,节点重启后交易日志丢失,orderer节点重启后无法从Kafka恢复历史交易数据,会导致区块链账本不完整,整个Fabric网络的一致性被破坏。
2. Docker Swarm部署时,是否需要为Kafka或ZooKeeper容器映射卷?
是的,必须映射持久化卷。Docker容器默认使用的是临时存储(overlay2驱动的匿名卷),容器销毁或重启后数据会被清除。在Swarm环境中,你需要为ZK和Kafka容器绑定Swarm的持久化卷(比如使用docker volume create创建的命名卷,或者绑定宿主机目录),来保存它们的核心数据目录:
- ZooKeeper需要持久化的目录:
/data(存储快照数据)和/datalog(存储事务日志) - Kafka需要持久化的目录:
/kafka/data(存储分区的消息日志)
举个简单的Swarm服务部署示例片段(Kafka部分):
services: kafka0: image: hyperledger/fabric-kafka:1.1.0 volumes: - kafka0-data:/kafka/data environment: - KAFKA_BROKER_ID=0 - KAFKA_ZOOKEEPER_CONNECT=zoo0:2181,zoo1:2181,zoo2:2181 deploy: replicas: 1 placement: constraints: [node.hostname == swarm-node-0] volumes: kafka0-data: driver: local
3. 仅持久化orderer与peer容器的/var/hyperledger/production目录,是否足以在故障恢复后重建区块链?
不够。原因在于:
- Peer节点的
/var/hyperledger/production目录存储了账本的世界状态、区块数据和链码数据,持久化这个目录确实能让peer故障重启后恢复本地账本状态,这部分是必要的。 - 但对于使用Kafka共识的orderer节点来说,
/var/hyperledger/production主要存储的是orderer的本地配置、签名密钥和少量本地状态,核心的交易日志数据实际上是存储在Kafka集群中的。如果只持久化orderer的production目录,而Kafka/ZK没有持久化,那么当Kafka节点故障重启后丢失了交易日志,orderer节点重启后无法从Kafka同步历史交易,会导致orderer无法生成完整的区块,整个区块链网络的账本一致性就会被破坏。
所以,要确保故障恢复后能完整重建区块链,你需要同时持久化以下几部分数据:
- Peer节点的
/var/hyperledger/production目录 - Orderer节点的
/var/hyperledger/production目录 - ZooKeeper的
/data和/datalog目录 - Kafka的
/kafka/data目录
内容的提问来源于stack exchange,提问作者Lurzim Sabahudin
相关产品推荐
相关产品推荐

