Fabric 1.4.1基于raft的排序服务

2020-11-11 16:08:13 浏览数 (1)

Fabric 1.4.1引入Raft排序服务, 运维界比较出名的etcd实现的orderer服务。后生可畏, etcd是中国一个年轻人的作品, 实现了raft协议, 在k8s等容器化, 虚拟化, 集群化有官方应用。etcd也是go语言编写, fabric开窍了, 直接把etcd和orderer整合了, 相比kafka/zookeeper的排序服务,搭建简单多了,也比kafka这些省了很多资源(kafka默认开的堆是2GB..), 所以个人是强烈推荐使用,尽量出来不久,但在1.4LTS维护, 是有保障的。

快速看下1.4.1的fabric-samples/first-network里面的raft排序服务如果使用。

运行./byfn.sh up -o etcdraft

创始块创建命令行是

configtxgen -profile SampleMultiNodeEtcdRaft -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block

查看configtx.yaml对应内容

SampleMultiNodeEtcdRaft:

<<: *ChannelDefaults

Capabilities:

<<: *ChannelCapabilities

Orderer:

<<: *OrdererDefaults

OrdererType: etcdraft

EtcdRaft:

Consenters:

- Host: orderer.example.com

Port: 7050

ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.crt

ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.crt

- Host: orderer2.example.com

Port: 7050

ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com/tls/server.crt

ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com/tls/server.crt

- Host: orderer3.example.com

Port: 7050

ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer3.example.com/tls/server.crt

ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer3.example.com/tls/server.crt

- Host: orderer4.example.com

Port: 7050

ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer4.example.com/tls/server.crt

ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer4.example.com/tls/server.crt

- Host: orderer5.example.com

Port: 7050

ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer5.example.com/tls/server.crt

ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer5.example.com/tls/server.crt

Addresses:

- orderer.example.com:7050

- orderer2.example.com:7050

- orderer3.example.com:7050

- orderer4.example.com:7050

- orderer5.example.com:7050

Organizations:

- *OrdererOrg

Capabilities:

<<: *OrdererCapabilities

Application:

<<: *ApplicationDefaults

Organizations:

- <<: *OrdererOrg

Consortiums:

SampleConsortium:

Organizations:

- *Org1

- *Org2

主要是指定了ClientTLSCert, ServerTLSCert

对应的docker-compse文件是docker-compose-etcdraft2.yaml, 基于orderer-base覆盖

orderer-base:

image: hyperledger/fabric-orderer:$IMAGE_TAG

environment:

- FABRIC_LOGGING_SPEC=INFO

- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0

- ORDERER_GENERAL_GENESISMETHOD=file

- ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block

- ORDERER_GENERAL_LOCALMSPID=OrdererMSP

- ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp

# enabled TLS

- ORDERER_GENERAL_TLS_ENABLED=true

- ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key

- ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt

- ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]

- ORDERER_KAFKA_TOPIC_REPLICATIONFACTOR=1

- ORDERER_KAFKA_VERBOSE=true

- ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/var/hyperledger/orderer/tls/server.crt

- ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/var/hyperledger/orderer/tls/server.key

- ORDERER_GENERAL_CLUSTER_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]

working_dir: /opt/gopath/src/github.com/hyperledger/fabric

command: orderer

额外的一些etcd配置参数看不到, 我们去启动的orderer容器的配置文件看下

docker exec -it -e LINES=(tput lines) -e COLUMNS=(tput cols) orderer.example.com bash

查看配置文件/etc/hyperledger/fabric/configtx.yaml,涉及的配置内容, awesome, options里面有etcd的配置项, 我们应该是在生成创始块的时候才能覆盖。

# EtcdRaft defines configuration which must be set when the "etcdraft"

# orderertype is chosen.

EtcdRaft:

# The set of Raft replicas for this network. For the etcd/raft-based

# implementation, we expect every replica to also be an OSN. Therefore,

# a subset of the host:port items enumerated in this list should be

# replicated under the Orderer.Addresses key above.

Consenters:

- Host: raft0.example.com

Port: 7050

ClientTLSCert: path/to/ClientTLSCert0

ServerTLSCert: path/to/ServerTLSCert0

- Host: raft1.example.com

Port: 7050

ClientTLSCert: path/to/ClientTLSCert1

ServerTLSCert: path/to/ServerTLSCert1

- Host: raft2.example.com

Port: 7050

ClientTLSCert: path/to/ClientTLSCert2

ServerTLSCert: path/to/ServerTLSCert2

# Options to be specified for all the etcd/raft nodes. The values here

# are the defaults for all new channels and can be modified on a

# per-channel basis via configuration updates.

Options:

# TickInterval is the time interval between two Node.Tick invocations.

TickInterval: 500ms

# ElectionTick is the number of Node.Tick invocations that must pass

# between elections. That is, if a follower does not receive any

# message from the leader of current term before ElectionTick has

# elapsed, it will become candidate and start an election.

# ElectionTick must be greater than HeartbeatTick.

ElectionTick: 10

# HeartbeatTick is the number of Node.Tick invocations that must

# pass between heartbeats. That is, a leader sends heartbeat

# messages to maintain its leadership every HeartbeatTick ticks.

HeartbeatTick: 1

# MaxInflightBlocks limits the max number of in-flight append messages

# during optimistic replication phase.

MaxInflightBlocks: 5

# SnapshotIntervalSize defines number of bytes per which a snapshot is taken

SnapshotIntervalSize: 20 MB

对应的orderer.yaml有一些配置,对etcd不熟, 需要研究下。

################################################################################

#

# Consensus Configuration

#

# - This section contains config options for a consensus plugin. It is opaque

# to orderer, and completely up to consensus implementation to make use of.

#

################################################################################

Consensus:

# The allowed key-value pairs here depend on consensus plugin. For etcd/raft,

# we use following options:

# WALDir specifies the location at which Write Ahead Logs for etcd/raft are

# stored. Each channel will have its own subdir named after channel ID.

WALDir: /var/hyperledger/production/orderer/etcdraft/wal

# SnapDir specifies the location at which snapshots for etcd/raft are

# stored. Each channel will have its own subdir named after channel ID.

SnapDir: /var/hyperledger/production/orderer/etcdraft/snapshot

把东西做简单是不简单的事情 , 给raft排序服务点赞。

最近华为事件,笔者深感纯做应用太被动,陆续的后面的分享方向是如何造轮子,和深挖源码实现,互勉吧。

0 人点赞