在 Kubernetes 上部署 Hyperledger Fabric v1.2 Kafka(三)

Hyperledger Fabric 目前支持两种共识机制,上篇讲到了 Solo 共识的部署,适用于开发环境。这篇讲一下 Kafka 共识。

Kafka 共识原理

准备工作

在部署之前清除上篇所有的数据。

1
2
# python3 transform/delete.py
# rm -rf /opt/data/{orderer,peer}

配置文件

crypto-config.yaml

修改 OrdererType Solo 为 kafka

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Profiles:

TwoOrgsOrdererGenesis:
<<: *ChannelDefaults
Orderer:
<<: *OrdererDefaults
OrdererType: kafka
Organizations:
- *OrdererOrg
Consortiums:
SampleConsortium:
Organizations:
- *Org1
- *Org2

TwoOrgsChannel:
Consortium: SampleConsortium
Application:
<<: *ApplicationDefaults
Organizations:
- *Org1
- *Org2

部署

Kafka 和 Zookeeper 集群

为了可用性,至少需要 4 个 Kafka 和大于 3 个奇数 Zookeeper 实例。具体可以看官方文档。

部署之前需要修改 0pv.yaml 中的 nfs 地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# cd kafka

# ./run.sh
persistentvolume "datadir-kafka-0" created
persistentvolume "datadir-kafka-1" created
persistentvolume "datadir-kafka-2" created
persistentvolume "datadir-kafka-3" created
namespace "kafka" created
service "zookeeper" created
service "zoo" created
statefulset "zoo" created
persistentvolumeclaim "datadir-kafka-0" created
persistentvolumeclaim "datadir-kafka-1" created
persistentvolumeclaim "datadir-kafka-2" created
persistentvolumeclaim "datadir-kafka-3" created
service "broker" created
service "kafka" created
statefulset "kafka" created
Deploying Kafka and Zookeeper finished.

# kubectl get pod --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kafka kafka-0 1/1 Running 5 18m
kafka kafka-1 1/1 Running 2 18m
kafka kafka-2 1/1 Running 0 12m
kafka kafka-3 1/1 Running 0 12m
kafka zoo-0 1/1 Running 0 19m
kafka zoo-1 1/1 Running 0 18m
kafka zoo-2 1/1 Running 0 17m
kafka zoo-3 1/1 Running 0 16m
kafka zoo-4 1/1 Running 0 15m

等待 kafka Running。后边的步骤和上篇部署章节完全一致。

清除集群

先按上篇方法清除 Fabric 集群,然后:

1
2
3
# cd kafka
# ./delete.sh
# sudo rm -rf /opt/data/kafka

遗留问题

这里使用默认的 LevelDB。使用 CouchDB 的话,在 Kafka 共识中链码操作会有问题,但安装和实例化都正常,在 peer 日志中会看到相关写入报错,但原因未知。在 Solo 模式下,CouchDB 写入正常。