Hyperledger Fabric Peer 配置解析

841 阅读12分钟

Hyperledger Fabric Peer 配置解析

文中使用的 fabric 版本为 2.4.1

在Fabric网络中,用户可以设定Peer节点、排序节点、CA节点的行为,以及管理通道、组织身份等多种资源,这都涉及网络内配置。

Fabric节点在启动时可通过加载本地配置文件或环境变量等方式获取配置信息,同时结合少量命令行参数。

通常用户需要提前编写配置文件,供服务启动时使用;也可以仅在配置文件中指定部分默认值,使用环境变量动态指定可以实现更灵活的配置加载。

默认情况下,Fabric节点的主配置路径为FABRIC_CFG_PATH环境变量所指向路径(默认为/etc/hyperledger/fabric)。在不显式指定配置路径时,会尝试从主配置路径下查找相关的配置文件。

节点默认配置文件路径主要功能
Peer 节点$FABRIC_CFG_PATH/core.yaml指定 peer 节点运行时参数
Orderer$FABRIC_CFG_PATH/orderer.yaml指定 orderer 节点运行时参数
CA 节点$FABRIC_CA_SERVER_HOME/fabric-ca-server-config.yaml指定 CA 节点运行时参数

除了各节点配置文件,Fabric还在每个通道内通过配置区块来维护通道范围的配置信息,通道配置可由 configtx.yaml 文件设定。

这些配置需要使用特定工具进行管理,这些工具包括cryptogenconfigtxgenconfigtxlator

工具默认配置文件路径主要功能
cryptogen命令行参数 --config 指定负责生成网络中组织结构和身份文件
configtxgen命令行参数 --configPath 指定利用 configtx.yaml 文件生成通道初始配置;创建配置更新交易
configtxlatorN/A将通道配置在二进制和 JSON 格式之间进行转换,并计算配置更新量

Peer 配置剖析

当Peer节点启动时,会按照优先级从高到低的顺序依次尝试从命令行参数、环境变量和配置文件中读取配置信息。

当从环境变量中读入配置信息时候,除了日志使用单独的FABRIC_LOGGING_SPEC环境变量进行指定,其他都需要以CORE_前缀开头。例如,配置文件中的peer.id项,对应环境变量CORE_PEER_ID。>当从环境变量中读入配置信息时候,除了日志使用单独的FABRIC_LOGGING_SPEC环境变量进行指定,其他都需要以CORE_前缀开头。例如,配置文件中的peer.id项,对应环境变量CORE_PEER_ID。

Peer节点默认的配置文件读取路径为$FABRIC_CFG_PATH/core.yaml;如果没找到,则尝试查找当前目录下的./core.yaml文件;如果还没有找到,则尝试查找默认的/etc/hyperledger/fabric/core.yaml文件。

在结构上,core.yaml文件中包括peer、vm、chaincode、ledger、operations、metrics六大部分。


peer 部分

peer部分包括与服务直接相关的核心配置,内容比较多。除了一些常规配置,还包括keepalive、Gossip、TLS、BCCSP、handler、discover等多个配置部分。

