در این مقاله مطالبی در زمینه تست رافت هایپرلجر فابریک را مطرح خواهیم کرد. Fabric 1.4.1 ، به جای کافکا و سولو، از اجماع جدیدی به نام Raft پشتیبانی می کند. این مقاله کوتاه برای “تست” Raft in Fabric’s Build-Your-First-Network است.
Table of contents [Show]
ما از Fabric’s Build-Your-First-Network استفاده می کنیم که شامل:
اول از همه، پیش نیازها را با دستورالعمل زیر آماده کنید :
https://hyperledger-fabric.readthedocs.io/en/release-1.4/prereqs.html
پس از برآورده شدن پیش نیازها، ترمینال خود را باز کنید، مکانی را که دوست دارید پیدا کنید، به عنوان مثال دسکتاپ.
سپس دستور زیر را تایپ کنید:
curl -sSL http://bit.ly/2ysbOFE | bash -s
این دستور برای دانلود تصاویر فابریک داکر و کشیدن یک دایرکتوری فابریک-نمونه هایی است که حاوی فایل های آموزشی است.
حالا دستورات زیر را یکی یکی دنبال کنید :
cd fabric-samples/first-network../bin/cryptogen generate --config=./crypto-config.yamlexport FABRIC_CFG_PATH=$PWD../bin/configtxgen -profile SampleMultiNodeEtcdRaft -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.blockexport CHANNEL_NAME=mychannel../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSPdocker-compose -f docker-compose-cli.yaml -f docker-compose-couch.yaml -f docker-compose-etcdraft2.yaml up -ddocker exec -it cli bashCORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp CORE_PEER_ADDRESS=peer0.org1.example.com:7051 CORE_PEER_LOCALMSPID="Org1MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crtexport CHANNEL_NAME=mychannelpeer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pempeer channel join -b mychannel.blockCORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp CORE_PEER_ADDRESS=peer0.org2.example.com:9051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt peer channel join -b mychannel.blockCORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp CORE_PEER_ADDRESS=peer0.org1.example.com:7051 CORE_PEER_LOCALMSPID="Org1MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crtpeer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org1MSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pemCORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp CORE_PEER_ADDRESS=peer0.org2.example.com:9051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org2MSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pempeer chaincode install -n mycc -v 1.0 -l java -p /opt/gopath/src/github.com/chaincode/chaincode_example02/java/peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -l java -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')"CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp CORE_PEER_ADDRESS=peer0.org1.example.com:7051 CORE_PEER_LOCALMSPID="Org1MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crtpeer chaincode install -n mycc -v 1.0 -l java -p /opt/gopath/src/github.com/chaincode/chaincode_example02/java/peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"Args":["invoke","a","b","10"]}'peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp CORE_PEER_ADDRESS=peer1.org2.example.com:10051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.crtpeer chaincode install -n mycc -v 1.0 -l java -p /opt/gopath/src/github.com/chaincode/chaincode_example02/java/peer channel join -b mychannel.blockCORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp CORE_PEER_ADDRESS=peer1.org1.example.com:8051 CORE_PEER_LOCALMSPID="Org1MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/ca.crtpeer chaincode install -n mycc -v 1.0 -l java -p /opt/gopath/src/github.com/chaincode/chaincode_example02/java/peer channel join -b mychannel.blockCORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp CORE_PEER_ADDRESS=peer0.org1.example.com:7051 CORE_PEER_LOCALMSPID="Org1MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
در واقع، اگر فکر می کنید دستورات زیادی برای تایپ در بالا وجود دارد، می توانید فقط یک دستور را تایپ کنید:
./byfn.sh up -o etcdraft -l java -s couchdb
توجه: اگر لیست طولانی دستورات را قبلاً تمام کرده اید، لطفاً دستور واحد را در اینجا تایپ نکنید.
پیشنهاد مطالعه: آموزش ساخت اولین شبکه Hyperledger Fabric
هنگامی که محیط راه اندازی شد، نگاهی می اندازیم که چه گره هایی در شبکه اجرا می شوند.
exitdocker ps -a
می بینیم که orderer.example.com، orderer2.example.com،… داریم ( ستون NAMES را بخوانید ، ببخشید که کمی کوچک است)
در مجموع، ما 5 سفارش دهنده داریم، بنابراین 5 گره در Raft داریم.
در صورت تمایل به آموزش برنامه نویسی بلاکچین پکیج آموزش برنامه نویسی بلاکچین را ملاحظه نمایید.
بعد یه لیدر Raft رو متوقف میکنم ببینم تو شبکه رافت چی میشه!
قبل از متوقف کردن، بیایید بفهمیم که لیدر فعلی Raft کدام دستور دهنده است.
docker logs orderer3.example.com
ممکن است مورد شما متفاوت باشد! اما روند بررسی یکسان است، گزارش های زیر را مشاهده شد:
[orderer.consensus.etcdraft] start -> INFO 03b Starting raft node as part of a new channel channel=mychannel node=3[...][orderer.consensus.etcdraft] serveRequest -> INFO 05d Raft leader changed: 0 -> 3 channel=mychannel node=3
اگر نمیتوانید گزارشهای مشابهی را مانند بالا ببینید، نگران نباشید، دستور «docker logs orderer3.example.com» را چند بار دیگر امتحان کنید یا فقط بعداً آن را امتحان کنید (مثلاً 10 تا 20 ثانیه بعد).
بنابراین، orderer3 گره Raft 3 است، و لیدر فعلی گره 3 است. یعنی orderer3، لیدر فعلی Raft در مورد من است !
حالا متوقفش کنیم:
docker stop orderer3.example.com
سپس، گزارش های مربوط به سفارش دهنده دیگر را مشاهده کنید:
docker logs orderer2.example.com
من مشاهده کردم:
[orderer.consensus.etcdraft] serveRequest -> INFO 05a Raft leader changed: 0 -> 1 channel=mychannel node=2
اکنون گره 1 (باید orderer.example.com باشد) رهبر جدید Raft است که به طور خودکار مجدداً انتخاب می شود.
اما برای اثبات اینکه شبکه همچنان به درستی کار می کند، اجازه دهید برخی از تراکنش ها را انجام دهیم:
docker exec -it cli bashexport CHANNEL_NAME=mychannelpeer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'// then you should get 90, or whatever number peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"Args":["invoke","a","b","10"]}'peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'// then you should get 80, // or a number different from the query // result above, thus the network is working!
یک لیدر را دوباره متوقف کنید تا ببینید چه خواهد شد. به یاد داشته باشید که رهبر فعلی ما گره 1 است، یعنی orderer.example.com.
exitdocker stop orderer.example.com// now observe logs from another ordererdocker logs orderer4.example.com[orderer.consensus.etcdraft] serveRequest -> INFO 087 Raft leader changed: 0 -> 4 channel=mychannel node=4
در مورد من در حال حاضر، لیدر جدید انتخاب شده نود 4 (باید orderer4.example.com) است.
پیشنهاد مطالعه: بهروزرسانی تنظیمات کانال در Hyperledger Fabric
docker stop orderer4.example.com// now observe logs from another ordererdocker logs orderer2.example.com
به نظر می رسد که این بار، هیچ لیدر جدیدی انتخاب نشده است (هیچ گزارش جدید انتخابات ظاهر می شود)، چرا؟
مشکل چیست؟ در رافت برای اینکه شبکه به درستی کار کند نیاز است اکثریت سفارش دهندگان نگه داشته شوند. در مورد ما 5 تا سفارش دهنده داریم و من 3 نفر از آنها را متوقف کرده ام، قانون اکثریت شکسته شده است!
اجازه دهید یک سفارش دهنده متوقف شده روشن شود، بنابراین قانون اکثریت را اصلاح کنید:
docker start orderer4.example.comdocker logs orderer4.example.com// you will observe log like this:[orderer.consensus.etcdraft] serveRequest -> INFO 0ab Raft leader changed: 0 -> 2 channel=mychannel node=4
پس از اجرای قانون اکثریت، روند انتخاب مجدد دوباره عادی می شود.
اکنون سعی می کنیم اطلاعات سفارش دهنده را حذف کنیم، سپس ببینیم آیا می توان داده ها را از سفارش دهنده موجود بازیابی کرد یا خیر
docker start orderer4.example.comdocker logs orderer4.example.com// you will observe log like this:[orderer.consensus.etcdraft] serveRequest -> INFO 0ab Raft leader changed: 0 -> 2 channel=mychannel node=4
نتیجه
در این مقاله کوتاه در Fabric’s Raft می بینیم که سفارش دهندگان می توانند:
با توجه به اینکه اکثریت سفارشدهندهها این کار را انجام میدهند، مجدداً رهبر را تحت خرابی گره رهبر انتخاب کنند.