Hyperledger Fabric2中文文档-部署生产环境网络

翻译:https://hyperledger-fabric.readthedocs.io/en/latest/deployment_guide_overview.html

本部署指南以较高的层次介绍了构建Fabric网络的正确顺序,还有最佳实践和一些注意事项。注意本话题以单独个体的角度讨论“建立网络”。更有可能的是,在真实世界中生产网络是由多个个体合作搭建(如多个银行)。

部署Fabric网络是复杂的,需要理解公钥系统和管理分布式系统。如果你是一个智能合约开发者或者一个app开发者,不必知道部署生产级网络的知识。但是你可以了解网络是怎样部署的,以便开发出更好的智能合约和app。

如果你的需求只是用来测试链码和app,查阅Using the Fabric test network即可。这里包含了两个组织,每个有一个peer,和一个排序服务组织(在一个单独的order节点上)。test-network并不是一个生产网络的部署蓝图,因为它包含了生产环境不会做的假设。

下面列出部署生产网络的步骤:

  • 1.决定网络设置
  • 2.为资源设置集群
  • 3.安装CA
  • 4.用CA创建身份和MSP
  • 5.部署节点
    • 创建peer
    • 创建order

1.决定网络设置

区块链网络的结构必须由用例决定。基础的逻辑由你的业务决定,但这里我们准备了一些方案。

与开发环境或者概念证明不同,在生产环境中安全性,资源管理,高可用性都是需要优先考虑的。需要多少节点才能保证可用性,在哪些数据中心中部署才能满足容灾和存储。怎样保证私钥和信任的根持续安全。

除此之外,这里还有一些问题需要在部署之前考虑:

  • 配置证书颁发。整体考虑的一部分,你需要配置peer节点(多少节点,分布在哪些通道中),order节点(多少,谁拥有),也需要考虑你的组织怎样部署CA。生产环境需要TLS,这里需要TLS CA来产生证书。TLS CA需要在登陆CA之前部署,我们会在这里讨论Step three: Set up your CAs
  • 是否使用组织单位。一些组织可能需要建立组织单位,以便在特定身份和有单个CA创建的MSP之间创建隔离。
  • 数据库类型。网络中一些通道可能需要以状态数据库理解的方式建模,比如CouchDB,有些网络可能需要以速度为优先考虑,而使用LevelDB。注意,通道中不能有peer同时配置CouchDB和LevelDB,这两种数据类型轻微不同。
  • 通道和私有数据。有些网络 认为通道是保证隐私和数据隔离的最佳方式。其它网络可能认为单独的通道和私有数据,会更好的满足隐私要求。
  • 容器编排。不同的用户会有不同的容器编排,为各模块创建单独的容器,peer进程,peer的日志,CouchDB,gRPC,链码,其他用户可能会决定合并一些进程。
  • 链码部署方式。现在用户可以选择,内置的编译和运行,使用 External Builders and Launchers自定义编译和运行,或者 Chaincode as an external service。
  • 使用防火墙。在生产环境中,一个组织的组件可能会需要访问其它组织的组件,必须使用防火墙或高级网络设置。例如,app使用SDK需要能访问所有通道中所有组织的peer和order。类似的,peer需要进入order排序服务并且接受新的区块。

无论组件部署在哪里,你都需要在管理系统(如Kubernetes)有很高的知识,以便于管理网络。类似的,网络结构必须设计的符合你的场景,符合法律和政府规定。

本文不会给出所有的网络配置,但会给出一些通用的指导和规则。

2.为资源设置集群

一般来说,Fabric与部署和使用方式无关。举例来说,甚至可以在笔记本上部署和管理。因很多原因,不建议这样做,但Fabric并没有限制。

一旦你有能力部署容器,无论是本地还是云端,都是可以建立组件并把他们连接起来。Kubernetes有很多有用的工具,这都使它成为有管理和部署Fabric的流行工具。更多Kubernetes细节,查看the Kubernetes documentation。本文将话题限制在可执行文件以及使用Docker部署或使用Kubernetes时可使用的命令。