配置项类型作用默认值
id常规配置Peer在网络中的ID信息,用于辨识不同的节点N/A
networkId常规配置网络自身的ID,逻辑上可以通过ID指定多个隔离的网络N/A
listenAddress常规配置服务监听的本地地址,本地有多个网络接口时可指定仅监听某个接口0.0.0.0:7051
address常规配置对同组织内其他节点的监听连接地址。当服务在NAT设备上运行时,该配置可以指定服务对外宣称的可访问地址。如果是客户端,则作为其连接的Peer服务地址0.0.0.0:7051
addressAutoDetect常规配置是否自动探测服务地址。当Peer服务运行环境的地址是动态时,该配置可以进行自动探测,探测将内部地址作为服务地址。默认情况下关闭。注意启用TLS时候最好关闭,以免与指定的域名冲突造成认证失败false
fileSystemPath常规配置本地数据存放路径,包括账本、链码等/var/hyperledger/production
mspConfigPath常规配置MSP目录所在的路径,可以为绝对路径,或相对配置目录的路径,一般建议为/etc/hyperledger/fabric/mspmsp
localMspId常规配置Peer所关联的MSP ID,一般为所属组织名称,需要与通道配置内名称一致SampleOrg
deliveryclient常规配置到排序服务连接的配置。值得注意的是addressOverrides域。当Peer加入通道时会从初始区块提取排序服务信息,此时排序节点地址或证书可能已经发生变化。使用此处配置可以映射到新版本排序服务,避免出现无法加入通道的情况N/A
limits常规配置对访问频率进行限制,可以限定endorserService , deliverService , gatewayService服务处理的并发数endorserService=2500 , deliverService=2500 , gatewayService=2500
keepalive.interval保活消息如果服务端发现客户端在指定时间内未有任何消息,则主动发送gRPC Ping进行探测7200s
keepalive.timeout保活消息服务端发送Ping消息后,如果客户端在指定时间内未响应,则断开连接20s
keepalive.minInterval保活消息允许其他人发送保活消息的最小时间间隔,太快的消息会导致连接中断,以避免DoS攻击60s
keepalive.client保活消息作为客户端连接其他Peer节点时发送消息的间隔和超时时间interval: 60s , timeout: 20s
keepalive.deliveryClient保活消息作为客户端连接排序节点时发送消息的间隔和超时时间interval: 60s , timeout: 20s
gossip.bootstrap启动和连接节点启动后向组织内指定节点发起Gossip连接,以加入网络。bootstrap节点会答复自己所知的邻居信息127.0.0.1:7051
gossip.endpoint启动和连接本节点在同一组织内的gossip idpeer.address
gossip.maxBlockCountToStore启动和连接保存到内存中的区块个数上限,超过则丢弃10
gossip.skipBlockVerification启动和连接是否对区块消息进行校验false
gossip.dialTimeout启动和连接gRPC连接拨号的超时时间3s
gossip.connTimeout启动和连接建立连接的超时时间2s
gossip.aliveTimeInterval启动和连接定期发送Alive心跳消息的时间间隔5s
gossip.aliveExpirationTimeout启动和连接Alive心跳消息的超时时间25s
gossip.reconnectInterval启动和连接断线后重连的时间间隔25s
gossip.externalEndpoint启动和连接节点向组织外节点公开的服务地址,默认为空,代表不被其他组织所感知N/A
gossip.membershipTrackerInterval邻居发现定期探测当前邻居状态是否变更的时间间隔5s
gossip.maxPropagationBurstLatency邻居发现保存消息的最大时间,超过则转发给其他节点10ms
gossip.maxPropagationBurstSize邻居发现保存的最大消息个数,超过则转发给其他节点
gossip.propagateIterations邻居发现消息转发的次数1
gossip.propagatePeerNum邻居发现推送消息给指定个数的节点3
gossip.pullInterval邻居发现触发拉取消息的时间间隔,发送Hello消息收到对方摘要,更新摘要字典后发送拉取请求等待对方响应,应该比digestWaitTime+requestWaitTime长4s
gossip.pullPeerNum邻居发现从指定个数的节点拉取消息3
gossip.requestStateInfoInterval邻居发现从节点拉取状态信息(StateInfo)消息的时间间隔4s
gossip.publishStateInfoInterval邻居发现向其他节点推动状态信息消息的时间间隔4s
gossip.stateInfoRetentionInterval邻居发现状态信息消息的超时时间N/A
gossip.publishCertPeriod邻居发现启动后在心跳消息中包括证书的等待时间10s
gossip.recvBuffSize邻居发现收取消息的缓冲大小20
gossip.sendBuffSize邻居发现发送消息的缓冲大小200
gossip.digestWaitTime邻居发现拉取消息方发送Hello消息后等待对方返回摘要(开始更新摘要字典)的时间,之后发送Req消息1s
gossip.requestWaitTime邻居发现被拉取方收到Hello消息,发送摘要,等待接收拉取请求的超时1500ms
gossip.responseWaitTime邻居发现拉取方发送拉取请求后等待收到响应的超时2s
gossip.nonBlockingCommitMode邻居发现是否启用非阻塞模式提交区块到本地,默认关闭。是隐藏参数N/A
gossip.useLeaderElection选举是否允许节点之间动态进行组织的代表(leader)节点选举,通常情况下推荐开启false
gossip.orgLeader选举本节点是否指定为组织的代表节点。与useLeaderElection不能同时指定为truetrue
gossip.election.startupGracePeriod选举代表成员选举等待的时间15s
gossip.election.membershipSampleInterval选举查成员稳定性的采样间隔1s
gossip.election.leaderAliveThreshold选举Peer尝试进行选举的等待超时10s
gossip.election.leaderElectionDuration选举Peer宣布自己为代表节点的等待时间5s
gossip.pvtData.pullRetryThreshold私有数据拉取区块相关私密数据的最长等待时间,超过则忽略而直接提交区块60s
gossip.pvtData.transientstoreMaxBlockRetention私有数据私密数据临时保存在本地临时数据库,在清除前等待的最大新区块个数。超过则会被从本地临时数据库删除。默认为1000,意味着每当1000的整数倍区块提交时,与当前区块差异超过1000的旧区块关联的私密数据将从临时数据库删除1000
gossip.pvtData.pushAckTimeout私有数据背书环节中推送消息到其他Peer的等待响应时间3s
gossip.pvtData.btlPullMargin私有数据只获取在给定的区块数内不超时的私密数据10
gossip.pvtData.reconcileBatchSize私有数据协同时单次拉取的最多私密数据个数10
gossip.pvtData.reconcileSleepInterval私有数据协同的间隔1m
gossip.pvtData.reconciliationEnabled私有数据启用协同true
gossip.pvtData.skipPullingInvalidTransactionsDuringCommit私有数据在本地提交时,跳过对非法交易私密数据的获取false
gossip.pvtData.implicitCollectionDisseminationPolicy私有数据指定对等体自己的隐式集合的传播策略。当对等端认可一个写到它自己的隐式集合的提议时,下面的值将覆盖用于传播私有数据的默认值。注意,它适用于对等体已加入的所有通道。这意味着requiredPeerCount必须小于来自组织的对等体数量最低的通道中的对等体数量requiredPeerCount: 0 , maxPeerCount: 1
gossip.state.enabled状态转移是否开启允许通过状态传递(state transfer)快速追踪到最新区块false
gossip.state.checkInterval状态转移检查是否触发状态传递的时间间隔10s
gossip.state.responseTimeout状态转移回复的等待超时3s
gossip.state.batchSize状态转移通过状态传递获得的区块数10
gossip.state.blockBufferSize状态转移Peer缓存收到的待排序区块的个数,最大不超过配置的两倍20
gossip.state.maxRetries状态转移状态传递请求的重试次数3
gossip.state.channelSize状态转移为每个通道缓冲的状态请求消息个数,超过指定阈值则忽略,是隐藏参数N/A
tls.enabledTLS配置开启 server 端 TLS检查false
tls.clientAuthRequiredTLS配置要求入站连接的客户端证书/相互TLSfalse
tls.cert.fileTLS配置server 端使用的 TLS 证书路径tls/server.crt
tls.key.fileTLS配置server 端使用的 TLS 私钥路径tls/server.key
tls.rootcert.fileTLS配置server 端使用的根CA的证书,签发服务端的 TLS证书tls/ca.crt
tls.clientRootCAs.filesTLS配置用于校验客户端身份时,所使用的根CA证书列表tls/ca.crt
tls.clientKey.fileTLS配置作为客户端连接其他服务时所用的TLS私钥,如果不指定,默认使用 tls.keytls.key
tls.clientCert.fileTLS配置作为客户端连接其他服务时所用的TLS证书,如果不指定,默认使用 tls.keytls.cert
BCCSPBSSCP负责抽象密码库相关处理,配置算法类型、文件路径等SW
BCCSP.SW.HashBSSCPHash 算法类型,目前仅支持 SHA2SHA2
BCCSP.SW.FileKeyStore.KeyStoreBSSCP本地私钥文件路径,默认指向 mspConfigPath/keystoremspConfigPath/keystore
BCCSP.PKCS11BSSCPPKCS11 相关配置N/A
handlers.authFiltershandlers自定义的权限过滤插件,对消息权限进行校验DefaultAuth , ExpirationCheck
handlers.decoratorshandlers自定义修饰插件 ,对发给链码的数据添加额外处理DefaultDecorator
handlers.endorsershandlers自定义背书插件,负责背书过程处理DefaultEndorsement
handlers.validatorshandlers自定义验证插件,提交前进行验证DefaultValidation
discovery.enabled服务发现开启服务发现,服务发现功能为客户端提供了快速查询网络中拓扑、节点相关信息的功能true
discovery.authCacheEnabled服务发现是否启用对认证的缓存机制true
discovery.authCacheMaxSize服务发现最大缓存个数1000
discovery.authCachePurgeRetentionRatio服务发现缓存清理后保存的比列0.75
discovery.orgMembersAllowedAccess服务发现是否允许普通成员进行通道范围之外的信息查询,默认仅限Adminfalse

