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配置的差异,基本就比较清楚要怎么改了。
网友评论