GithubHelp home page GithubHelp logo

chain-project's Introduction

Hyperledger fabric  多机部署实战;

 官方fabric的更新速度还是相对较快的,v1.0跟v1.1还是有一些差异的,由于当前要上生产的时候发现v1.1“更好”一点,所以升级到了v1.1,所以做了相应的改动。

 本工程v2版本更新内容如下:
	1、增加了couchdb、ca节点;
	2、增加数据持久化配置;
	3、升级适配fabric1.1
	需要先升级fabric环境,重新拉取fabric,拉取相应的docker镜像

一、环境准备
本文实战的前置条件:
	1.安装部署了 fabric ;
	2.成功运行fabric e2e_cli单机模式;(直接运行example脚本即可)
	3.单机部署,可参考文章:https://www.jianshu.com/p/4ae6d070ddbb
单机部署比较简单,基本就是docker、go安装和镜像拉取、案例拉取,运行脚本即可。

这里简单再讲下安装环境:
	1、安装docker、docker-compose、go、gcc、git,这个可参考以上链接
	2、创建一个目录:/opt/gopath/src/github.com/hyperledger ,拉取最新的fabric: git clone https://github.com/hyperledger/fabric.git
	3、进入fabric,运行scripts/bootstrap.sh 拉取镜像
	4、拉取完成后,make release
	5、进入examples/e2e_cli  运行./network_setup.sh up 最终看到all good 即可,记得下次运行前,先./network_setup.sh down 
	6、大功告成

升级:
	尝试过只拉取镜像,fabric不拉取最新的,结果发现有些配置会不一样导致程序报错,所以建议重新拉取一下fabric 然后再拉去下镜像


操作系统:centos7.0;

二、目标
本案例旨在部署包含3个orderer节点、4个peer节点(两个组织)的farbic基础网络架构
排序服务使用多进程的kafka共识:其中包括4个kafka节点和3个zookeeper节点;
peer节点状态数据库用的是couchdb,所以包括了4个couchdb节点;
使用ca服务器,每个组织一个ca服务器,所以包括了2个ca节点;
基础网络稳定后,就不可以全心投入智能合约研发和顶层业务定制,后者才是重点。

部署情况:

10.0.200.111机器:
	|-orderer1.lychee.com
	|-ca0.org1.lychee.com

10.0.200.113机器:
	|-orderer2.lychee.com
	|-peer0.org1.lychee.com
	|-z1   (zookeeper)
	|-k1   (kafka)
	|-couchdb0.org1.lychee.com

10.0.200.114机器:
	|-orderer3.lychee.com
	|-peer1.org1.lychee.com
	|-z2
	|-k2
	|-couchdb1.org1.lychee.com

10.0.200.115机器:
	|-peer0.org2.lychee.com
	|-z3
	|-k3
	|-couchdb0.org2.lychee.com

10.0.200.116机器:
	|-peer1.org2.lychee.com
	|-k4
	|-ca0.org2.lychee.com
	|-couchdb1.org2.lychee.com

三、文件说明
部署最终要的是要理解,不然每次遇到问题就会没有头绪。
文件主要分三类:证书相关、docker容器相关和帮助类脚本;
1、证书相关文件
	区块链中一个比较重要的特性就是安全、防篡改,所以证书就必不可少;比较常见的证书创建工具是openssl,fabric有自己的一个证书生成工具:cryptogen;每个通道的创世区块是需要预先生成的,fabric提供的工具是configtxgen;
	cryptogen 可以指定配置文件:crypto-config-3o4p.yaml,这个文件定义了有多少个orderer和组织,每个组织有多少个peer;
	configtxgen 默认使用:configtx.yaml,这个文件描述了通道有多少个组织加入,以及排序服务属性、区块大小等等;
	我们把这个配置放在了CentOs-111服务器上了,所以要去centos-111/e2e_cli文件夹中查看

2、docker容器相关文件
	docker启动可以使用docker-compose,指定配置文件;配置文件中则包含了容器名称、环境变量、端口映射、文件夹映射、容器启动后的立即运行的命令等等;可参考:https://www.jianshu.com/p/00c5939a64af 查看每个字段的含义;要注意文件映射和cli服务的环境变量!
	docker配置文件又可层层包含,将可共用的部分单独制定一个文件,名称可自定义,但要注意别写错,比如base中的文件;
	文件包括:
		docker-compose-orderer.yaml  orderer容器配置文件
			|-base/docker-compose-base.yaml
				|-base/orderer-base.yaml
				|-base/peer-base.yaml

		docker-compose-peer.yaml  peer容器配置文件
			|-base/docker-compose-base.yaml
				|-base/orderer-base.yaml
				|-base/peer-base.yaml

		docker-zk.yaml   zookeeper容器配置文件
			|-base/kafka-base.yaml

		docker-kafka.yaml kafka容器配置文件
			|-base/kafka-base.yaml

		docker-compose-ca.yaml ca配置文件
			主要配置了ca的根证书(记得修改为实际的,否则ca会挂),ca服务器的管理员账户和密码也就是所谓的admin/adminpw,生产的时候改成自己知道的就好

		base/docker-compose-base.yaml  基础配置文件
		base/orderer-base.yaml  基础配置文件
		base/peer-base.yaml  基础配置文件