vm 部分

对链码运行环境的配置,目前仅支持Docker容器服务。

配置项作用默认值
endpointdocker daemon 地址unix:///var/run/docker.sock
docker.tlsdocker daemon 启用 TLS 时相关证书和密钥文件配置false
docker.attachStdout是否启用连接到标准输出false
docker.hostConfig.NetworkMode运行链码容器的网络模式host
docker.hostConfig.Dns容器使用的DNS服务器列表N/A
docker.hostConfig.LogConfig日志配置N/A
docker.hostConfig.Memory内存限制大小,-1表示无限制2147483648

chaincode 部分

配置项作用默认值
id动态标记链码的信息,该信息会以环境变量标签形式传给链码容器N/A
builder通用 docker 镜像编译环境(DOCKERNS)/fabricccenv:(DOCKER_NS)/fabric-ccenv:(TWO_DIGIT_VERSION)
pull实例化链码时是否从仓库拉取基础镜像false
golang.runtimego 语言链码部署生成镜像的基础 docker 镜像(DOCKERNS)/fabricbaseos:(DOCKER_NS)/fabric-baseos:(TWO_DIGIT_VERSION)
golang.dynamicLink链码编译过程是否进行动态链接false
javajava 语言链码部署生成镜像的基础 docker 镜像(DOCKERNS)/fabricjavaenv:(DOCKER_NS)/fabric-javaenv:(TWO_DIGIT_VERSION)
nodenodejs 链码的运行容器(DOCKERNS)/fabricnodeenv:(DOCKER_NS)/fabric-nodeenv:(TWO_DIGIT_VERSION)
externalBuilders指定外部的链码编译和运行插件的路径列表N/A
installTimeout等待链码编译和安装完成的超时时间300s
startuptimeout启动链码容器的超时时间300s
executetimeout调用链码执行超时时间30s
mode执行链码的模式net
keepalivepeer 和链码之间的心跳超时,小于或等于0意味着关闭0
system系统链码配置,所有启用的链码都必须在这里注册_lifecycle: enable , cscc: enable , lscc: enable , qscc: enable
logging链码容器日志相关配置N/A