无论何时何地,部署组件时,首先需要确保有足够的资源来运行组件。大小取决与业务场景。如果需要将一个peer加入到几个数据很多的channel中,它会需要更多的CPU和内存。粗略估算,peer节点比order节点计划将多三倍的资源(建议至少3个,最佳5个order节点)。CA大概需要peer十分之一的资源来。需要在集群上安装存储,否则将不能配置持久卷和持久卷声明。

通过部署概念测试网络并在负载下对其进行测试,您将更好地了解所需的资源。

管理基础架构

后端的选择决定了对后端管理工具的选择。然而,也有一些值得注意的事项。

  • 在集群中使用秘密object来加密存储重要的配置。关于Kubernetes秘钥查询 Kubernetes secrets。你也可以有选项来使用Hardened Security Modules(HSM)或者加密的持久卷(PVs)。沿着相似的路线,在部署完Fabric组件,你会想要链接容器的后台,例如使用私人库提供服务如Docker Hub。在这种情况下,您需要以Kubernetes机密的形式对登陆信息进行编码,并在部署组件时将其包含在YAML文件中。
  • 集群注意事项和节点大小。在第二步中,我们讨论了怎样考虑节点的大纲。你的用例,一个健壮的开发周期,是唯一的方式来知道需要多大的peer,order,CA。
  • 如何选择挂载硬盘。最好是将硬盘挂在在节点部署的外部。这将有利于以后引用硬盘(例如重启节点或者容器崩溃),且无需重新部署和生成秘钥素材。
  • 如何监控资源。建立一个体系来监控节点和部署的集群是重要的。当peer加入更多的channel时,需要增加它的CPU和内存。类似的,你需要确保有足够的空间来存储状态数据库和区块链。

3.安装CA

Fabric网络中第一个安装的组件是CA。因为节点的证书(不仅是节点自身还有节点的管理员)要创建在节点部署之前。并不一定用Fabric CA来创建这些证书,Fabric CA也可以创建正确定义组件和组织的MSP结构。如果用户自己选择创建CA而不是用Fabric CA,那么还需要自己创建MSP文件夹。

  • 一个CA(或者更多CA,如果使用了中间CA)用来创建组织管理员的证书,组织的MSP,还有组织内的节点。这个CA还会创建额外的用户证书。因为它的角色是登陆认证,这个CA也被叫做enrollment CA或者ecert CA。
  • 其它CA产生用来做加密通信的证书TLS。因为这个原因,这个CA也常被成为TLS CA。这些TLS证书被用来组织中间键攻击。注意TLS CA也常被用来启动节点或者关闭节点。用户可以选择单项或者双向的TLS,使用下面会讲的“mutual TLS”。在部署enrollment CA之前要明确指定是否需要TLS。你需要首先部署TLS CA并使用更证书启动注册CA。这个TLS证书也被fabric-ca client使用,当连接注册CA和登陆用户和节点身份时。

而由与组织相关的所有非TLS证书都能被根CA创建(也就是说,CA是它自己的信任根),安全的增加组织可以使用中间CA.因为一个根CA的妥协可能会导致整个信任域的崩塌,中间CA是防止根CA暴漏的有效办法。是否选择中间CA取决于你的用例。这不是强制的。还可以配置使用了LDAP来管理那些已经实现了此功能且不想在现有基础结构中添加身份管理层的企业。LDAP有效的提前注册了目录的所有成员且根据统一的标准来管理登陆。

在生产网络中,建议组织至少部署一个CA用于登陆注册,另一个用于TLS.例如,如果部署了三个peer属于一个组织,一个排序节点属于排序组织,那你至少需要四个CA。每个peer有至少两个CA(登陆和TLS,admin,通信,代表组织的目录)还有两个是为排序节点。注意用于一般只用注册登陆CA来登陆,而节点会注册登陆都使用登陆CA(节点会得到签名证书并且为它的动作签名)使用TLS CA通信。

