fabric 1.4.4 kafka到raft的迁移

2020-04-29  本文已影响0人  CodingCode

fabric 1.4.4 kafka到raft的迁移

参考文档是:https://hlf.readthedocs.io/en/latest/kafka_raft_migration.html,fabric的这份官方文档已经写的很清楚了,就是没有罗列1,2,3,显得阅读起来不那么优美。

step 1: 停掉client

在迁移过程中,不接受客户端访问。停掉所有的peer,以及其他client应用。

step 2: 做备份

万一迁移失败可以回退。基于文件系统的备份,是把zookeeper/kafka/orderer的相关目录备份。

step 3: 切换状态到维护(STATE_MAINTENANCE)模式

从testchainid channel开始,把所有的channel都切换到维护模式:

$ jq '.channel_group.groups.Orderer.values.ConsensusType.value.state = "STATE_MAINTENANCE"' ...

参考https://hlf.readthedocs.io/en/latest/channel_update_tutorial.html,如何修改channel的配置信息。

step 4: 迁移kafka到raft

从testchainid channel开始,把所有的channel都升级到raft类型:

参考https://hlf.readthedocs.io/en/latest/channel_update_tutorial.html,如何修改channel的配置信息。

其实这一步和step 3一样,只不过修改的不同的字段而已。

step 5: 重启所有orderer节点

如果一切正常,我们可以看到orderer日志包括如下类似消息:

2020-04-28 21:11:33.520 UTC [orderer.consensus.etcdraft] serveRequest -> INFO 095 Raft leader changed: 0 -> 1 channel=<userchan1> node=2
2020-04-28 21:11:52.052 UTC [orderer.consensus.etcdraft] serveRequest -> INFO 0ba Raft leader changed: 0 -> 3 channel=<userchan2> node=2
2020-04-28 21:11:52.177 UTC [orderer.consensus.etcdraft] serveRequest -> INFO 0bd Raft leader changed: 0 -> 3 channel=testchainid node=2

step 6: 切换状态到正常(STATE_NORMAL)模式

参考step 3,一样的流程。

$ jq '.channel_group.groups.Orderer.values.ConsensusType.value.state = "STATE_NORMAL"' ...

step 7: 把client拉起

迁移完成,继续提供服务。

附录,kafka和raft修改的配置内容

kafka类型是这样的:

{                   
  "channel_group": {
    "groups": {   
      "Orderer": {
        "values": { 
          "ConsensusType": {
            "value": {
              "metadata": null,
              "state": "STATE_NORMAL",
              "type": "kafka"
            },
        ...
      ...
    ...
}

raft类型是这样的:

{                   
  "channel_group": {
    "groups": {   
      "Orderer": {
        "values": { 
          "ConsensusType": {
            "value": {
              "metadata": {
                "consenters": [
                  { 
                    "client_tls_cert": "<base64_TLS_ClientCert0>",
                    "host": "<rafthost0>",
                    "port": <raftport0>,
                    "server_tls_cert": "<base64_TLS_ServerCert0>"
                  },
                  {
                    "client_tls_cert": "<base64_TLS_ClientCert1>",
                    "host": "<rafthost1>",
                    "port": <raftport1>,
                    "server_tls_cert": "<base64_TLS_ServerCert1>"
                  },
                  {
                    "client_tls_cert": "<base64_TLS_ClientCert2>",
                    "host": "<rafthost2>",
                    "port": <raftport2>,
                    "server_tls_cert": "<base64_TLS_ServerCert2>"
                  }
                ],
                "options": {
                  "election_tick": 10,
                  "heartbeat_tick": 1,
                  "max_inflight_blocks": 5,
                  "snapshot_interval_size": 20971520,
                  "tick_interval": "500ms"
                }
              },
              "state": "STATE_NORMAL",
              "type": "etcdraft"
            },
        ...
      ...
    ...
}

看这两个kafka和raft配置的差异,基本就比较清楚要怎么改了。

上一篇下一篇

猜你喜欢

热点阅读