ledger 部分

配置项作用默认值
blockchain暂未使用N/A
state.stateDatabase状态数据库类型(goleveldb , CouchDB)goleveldb
state.totalQueryLimit每次链码查询最大返回记录数100000
state.couchDBConfig.couchDBAddresscouchdb 连接地址127.0.0.1:5984
state.couchDBConfig.usernamecouchdb 用户名N/A
state.couchDBConfig.passwordcouchdb 密码N/A
state.couchDBConfig.maxRetries出错后重试次数3
state.couchDBConfig.maxRetriesOnStartup启动出错重试次数10
state.couchDBConfig.requestTimeout请求超时时间35s
state.couchDBConfig.internalQueryLimit链码内单个逻辑查询返回的最大记录数1000
state.couchDBConfig.maxBatchUpdateSize批量更新的最大记录数1000
state.couchDBConfig.createGlobalChangesDB是否创建 _global_changes 系统库,会追踪全局修改false
state.couchDBConfig.cacheSize最大分配的缓存大小,需要为 32MB 的整数倍64
history.enableHistoryDatabase是否启用历史数据库true
pvtdataStore.collElgProcMaxDbBatchSize提交一批私有数据的最大个数5000
pvtdataStore.collElgProcDbBatchesInterval提交一批私有数据的最短时间间隔,单位毫秒1000
pvtdataStore.deprioritizedDataReconcilerIntervalN/A1000
snapshots.rootDir存储分类账快照的文件系统上的路径/var/hyperledger/production/snapshots

operations 部分

配置项作用默认值
listenAddressRESTful 管理服务的监听地址127.0.0.1:9443

metrics 部分

配置项作用默认值
provider统计服务类型,可以为statsd(推送模式),prometheus(拉取模式),disableddisabled
statsd.network网络协议类型,tcp或udpudp
statsd.address修改为外部 statsd 的服务地址127.0.0.1:8125
statsd.writeInterval推送统计汇报到 statsd 的时间间隔10s
statsd.prefix为所有统计推送添加前缀N/A

注意 statsdprometheus 都是流行的开源监控数据收集软件。