查看怎样安装组织CA和TLS CA和登陆admin的例子,查看 Fabric CA Deployment Guide。部署指导使用Fabric CA客户端来注册登陆CA认证。

4.使用CA创建身份和MSP

一旦你创建了CA,你可以创建组织中的证书和组件。对每一个组织,你至少需要:

  • 注册登陆管理员身份和MSP。一旦和组织关联的CA被创建,它可以用来注册身份和登陆。在第一步中,用户名和密码是给CA分配的管理员。属性和从属关系也可以赋予身份(例如,一个admin的角色,是组织的管理员)。当注册了身份后,就可以使用用户名和密码来登陆。CA会为身份生成两种证书,一个公钥证书(也被成为signcert)被网络其他成员所知,和一个私钥(存储在keystore目录中)。CA还将生成一个MSP文件,其中包含办法证书的CA的公共证书和CA的信任根(是可能一样也可能不一样的CA)。这个MSP被认为是定义了和管理员相关联的组织。查看这个过程的示例 this example of how an admin is enrolled。在案例中组织的管理员也是节点管理员(被指定),需要在创建本地节点的MSP之前创建组织的管理员,因为在创建本地MSP时必须使用节点 admin的证书。
  • 注册和登陆节点身份。仅作为管理员的身份来来注册登陆,节点身份必须必须注册和登陆使用 enrollment CA和TLS CA.因为这个原因,enrollment CA和TLS CA可以用来共享数据(它允许节点标识只注册一次且每个CA server单独登陆),尽管这是一个可选的配置项。而不是在注册CA时赋予节点管理员或用户角色。给它赋予peer或orderer的角色。与管理员一样,还可以以此为标识分配属性和从属关系。节点的MSP被成为“local MSP”,因为分配给标识的权限只在本地级别关联。MSP会在节点身份创建时创建,引导节点时创建。当登陆TLS CA加入通道时,你需要使用TLS根证书(这个证书必须加入到org MSP)。当使用peer的CLI客户端命令时来调用其它peer或orderer(因为没有orderer CLI)。很有必要添加TLS根证书到本地节点的MSP,因为证书包含了通道的配置。

更多概念信息,关于身份和权限的查看Identity 和 Membership Service Provider (MSP).

查看怎样使用CA来生成管理员身份和MSP,查看 Enroll Org1’s Admin.

查看怎样使用 enrollment CA 和TLS CA 来为节点生成证书,查看Setup Org1’s Peers.

5.部署节点

一旦你收集了所需的所有的证书和MSP,你也可以准备创建节点。综上所述,有很多有效的方法来部署节点。

创建peer

在创建peer之前,你需要设置peer的配置文件。在Fabric中,这个文件叫core.yaml,这里有一个示例 in the sampleconfig directory of Hyperledger Fabric.

在文件中可以看到,有很多参数你要么可以设置,要么需要设置才能是节点正常工作。普遍来讲,如果不需要调整值,就不要管。然而,你可能需要调整下地址,数据库的类型,MSP文件夹地址。

有三个主要选项可用于调整。

1.编辑与二级制文件绑定的YAML。

2.部署时使用环境变量重写。

3.指定CLI命令的flag

方式1的优点是节点启动与关闭改变的配置都会存在。缺点是当执行文件版本升级时需要更新新的YAML文件(新版本要用新的YAML文件)。

