fabric instance从kafka到raft的迁移
2020-06-02 本文已影响0人
CodingCode
迁移kafka instance到raft instance
参考官方文档:Migrating from Kafka to Raft
- 进入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请求。
- 修改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修改掉;注意:
- state保持STATE_MAINTENANCE,这在第一步已经改了。
- type改成"etcdraft",原先是"kafka"
- metadata包含consenters和options两部分。
除了这个之前,还有一个地方也要替换掉,就raft ca certificate,因为虽然定义了raft certificate,总得有一个机制来验证这些raft证书的有效性吧,所以还有两个地方:
- .channel_group.groups.Orderer.groups.<mspid>.values.MSP.value.config.tls_root_certs
- .channel_group.groups.Application.groups.<mspid>.values.MSP.value.config.tls_root_certs
如果是系统channel testchainid,则还有第三处:
- .channel_group.groups.Consortiums.groups.SampleConsortium.groups.<mspid>.values.MSP.value.config.tls_root_certs
他们都是数组类型(已经存在数组里的根证书包括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
- 停止orderer
把所有的orderer停掉
- 停止kafka/zk
- 重启orderer
重启orderer之后,可以查看orderer的日志,看到选出新的leader节点。
- 退出maintain模式
这是第一步的逆步骤,即把state改回normal;具体操作参照步骤1。
for each channel do
.channel_group.groups.Orderer.values.ConsensusType.value.state = "STATE_NORMAL"
done