3、帮助脚本类文件
	此类文件就是IBM写的一些帮助脚本,脚本中包含了证书生成命令、创世区块生成命令、通道创建命令、peer加入通道命令、链码安装、实例化、调用等等脚本;这些命令都是可以单独拆分运行的,所以非常建议细读这些脚本命令!!
	download-dockerimages.sh 这个脚本是拉取docker fabric相关镜像的用的,只是在最初部署的时候会用,这里没有用到;
	generateArtifacts-3o4p.sh 这脚本是创建证书和通道创始区块用的,可携带一个通道名称参数:
	./generateArtifacts-3o4p.sh yourchannel 其中yourchannel是通道名称;
		|- cryptogen  generate --config=./crypto-config-3o4p.yaml 创建证书命令
		|- configtxgen -profile TwoOrgsOrdererGenesis2 -outputBlock ./channel-artifacts/genesis.block 创建创世区块
		|- configtxgen -profile TwoOrgsChannel2 -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID yourchannel 创建创世区块
		|- configtxgen -profile TwoOrgsChannel2 -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP 创建创世区块
		|- configtxgen -profile TwoOrgsChannel2 -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP 创建创世区块
	
	脚本运行后会生成根证书、msp证书、orderer证书、peer证书、tls证书等等和区块相关文件,即:channel-artifacts和crypto-config文件夹内容,可放在任何一个节点运行,生成后按照需要分发到不同的节点;

	/centos-113/e2e_cli/scripts/script.sh  通道创建命令、peer加入通道命令、链码安装、实例化、调用等等脚本,这个就是具体实践了;基本算是命令的集合,每个命令执行前都要先设置环境变量;看下函数:
		|- createChannel 创建通道
		|- joinChannel 加入通道
		|- updateAnchorPeers 0 更新锚点
		|- installChaincode 2 安装链码
		|- instantiateChaincode 2 实例化链码
		|- chaincodeQuery 0 100 链码查询
		|- chaincodeInvoke 0 链码操作

	每个函数建议都去细看下,理解为主;


四、部署运行
1、先clone到本地,然后修改实际IP地址
	git clone https://github.com/skylinelxw/chain-project.git
   主要修改docker配置文件中的IP地址信息,其他暂且可以不变。

2、根据自己的需要重新生成证书(可选)
   案例中创建的通道名称是 sunshine,如果重新生成,则需要将生成的证书替换现有的证书;

3、分发文件
   将各个机器的配置文件分发到各个机器上,机器也需要安装一样的环境;

4、按顺序启动 (主要节点部署情况)
   a. zookeeper是一个集群插件,所以可以单独先启动;
	docker-compose -f docker-zk.yaml up -d  其中-d是后台运行的意思,如果要看日志可以加--verbose 参数
	检查:docker ps 每台机器可查看到一个docker的容器:z1
	实在不放心可进入容器看zk状态:
		docker exec -it z1 bash
		./bin/zkServer.sh status
			ZooKeeper JMX enabled by default
			Using config: /conf/zoo.cfg
			Mode: follower
		
   b. kafka 启动依赖于zk集群;
	docker-compose -f docker-kafka.yaml up -d
	分别在每台机器上启动

   c. orderer 排序服务启动
	docker-compose -f docker-compose-orderer.yaml up -d
	分别在每台机器上启动,可以使用:
	docker logs orderer1.lychee.com 查看日志 

   d. peer 组织节点启动
	docker-compose -f docker-compose-peer.yaml up -d
	分别在每台机器上启动

   e. ca服务器节点启动
	docker-compose -f docker-compose-ca.yaml up -d
	分别在需要的机器上启动

5、运行测试脚本
   测试脚本的修改目前只修改了org1的peer0节点的脚步,即centos-113上的scripts中的文件;
   进入centos-113节点:
	docker exec -it lycheecli bash 进入lycheecli客户端容器
	./scripts/script.sh sunshine 运行测试脚本;
   出现============ All GOOD, End-2-End execution completed ============ 就大功告成;
 