不管怎样,core.yaml中以下的值你必须看一下。

  • peer.localMspID:这是组织的MSP名称。这个MSP是peer的组织管理员以及peer组织的根CA和TLS CA证书
  • peer.mspConfigPath:peer的MSP本地路径。注意这是最好的方式来挂载磁盘。这保证了即使容器停止了(例如,在维修保养期)这个MSP也不会丢不必重新创建。
  • peer.address:代表着组织中peer的地址,是组织内gossip通信的重要事项。
  • peer.tls: 当设置了值为true(生产网络一定要设置),你需要指定相关的TLS证书。需要注意,网络中所有peer(peer节点和orderer节点)要不都设置true要不都设置false。生产模式下,强烈建议要设置成true。这也是最好的挂载磁盘到容器的最好方式。
  • ledger:用户有多种方式来创建账本,包括状态数据库(LevelDB或者CouchDB)这是peer最好的方式来操作状态数据(例如,在一个隔离的容器中),因为这样可以更好的将资源分给数据库。处于延迟和安全考虑,最好的方式是在peer所在的服务器上使用CouchDB容器,对CouchDB容器的控制应该仅限于peer容器。
  • gossip:这里有大量配置选项 Gossip data dissemination protocol,包括externalEndpoint (使peer可以被其它组织的peer发现)也包括bootstrap 地址(标明peer在组织内)
  • chaincode.externalBuilders:这个字段很重要的设置当使用Chaincode as an external service

当你熟悉了怎样配置peer,怎样挂载磁盘,后台设置,你就可以运行peer了(这个命令取决于你的后台设置)。

创建order节点

和创建peer不同,你需要先创建一个创始区块(或者指定一个已经存在的区块,在将一个order节点增加到已经存在order服务的时候)并且在启动order节点之前指明它的目录。

在Fabric,这个配置文件叫做orderer.yaml.在 in the sampleconfig directory of Hyperledger Fabric中有个示例。注意orderer.yaml不同于组织的创始区块。创始区块包含了初始化的配置和orderer系统的通道,必须在创建排序节点之前创建因为它用来引导节点。

和peer一样,有很多参数需要设置。普遍来说,如果你不需要调整值,就不要管它。

有三种方式调整配置

1.编辑和可执行文件绑定的YAML文件。

2.当部署时通过环境变量改变。

3.CLI命令中指定参数 

方式1可以保证改变的配置一直存在无论是否启动或关闭了节点。缺点是当升级二级制执行文件时,需要使用新的YAML文件。

不管怎么样,orderer.yaml中的一些设置项必须要看。它们中一些和core.yaml中的参数很像只是名字不同。

  • General.LocalMSPID:这是的MSP的名称,orderer组织的CA产生的。
  • General.LocalMSPDir:orderder的MSP所在路径。这是最好的挂在磁盘到容器的方式。
  • General.ListenAddress 和 General.ListenPort:代表了终端地址
  • FileLedger:尽管排序节点没有状态数据库,但他们依然保存区块链,这样他们可以使用最新的配置区块来验证权限。因此此字段应该被设置为正确的值。
  • Cluster:这些值对于order 节点非常重要,例如raft在order排序服务中。
  • General.BootstrapFile:这是配置区块(用来引导order节点)的名称。如果这个节点是排序服务的第一个节点,这个文件会被生成,且被成为“创世区块”。
  • General.BootstrapMethod:引导区块提供的方法。到现在,这个只能是file,在BootstrapFile中指定。从2.0开始,你可以写none从而简单的开始不用引导。
  • Consensus: 确定共识插件(支持并推荐Raft排序服务)允许的预写日志(WALDir)和快照(SnapDir)的键/值对。

当你熟悉了order节点怎么配置,怎样挂在磁盘,设置后台,就可以运行命令来启动order(启动命令是由backend配置决定的)

下一步

区块链网络都是关于链接的,所以一旦部署节点,显然需要将各个节点链接起来。如果你有组织和peer,你希望加入到某个联盟里面且加入到某个通道里面。如果你有一个排序节点,你希望peer加入到你的联盟中,你也需要学习怎样开发链码,查看 The scenario。

链接节点和创建通道的过程的一部分涉及修改策略以适应业务网络的用例。策略的更多信息,查看 Policies

Fabric的一个常见任务是编辑已存在的通道。这部分目录是 Updating a channel configuration。常见的通道升级是新增一个组织到通道,查看Adding an Org to a Channel。部署节点的更多信息 Upgrading your components

部署生产CA

  • Planning for a CA
  • Checklist for a production CA server
  • CA deployment steps

你可能感兴趣的:(区块链)