zoukankan      html  css  js  c++  java
  • Fabric1.4 kafka共识的多orderer集群

    1.排序节点介绍

    本节内容基于前几节介绍的hellowrold区块链环境基础,实现基于kafka模式的排序节点部署和测试。

    Fabric 的共识模型是Execute-Order-Validate,即先执行再排序最后验证的过程。
    在创建区块链创世块以及通道的时候我们会用到一个configtx.yaml文件,该配置文件中的Orderer配置信息中有一个OrdererType参数,
    该参数可配置为”solo” and “kafka”,之前例子我们使用的配置皆是solo,即单节点共识。

    使用kafka集群作为orderer共识的技术方式可以为排序服务提供足够的容错空间,当客户端向peer节点提交Transaction的时候,
    peer节点会得到一个读写集结果,该结果会发送给orderer节点进行共识和排序,此时如果orderer节点突然down掉,
    将导致请求服务失效、数据丢失等问题。

    因此,在生产环境部署Fabric,往往需要采用具有容错能力的orderer,即kafka模式,使用kafka模式搭建orderer节点集群需要会依赖于kafka和zookeeper。

    1.1.排序执行过程

    一个交易的生命周期包括下面几个步骤:

    • client先向peer提交一个题案进行备案;
    • peer执行智能合约,调用数据执行操作,peer将操作结果发送给orderer;
    • orderer将收到的所有的题案排序,打包成区块,并发送给Peer;
    • Peer打开每个区块,并进行验证,若验证通过,则写入本地账本,更新世界状态。向client发送event告知交易被提交到账本中。

    1.2.Atomic Broadcast(Total Order):

    客户端提交交易信息 –> orderers:将交易排序并打包成块 –> 各个账本写入全局有序的区块

    1.2.1 全局排序要求:

    • 全局唯一、容错(cft、bft)
    • 网络分区(分区出去的节点的限制)
    • 强一致性
    • bft(fabric v1.4 的orderer是cft,并不代表fabric是cft)

    1.2.2 Block Cutting(打包规则):

    BatchSize:批次大小

    MaxMessageCount:最大消息数量
    AbsoluteMaxBytes :限制单个交易大小,超过该限制,会被拒绝掉
    PreferredMaxBytes :综合可能超过PreferredMaxBytes,假设PreferredMaxBytes=200b,前9个交易大小为100b,第10个交易大小为200b,这时会把第10个交易一块打包,这样就会大于PreferredMaxBytes。

    BatchTimeout

    Timeout 按照时间规则打包

    2.部署基于kafka的排序节点

    我们将部署三个Oraderer节点,
    基于前几节的helloworld案例按以下步骤重新修改配置文件,重新部署区块链网络。

    步骤1. 修改crypto-config.yaml,添加OrdererOrgs 的Specs

    Specs:
      - Hostname: orderer
      - Hostname: orderer2
      - Hostname: orderer3 

    crypto-config.yaml完整配置文件如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    # Copyright IBM Corp. All Rights Reserved.
    #
    # SPDX-License-Identifier: Apache-2.0
    #

    # ---------------------------------------------------------------------------
    # "OrdererOrgs" - Definition of organizations managing orderer nodes
    # ---------------------------------------------------------------------------
    OrdererOrgs:
    # ---------------------------------------------------------------------------
    # Orderer
    # ---------------------------------------------------------------------------
    - Name: Orderer
    Domain: example.com
    EnableNodeOUs: true
    # ---------------------------------------------------------------------------
    # "Specs" - See PeerOrgs below for complete description
    # ---------------------------------------------------------------------------
    Specs:
    - Hostname: orderer
    - Hostname: orderer2
    - Hostname: orderer3

    # ---------------------------------------------------------------------------
    # "PeerOrgs" - Definition of organizations managing peer nodes
    # ---------------------------------------------------------------------------
    PeerOrgs:
    # ---------------------------------------------------------------------------
    # Org1
    # ---------------------------------------------------------------------------
    - Name: Org1
    Domain: org1.example.com
    EnableNodeOUs: true
    Specs:
    - Hostname: peer0
    - Hostname: peer1
    - Hostname: peer2
    - Hostname: peer3
    - Hostname: peer4
    # ---------------------------------------------------------------------------
    # "Specs"
    # ---------------------------------------------------------------------------
    # Uncomment this section to enable the explicit definition of hosts in your
    # configuration. Most users will want to use Template, below
    #
    # Specs is an array of Spec entries. Each Spec entry consists of two fields:
    # - Hostname: (Required) The desired hostname, sans the domain.
    # - CommonName: (Optional) Specifies the template or explicit override for
    # the CN. By default, this is the template:
    #
    # "{{.Hostname}}.{{.Domain}}"
    #
    # which obtains its values from the Spec.Hostname and
    # Org.Domain, respectively.
    # ---------------------------------------------------------------------------
    # Specs:
    # - Hostname: foo # implicitly "foo.org1.example.com"
    # CommonName: foo27.org5.example.com # overrides Hostname-based FQDN set above
    # - Hostname: bar
    # - Hostname: baz
    # ---------------------------------------------------------------------------
    # "Template"
    # ---------------------------------------------------------------------------
    # Allows for the definition of 1 or more hosts that are created sequentially
    # from a template. By default, this looks like "peer%d" from 0 to Count-1.
    # You may override the number of nodes (Count), the starting index (Start)
    # or the template used to construct the name (Hostname).
    #
    # Note: Template and Specs are not mutually exclusive. You may define both
    # sections and the aggregate nodes will be created for you. Take care with
    # name collisions
    # ---------------------------------------------------------------------------
    Template:
    Count: 3
    # Start: 5
    # Hostname: {{.Prefix}}{{.Index}} # default
    # ---------------------------------------------------------------------------
    # "Users"
    # ---------------------------------------------------------------------------
    # Count: The number of user accounts _in addition_ to Admin
    # ---------------------------------------------------------------------------
    Users:
    Count: 1
    # ---------------------------------------------------------------------------
    # Org2: See "Org1" for full specification
    # ---------------------------------------------------------------------------
    - Name: Org2
    Domain: org2.example.com
    EnableNodeOUs: true
    Specs:
    - Hostname: peer0
    - Hostname: peer1
    - Hostname: peer2
    - Hostname: peer3
    - Hostname: peer4
    Template:
    Count: 3
    Users:
    Count: 1

    步骤2. 执行生成证书文件

    cryptogen generate --config=./crypto-config.yaml

    执行后可见crypto-config/orderOrganizations/example.com/orderers目录下出现了三个组织的证书:

    orderer.example.com
    orderer2.example.com
    orderer3.example.com

    步骤3. 修改configtx.yaml配置文件

    将OrdererType设置为kafka 并配置打包规则和kafka地址

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    Orderer: &OrdererDefaults

    # Orderer Type: The orderer implementation to start
    # Available types are "solo" and "kafka"
    OrdererType: kafka

    Addresses:
    - orderer.example.com:7050
    - orderer2.example.com:7050
    - orderer3.example.com:7050
    # Batch Timeout: The amount of time to wait before creating a batch
    BatchTimeout: 2s

    # Batch Size: Controls the number of messages batched into a block
    BatchSize:

    # Max Message Count: The maximum number of messages to permit in a batch
    MaxMessageCount: 10

    # Absolute Max Bytes: The absolute maximum number of bytes allowed for
    # the serialized messages in a batch.
    AbsoluteMaxBytes: 99 MB

    # Preferred Max Bytes: The preferred maximum number of bytes allowed for
    # the serialized messages in a batch. A message larger than the preferred
    # max bytes will result in a batch larger than preferred max bytes.
    PreferredMaxBytes: 512 KB

    Kafka:
    # Brokers: A list of Kafka brokers to which the orderer connects
    # NOTE: Use IP:port notation
    Brokers:
    - kafka1:9092
    - kafka2:9092
    - kafka3:9092
    # Organizations is the list of orgs which are defined as participants on
    # the orderer side of the network
    Organizations:

    完整的configtx.yaml配置文件如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    # Copyright IBM Corp. All Rights Reserved.
    #
    # SPDX-License-Identifier: Apache-2.0
    #

    ---
    ################################################################################
    #
    # Section: Organizations
    #
    # - This section defines the different organizational identities which will
    # be referenced later in the configuration.
    #
    ################################################################################
    Organizations:

    # SampleOrg defines an MSP using the sampleconfig. It should never be used
    # in production but may be used as a template for other definitions
    - &OrdererOrg
    # DefaultOrg defines the organization which is used in the sampleconfig
    # of the fabric.git development environment
    Name: OrdererOrg

    # ID to load the MSP definition as
    ID: OrdererMSP

    # MSPDir is the filesystem path which contains the MSP configuration
    MSPDir: crypto-config/ordererOrganizations/example.com/msp

    # Policies defines the set of policies at this level of the config tree
    # For organization policies, their canonical path is usually
    # /Channel/<Application|Orderer>/<OrgName>/<PolicyName>
    Policies:
    Readers:
    Type: Signature
    Rule: "OR('OrdererMSP.member')"
    Writers:
    Type: Signature
    Rule: "OR('OrdererMSP.member')"
    Admins:
    Type: Signature
    Rule: "OR('OrdererMSP.admin')"

    - &Org1
    # DefaultOrg defines the organization which is used in the sampleconfig
    # of the fabric.git development environment
    Name: Org1MSP

    # ID to load the MSP definition as
    ID: Org1MSP

    MSPDir: crypto-config/peerOrganizations/org1.example.com/msp

    # Policies defines the set of policies at this level of the config tree
    # For organization policies, their canonical path is usually
    # /Channel/<Application|Orderer>/<OrgName>/<PolicyName>
    Policies:
    Readers:
    Type: Signature
    Rule: "OR('Org1MSP.admin', 'Org1MSP.peer', 'Org1MSP.client')"
    Writers:
    Type: Signature
    Rule: "OR('Org1MSP.admin', 'Org1MSP.client')"
    Admins:
    Type: Signature
    Rule: "OR('Org1MSP.admin')"

    # leave this flag set to true.
    AnchorPeers:
    # AnchorPeers defines the location of peers which can be used
    # for cross org gossip communication. Note, this value is only
    # encoded in the genesis block in the Application section context
    - Host: peer0.org1.example.com
    Port: 7051

    - &Org2
    # DefaultOrg defines the organization which is used in the sampleconfig
    # of the fabric.git development environment
    Name: Org2MSP

    # ID to load the MSP definition as
    ID: Org2MSP

    MSPDir: crypto-config/peerOrganizations/org2.example.com/msp

    # Policies defines the set of policies at this level of the config tree
    # For organization policies, their canonical path is usually
    # /Channel/<Application|Orderer>/<OrgName>/<PolicyName>
    Policies:
    Readers:
    Type: Signature
    Rule: "OR('Org2MSP.admin', 'Org2MSP.peer', 'Org2MSP.client')"
    Writers:
    Type: Signature
    Rule: "OR('Org2MSP.admin', 'Org2MSP.client')"
    Admins:
    Type: Signature
    Rule: "OR('Org2MSP.admin')"

    AnchorPeers:
    # AnchorPeers defines the location of peers which can be used
    # for cross org gossip communication. Note, this value is only
    # encoded in the genesis block in the Application section context
    - Host: peer0.org2.example.com
    Port: 9051


    - &Org3
    # DefaultOrg defines the organization which is used in the sampleconfig
    # of the fabric.git development environment
    Name: Org3MSP

    # ID to load the MSP definition as
    ID: Org3MSP

    MSPDir: crypto-config/peerOrganizations/org3.example.com/msp

    # Policies defines the set of policies at this level of the config tree
    # For organization policies, their canonical path is usually
    # /Channel/<Application|Orderer>/<OrgName>/<PolicyName>
    Policies:
    Readers:
    Type: Signature
    Rule: "OR('Org3MSP.admin', 'Org3MSP.peer', 'Org3MSP.client')"
    Writers:
    Type: Signature
    Rule: "OR('Org3MSP.admin', 'Org2MSP.client')"
    Admins:
    Type: Signature
    Rule: "OR('Org3MSP.admin')"

    AnchorPeers:
    # AnchorPeers defines the location of peers which can be used
    # for cross org gossip communication. Note, this value is only
    # encoded in the genesis block in the Application section context
    - Host: peer0.org3.example.com
    Port: 13051
    ################################################################################
    #
    # SECTION: Capabilities
    #
    # - This section defines the capabilities of fabric network. This is a new
    # concept as of v1.1.0 and should not be utilized in mixed networks with
    # v1.0.x peers and orderers. Capabilities define features which must be
    # present in a fabric binary for that binary to safely participate in the
    # fabric network. For instance, if a new MSP type is added, newer binaries
    # might recognize and validate the signatures from this type, while older
    # binaries without this support would be unable to validate those
    # transactions. This could lead to different versions of the fabric binaries
    # having different world states. Instead, defining a capability for a channel
    # informs those binaries without this capability that they must cease
    # processing transactions until they have been upgraded. For v1.0.x if any
    # capabilities are defined (including a map with all capabilities turned off)
    # then the v1.0.x peer will deliberately crash.
    #
    ################################################################################
    Capabilities:
    # Channel capabilities apply to both the orderers and the peers and must be
    # supported by both.
    # Set the value of the capability to true to require it.
    Channel: &ChannelCapabilities
    # V1.4.3 for Channel is a catchall flag for behavior which has been
    # determined to be desired for all orderers and peers running at the v1.4.3
    # level, but which would be incompatible with orderers and peers from
    # prior releases.
    # Prior to enabling V1.4.3 channel capabilities, ensure that all
    # orderers and peers on a channel are at v1.4.3 or later.
    V1_4_3: true
    # V1.3 for Channel enables the new non-backwards compatible
    # features and fixes of fabric v1.3
    V1_3: false
    # V1.1 for Channel enables the new non-backwards compatible
    # features and fixes of fabric v1.1
    V1_1: false

    # Orderer capabilities apply only to the orderers, and may be safely
    # used with prior release peers.
    # Set the value of the capability to true to require it.
    Orderer: &OrdererCapabilities
    # V1.4.2 for Orderer is a catchall flag for behavior which has been
    # determined to be desired for all orderers running at the v1.4.2
    # level, but which would be incompatible with orderers from prior releases.
    # Prior to enabling V1.4.2 orderer capabilities, ensure that all
    # orderers on a channel are at v1.4.2 or later.
    V1_4_2: true
    # V1.1 for Orderer enables the new non-backwards compatible
    # features and fixes of fabric v1.1
    V1_1: false

    # Application capabilities apply only to the peer network, and may be safely
    # used with prior release orderers.
    # Set the value of the capability to true to require it.
    Application: &ApplicationCapabilities
    # V1.4.2 for Application enables the new non-backwards compatible
    # features and fixes of fabric v1.4.2.
    V1_4_2: true
    # V1.3 for Application enables the new non-backwards compatible
    # features and fixes of fabric v1.3.
    V1_3: false
    # V1.2 for Application enables the new non-backwards compatible
    # features and fixes of fabric v1.2 (note, this need not be set if
    # later version capabilities are set)
    V1_2: false
    # V1.1 for Application enables the new non-backwards compatible
    # features and fixes of fabric v1.1 (note, this need not be set if
    # later version capabilities are set).
    V1_1: false

    ################################################################################
    #
    # SECTION: Application
    #
    # - This section defines the values to encode into a config transaction or
    # genesis block for application related parameters
    #
    ################################################################################
    Application: &ApplicationDefaults

    # Organizations is the list of orgs which are defined as participants on
    # the application side of the network
    Organizations:

    # Policies defines the set of policies at this level of the config tree
    # For Application policies, their canonical path is
    # /Channel/Application/<PolicyName>
    Policies:
    Readers:
    Type: ImplicitMeta
    Rule: "ANY Readers"
    Writers:
    Type: ImplicitMeta
    Rule: "ANY Writers"
    Admins:
    Type: ImplicitMeta
    Rule: "MAJORITY Admins"

    Capabilities:
    <<: *ApplicationCapabilities
    ################################################################################
    #
    # SECTION: Orderer
    #
    # - This section defines the values to encode into a config transaction or
    # genesis block for orderer related parameters
    #
    ################################################################################
    Orderer: &OrdererDefaults

    # Orderer Type: The orderer implementation to start
    # Available types are "solo" and "kafka"
    OrdererType: kafka

    Addresses:
    - orderer.example.com:7050
    - orderer2.example.com:7050
    - orderer3.example.com:7050
    # Batch Timeout: The amount of time to wait before creating a batch
    BatchTimeout: 2s

    # Batch Size: Controls the number of messages batched into a block
    BatchSize:

    # Max Message Count: The maximum number of messages to permit in a batch
    MaxMessageCount: 10

    # Absolute Max Bytes: The absolute maximum number of bytes allowed for
    # the serialized messages in a batch.
    AbsoluteMaxBytes: 99 MB

    # Preferred Max Bytes: The preferred maximum number of bytes allowed for
    # the serialized messages in a batch. A message larger than the preferred
    # max bytes will result in a batch larger than preferred max bytes.
    PreferredMaxBytes: 512 KB

    Kafka:
    # Brokers: A list of Kafka brokers to which the orderer connects
    # NOTE: Use IP:port notation
    Brokers:
    - kafka1:9092
    - kafka2:9092
    - kafka3:9092
    # Organizations is the list of orgs which are defined as participants on
    # the orderer side of the network
    Organizations:

    # Policies defines the set of policies at this level of the config tree
    # For Orderer policies, their canonical path is
    # /Channel/Orderer/<PolicyName>
    Policies:
    Readers:
    Type: ImplicitMeta
    Rule: "ANY Readers"
    Writers:
    Type: ImplicitMeta
    Rule: "ANY Writers"
    Admins:
    Type: ImplicitMeta
    Rule: "MAJORITY Admins"
    # BlockValidation specifies what signatures must be included in the block
    # from the orderer for the peer to validate it.
    BlockValidation:
    Type: ImplicitMeta
    Rule: "ANY Writers"

    ################################################################################
    #
    # CHANNEL
    #
    # This section defines the values to encode into a config transaction or
    # genesis block for channel related parameters.
    #
    ################################################################################
    Channel: &ChannelDefaults
    # Policies defines the set of policies at this level of the config tree
    # For Channel policies, their canonical path is
    # /Channel/<PolicyName>
    Policies:
    # Who may invoke the 'Deliver' API
    Readers:
    Type: ImplicitMeta
    Rule: "ANY Readers"
    # Who may invoke the 'Broadcast' API
    Writers:
    Type: ImplicitMeta
    Rule: "ANY Writers"
    # By default, who may modify elements at this config level
    Admins:
    Type: ImplicitMeta
    Rule: "MAJORITY Admins"

    # Capabilities describes the channel level capabilities, see the
    # dedicated Capabilities section elsewhere in this file for a full
    # description
    Capabilities:
    <<: *ChannelCapabilities

    ################################################################################
    #
    # Profile
    #
    # - Different configuration profiles may be encoded here to be specified
    # as parameters to the configtxgen tool
    #
    ################################################################################
    Profiles:

    TwoOrgsOrdererGenesis:
    <<: *ChannelDefaults
    Orderer:
    <<: *OrdererDefaults
    Organizations:
    - *OrdererOrg
    Capabilities:
    <<: *OrdererCapabilities
    Consortiums:
    SampleConsortium:
    Organizations:
    - *Org1
    - *Org2
    - *Org3
    TwoOrgsChannel:
    Consortium: SampleConsortium
    <<: *ChannelDefaults
    Application:
    <<: *ApplicationDefaults
    Organizations:
    - *Org1
    - *Org2
    - *Org3
    Capabilities:
    <<: *ApplicationCapabilities

    SampleDevModeKafka:
    <<: *ChannelDefaults
    Capabilities:
    <<: *ChannelCapabilities
    Orderer:
    <<: *OrdererDefaults
    OrdererType: kafka
    Kafka:
    Brokers:
    - kafka.example.com:9092

    Organizations:
    - *OrdererOrg
    Capabilities:
    <<: *OrdererCapabilities
    Application:
    <<: *ApplicationDefaults
    Organizations:
    - <<: *OrdererOrg
    Consortiums:
    SampleConsortium:
    Organizations:
    - *Org1
    - *Org2
    - *Org3

    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
    - *Org3

    步骤4. 生成创世块和通道

    1
    2
    3
    4
    # 生成创世区块  首先要确保channel-artifacts文件夹存在,如果不存在需要手动创建,不然会报错
    configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
    # 生成通道配置文件 其中通道名mychannel可以修改为自己的
    configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/mychannel.tx -channelID mychannel

    步骤5.配置docker-compose文件

    docker-compose-orderer.yaml 配置文件包含3个zookeeper服务、3个kafka服务以3个orderer节点配置。

    内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267

    # Copyright IBM Corp. All Rights Reserved.
    #
    # SPDX-License-Identifier: Apache-2.0
    #

    version: '2'

    networks:
    hello:

    services:

    zookeeper1:
    container_name: zookeeper1
    hostname: zookeeper1
    image: hyperledger/fabric-zookeeper
    restart: always
    environment:
    - quorumListenOnAllIPs=true
    - ZOO_MY_ID=1
    - ZOO_SERVERS=server.1=zookeeper1:2888:3888 server.2=zookeeper2:2888:3888 server.3=zookeeper3:2888:3888

    ports:
    - 12181:2181
    - 12888:2888
    - 13888:3888
    networks:
    - hello
    zookeeper2:
    container_name: zookeeper2
    hostname: zookeeper2
    image: hyperledger/fabric-zookeeper
    restart: always
    environment:
    - quorumListenOnAllIPs=true
    - ZOO_MY_ID=2
    - ZOO_SERVERS=server.1=zookeeper1:2888:3888 server.2=zookeeper2:2888:3888 server.3=zookeeper3:2888:3888

    ports:
    - 22181:2181
    - 22888:2888
    - 23888:3888
    networks:
    - hello
    zookeeper3:
    container_name: zookeeper3
    hostname: zookeeper3
    image: hyperledger/fabric-zookeeper
    restart: always
    environment:
    - quorumListenOnAllIPs=true
    - ZOO_MY_ID=3
    - ZOO_SERVERS=server.1=zookeeper1:2888:3888 server.2=zookeeper2:2888:3888 server.3=zookeeper3:2888:3888

    ports:
    - 32181:2181
    - 32888:2888
    - 33888:3888
    networks:
    - hello
    kafka1:
    container_name: kafka1
    image: hyperledger/fabric-kafka
    restart: always
    environment:
    - KAFKA_MESSAGE_MAX_BYTES=103809024 # 99 * 1024 * 1024 B
    - KAFKA_REPLICA_FETCH_MAX_BYTES=103809024 # 99 * 1024 * 1024 B
    - KAFKA_UNCLEAN_LEADER_ELECTION_ENABLE=false
    - KAFKA_BROKER_ID=1
    - KAFKA_MIN_INSYNC_REPLICAS=2
    - KAFKA_DEFAULT_REPLICATION_FACTOR=3
    - KAFKA_ZOOKEEPER_CONNECT=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181
    ports:
    - 19092:9092
    networks:
    - hello
    depends_on:
    - zookeeper1
    - zookeeper2
    - zookeeper3
    kafka2:
    container_name: kafka2
    image: hyperledger/fabric-kafka
    restart: always
    environment:
    - KAFKA_MESSAGE_MAX_BYTES=103809024 # 99 * 1024 * 1024 B
    - KAFKA_REPLICA_FETCH_MAX_BYTES=103809024 # 99 * 1024 * 1024 B
    - KAFKA_UNCLEAN_LEADER_ELECTION_ENABLE=false
    - KAFKA_BROKER_ID=2
    - KAFKA_MIN_INSYNC_REPLICAS=2
    - KAFKA_DEFAULT_REPLICATION_FACTOR=3
    - KAFKA_ZOOKEEPER_CONNECT=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181
    ports:
    - 29092:9092
    networks:
    - hello
    depends_on:
    - zookeeper1
    - zookeeper2
    - zookeeper3
    kafka3:
    container_name: kafka3
    image: hyperledger/fabric-kafka
    restart: always
    environment:
    - KAFKA_MESSAGE_MAX_BYTES=103809024 # 99 * 1024 * 1024 B
    - KAFKA_REPLICA_FETCH_MAX_BYTES=103809024 # 99 * 1024 * 1024 B
    - KAFKA_UNCLEAN_LEADER_ELECTION_ENABLE=false
    - KAFKA_BROKER_ID=3
    - KAFKA_MIN_INSYNC_REPLICAS=2
    - KAFKA_DEFAULT_REPLICATION_FACTOR=3
    - KAFKA_ZOOKEEPER_CONNECT=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181
    ports:
    - 39092:9092
    networks:
    - hello
    depends_on:
    - zookeeper1
    - zookeeper2
    - zookeeper3

    orderer.example.com:
    container_name: orderer.example.com
    image: hyperledger/fabric-orderer
    environment:
    - ORDERER_GENERAL_LOGLEVEL=debug
    - 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]
    #关于kafka的相关配置
    - ORDERER_KAFKA_RETRY_LONGINTERVAL=10s
    - ORDERER_KAFKA_RETRY_LONGTOTAL=100s
    - ORDERER_KAFKA_RETRY_SHORTINTERVAL=1s
    - ORDERER_KAFKA_RETRY_SHORTTOTAL=30s
    - ORDERER_KAFKA_VERBOSE=true
    - ORDERER_KAFKA_BROKERS=[kafka1:9092,kafka2:9092,kafka3:9092]

    working_dir: /opt/gopath/src/github.com/hyperledger/fabric
    command: orderer
    volumes:
    - ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
    - ./crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp
    - ./crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/:/var/hyperledger/orderer/tls
    ports:
    - 7050:7050
    networks:
    - hello
    depends_on:
    - zookeeper1
    - zookeeper2
    - zookeeper3
    - kafka1
    - kafka2
    - kafka3


    orderer2.example.com:
    container_name: orderer2.example.com
    image: hyperledger/fabric-orderer
    environment:
    - ORDERER_GENERAL_LOGLEVEL=debug
    - 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]
    #关于kafka的相关配置
    - ORDERER_KAFKA_RETRY_LONGINTERVAL=10s
    - ORDERER_KAFKA_RETRY_LONGTOTAL=100s
    - ORDERER_KAFKA_RETRY_SHORTINTERVAL=1s
    - ORDERER_KAFKA_RETRY_SHORTTOTAL=30s
    - ORDERER_KAFKA_VERBOSE=true
    - ORDERER_KAFKA_BROKERS=[kafka1:9092,kafka2:9092,kafka3:9092]

    working_dir: /opt/gopath/src/github.com/hyperledger/fabric
    command: orderer
    volumes:
    - ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
    - ./crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com/msp:/var/hyperledger/orderer/msp
    - ./crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com/tls/:/var/hyperledger/orderer/tls
    ports:
    - 27050:7050
    networks:
    - hello
    depends_on:
    - zookeeper1
    - zookeeper2
    - zookeeper3
    - kafka1
    - kafka2
    - kafka3

    orderer3.example.com:
    container_name: orderer3.example.com
    image: hyperledger/fabric-orderer
    environment:
    - ORDERER_GENERAL_LOGLEVEL=debug
    - 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]
    #关于kafka的相关配置
    - ORDERER_KAFKA_RETRY_LONGINTERVAL=10s
    - ORDERER_KAFKA_RETRY_LONGTOTAL=100s
    - ORDERER_KAFKA_RETRY_SHORTINTERVAL=1s
    - ORDERER_KAFKA_RETRY_SHORTTOTAL=30s
    - ORDERER_KAFKA_VERBOSE=true
    - ORDERER_KAFKA_BROKERS=[kafka1:9092,kafka2:9092,kafka3:9092]

    working_dir: /opt/gopath/src/github.com/hyperledger/fabric
    command: orderer
    volumes:
    - ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
    - ./crypto-config/ordererOrganizations/example.com/orderers/orderer3.example.com/msp:/var/hyperledger/orderer/msp
    - ./crypto-config/ordererOrganizations/example.com/orderers/orderer3.example.com/tls/:/var/hyperledger/orderer/tls
    ports:
    - 37050:7050
    networks:
    - hello
    depends_on:
    - zookeeper1
    - zookeeper2
    - zookeeper3
    - kafka1
    - kafka2
    - kafka3


    ```

    ## 步骤6. 启动所有节点

    ```text

    COMPOSE_FILE_ORG1_PEER0="docker-compose-org1-peer0.yaml"
    COMPOSE_FILE_ORG1_PEER1="docker-compose-org1-peer1.yaml"
    COMPOSE_FILE_ORG1_PEER2="docker-compose-org1-peer2.yaml"
    COMPOSE_FILE_ORG2_PEER0="docker-compose-org2-peer0.yaml"
    COMPOSE_FILE_ORG2_PEER1="docker-compose-org2-peer1.yaml"
    COMPOSE_FILE_ORG3_PEER0="docker-compose-org3-peer0.yaml"
    COMPOSE_FILE_ORG3_PEER1="docker-compose-org3-peer1.yaml"

    COMPOSE_FILE_ORDERER="docker-compose-orderer.yaml"
    COMPOSE_FILE_CA="docker-compose-ca.yaml"

    docker-compose -f $COMPOSE_FILE_ORG1_PEER0 -f $COMPOSE_FILE_ORG1_PEER1 -f $COMPOSE_FILE_ORG1_PEER2 -f $COMPOSE_FILE_ORG2_PEER0 -f $COMPOSE_FILE_ORG2_PEER1 -f $COMPOSE_FILE_ORG3_PEER0 -f $COMPOSE_FILE_ORG3_PEER1 -f $COMPOSE_FILE_ORDERER up -d
    #启动CA节点,startCA.sh的内容可参考第七节
    ./startCA.sh

    至此分布式orderer已经部署完成。

    步骤7. 验证

    我们通过在第一个orderer节点创建通道,然后在第二个orderer节点实例化链码来测试分布式orderer是否可行。
    首先:进入一个fabric-tool 服务

    docker exec -it cli_peer0_org1 bash

    采用第一个orderer节点创建通道

    ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
    peer channel create -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/mychannel.tx --tls --cafile $ORDERER_CA

    加入通道

    peer channel join -b mychannel.block

    将CA切换到第二个orderer

    ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer2.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

    在第二个通道安装和实例化链码

    peer chaincode install -n mycc -p github.com/hyperledger/fabric/helloworld/chaincode/go/helloworld/ -v 1.0
    peer chaincode instantiate -o orderer2.example.com:7050 --tls --cafile $ORDERER_CA -C mychannel -n mycc -v 1.0 -c '{"Args":["a","hello"]}' -P "OR ('Org1MSP.peer','Org2MSP.peer','Org3MSP.peer')"

    这个环节如果执行成功就表示分布式orderer部署没有问题,否则会报找不到channel的错误。

    执行链码查询

    peer chaincode query -C mychannel -n mycc -c '{"function":"get","Args":["a"]}'
  • 相关阅读:
    如何把方法(函数)当参数传递
    致加西亚的信 摘录
    算法:C#数组去除重复元素算法研究
    [转帖]SQL SERVER 2005 安全设置
    [转].NET学习网站收集
    C#你真的懂了吗 啥叫引用2
    比IETEST更好用的浏览器兼容性测试软件[绿色]
    [转帖]使用asp.net访问Oracle的方法汇总
    影响力密码 信任你自己
    [转]自动刷新页面的实现方法总结
  • 原文地址:https://www.cnblogs.com/Soy-technology/p/12838011.html
Copyright © 2011-2022 走看看