五、可能遇到的问题
1、当需要更换证书或通道时,需要stop且rm掉容器,zookeeper可以不动,如果重复使用一个通道名,则需要连同kafka一起干掉;
	docker stop orderer2.lychee.com peer0.org1.lychee.com k1
	docker rm orderer2.lychee.com peer0.org1.lychee.com k1

2、重复使用同一个通道名称可能造成kafka识别问题,需要连同kafka一起干掉重建

3、注意看运行的日志,如果创建通道就有问题,则可能是hosts配置错误或证书配置问题,干掉重来;

4、如果日志已经创建成功,则看运行到哪一部,解决问题后,手动修改script.sh文件,注释掉已运行成功的函数;

5、如果要修改lychee.com 域,则需要修改证书生成配置文件和各个节点的文件夹映射关系,这个地方需要细心!!

6、运行过程中,尝试看对应节点的日志
	docker logs peerx.orgx.lychee.com

7、铲掉重来,无法报错问题
	因为最新的配置增加了数据持久化,所以需要每次

8、 BAD_REQUEST -- error authorizing update: error validating DeltaSet: invalid mod_policy for element [Policy] /Channel/Application/Writers: mod_policy not set
	铲掉重来可以解决,非常有可能是第一次搭建没有删除干净
9、ca启动后一会就宕机的原因是docker.yaml中的文件名称配置问题

10、'' has invalid keys: capabilities

11、创世区块通道tx生成时,x509问题,这个是之前旧证书混淆导致,删除历史的即可

还有一些设计或问题详细描述见:
https://www.jianshu.com/p/baaa828577e6

持续整理中……

chain-project's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

chain-project's Issues

未知错误求答

image
yaml.zip

2019-03-06 09:23:21.416 UTC [orderer/common/server] Start -> INFO 0ad Beginning to serve requests
2019-03-06 09:23:21.416 UTC [orderer/consensus/kafka] setupProducerForChannel -> INFO 0ae [channel: testchainid] Setting up the producer for this channel...
2019-03-06 09:23:21.416 UTC [orderer/consensus/kafka] try -> DEBU 0af [channel: testchainid] Connecting to the Kafka cluster
2019-03-06 09:23:21.417 UTC [orderer/consensus/kafka/sarama] NewAsyncProducer -> DEBU 0b0 Initializing new client
2019-03-06 09:23:21.417 UTC [orderer/consensus/kafka/sarama] NewClient -> DEBU 0b1 ClientID is the default of 'sarama', you should consider setting it to something application-specific.
2019-03-06 09:23:21.417 UTC [orderer/consensus/kafka/sarama] Open -> DEBU 0b2 ClientID is the default of 'sarama', you should consider setting it to something application-specific.
2019-03-06 09:23:21.417 UTC [orderer/consensus/kafka/sarama] RefreshMetadata -> DEBU 0b3 client/metadata fetching metadata for all topics from broker k1:9092
2019-03-06 09:23:21.436 UTC [orderer/consensus/kafka/sarama] withRecover -> DEBU 0b4 Connected to broker at k1:9092 (unregistered)
2019-03-06 09:23:21.475 UTC [orderer/consensus/kafka/sarama] updateMetadata -> DEBU 0b5 client/brokers registered new broker #2 at k2:9092
2019-03-06 09:23:21.475 UTC [orderer/consensus/kafka/sarama] updateMetadata -> DEBU 0b6 client/brokers registered new broker #1 at k1:9092
2019-03-06 09:23:21.475 UTC [orderer/consensus/kafka/sarama] NewAsyncProducer -> DEBU 0b7 Successfully initialized new client
2019-03-06 09:23:21.475 UTC [orderer/consensus/kafka] try -> DEBU 0b8 [channel: testchainid] Error is nil, breaking the retry loop
2019-03-06 09:23:21.475 UTC [orderer/consensus/kafka] startThread -> INFO 0b9 [channel: testchainid] Producer set up successfully
2019-03-06 09:23:21.475 UTC [orderer/consensus/kafka] sendConnectMessage -> INFO 0ba [channel: testchainid] About to post the CONNECT message...
2019-03-06 09:23:21.475 UTC [orderer/consensus/kafka] try -> DEBU 0bb [channel: testchainid] Attempting to post the CONNECT message...
2019-03-06 09:23:21.476 UTC [orderer/consensus/kafka/sarama] Open -> DEBU 0bc ClientID is the default of 'sarama', you should consider setting it to something application-specific.
2019-03-06 09:23:21.476 UTC [orderer/consensus/kafka/sarama] run)-fm -> DEBU 0bd producer/broker/2 starting up
2019-03-06 09:23:21.476 UTC [orderer/consensus/kafka/sarama] run)-fm -> DEBU 0be producer/broker/2 state change to [open] on testchainid/0
fatal error: unexpected signal during runtime execution

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.