fabric instance从kafka到raft的迁移

2020-06-02  本文已影响0人  CodingCode

迁移kafka instance到raft instance

参考官方文档:Migrating from Kafka to Raft

  1. 进入maintain模式

对所有的channel包括系统channel(testchainid)和用户channel,修改ConcesusType.value.state值。

for each channel do
   .channel_group.groups.Orderer.values.ConsensusType.value.state = "STATE_MAINTENANCE"
done

当一个channel进入maintain模式后,orderer就会拒绝接受新的invoke请求。

  1. 修改kafka到raft

对所有的channel包括系统channel(testchainid)和用户channel,修改ConcesusType.value值。
是要把整个ConcesusType.value修改掉,注意前面一步只是修改了其中的state域。

先看下kafka模式下整个ConcesusType的值是什么:

"ConsensusType": {
    ...
    "value": {
        "metadata": null,
        "state": "STATE_MAINTENANCE",
        "type": "kafka"
    },
    ...
},

再看raft模式下ConcesusType的值是什么:

  "ConsensusType": {
    ...
    "value": {
      "metadata": {
        "consenters": [
          {
            "client_tls_cert": "<base64 order0 raft client certificate>",
            "host": "<orderer0 raft FQDN>",
            "port": <orderer0 raft port>,
            "server_tls_cert": "<base64 order0 raft server certificate>"
          },
          {
            "client_tls_cert": "<base64 order1 raft client certificate>",
            "host": "<orderer1 raft FQDN>",
            "port": <orderer1 raft port>,
            "server_tls_cert": "<base64 order1 raft server certificate>"
          },
          {
            "client_tls_cert": "<base64 order2 raft client certificate>",
            "host": "<orderer2 raft FQDN>",
            "port": <orderer2 raft port>,
            "server_tls_cert": "<base64 order2 raft server certificate>"
          }
        ],
        "options": {
          "election_tick": 10,
          "heartbeat_tick": 1,
          "max_inflight_blocks": 5,
          "snapshot_interval_size": 20971520,
          "tick_interval": "500ms"
        }
      },
      "state": "STATE_MAINTENANCE",
      "type": "etcdraft"
    },
    ...
  }

所以这一步就是要把这个ConsensusType.value修改掉;注意:

  1. state保持STATE_MAINTENANCE,这在第一步已经改了。
  2. type改成"etcdraft",原先是"kafka"
  3. metadata包含consenters和options两部分。

除了这个之前,还有一个地方也要替换掉,就raft ca certificate,因为虽然定义了raft certificate,总得有一个机制来验证这些raft证书的有效性吧,所以还有两个地方:

如果是系统channel testchainid,则还有第三处:

他们都是数组类型(已经存在数组里的根证书包括service根证书),只要把raft证书的ca证书base64编码后加入数组最后即可。

for each channel do
   .channel_group.groups.Orderer.values.ConsensusType.value = <raft-value>
   .channel_group.groups.Orderer.groups.<mspid>.values.MSP.value.config.tls_root_certs = append(...)
   .channel_group.groups.Application.groups.<mspid>.values.MSP.value.config.tls_root_certs = append(...)
   if channel == testchainid then
     .channel_group.groups.Consortiums.groups.SampleConsortium.groups.{mspid}.values.MSP.value.config.tls_root_certs = append(...)
   fi
done
  1. 停止orderer

把所有的orderer停掉

  1. 停止kafka/zk
  1. 重启orderer

重启orderer之后,可以查看orderer的日志,看到选出新的leader节点。

  1. 退出maintain模式

这是第一步的逆步骤,即把state改回normal;具体操作参照步骤1。

for each channel do
   .channel_group.groups.Orderer.values.ConsensusType.value.state = "STATE_NORMAL"
done
上一篇 下一篇

猜你喜欢

热点阅读