fabric kafka-based instance的迁移
- 说在前面
所谓迁移是指把一个instance迁移到另一个instance上面,两个instance共享一些信息,又有一些信息不同;这不同于recover操作,recover指的是同一个instance坏掉之后恢复正常,recover操作的两个相关instance实际上是同一个instance。
所以这里的迁移着重强调的是两个instance之间fabric ledger数据的迁移,至于instance的配置访问会有不同。
- 限制条件
-
迁移前后的两个instance的mspid是相同的。
-
迁移前后的两个instance的admin用户是相同的。
-
迁移前后的两个instance的ca server共用同一套根证书。
-
迁移前后的两个instance的节点访问地址是不一样的,毕竟是两个instance,否则就叫recover了。
- 迁移步骤
3.1 迁移kafka
- 从源instance导出kafka数据
- 向目标instance导入kfakfa数据
3.2 迁移ca
- 从源instance导出ca根证书
- 向目标instance导入ca根证书,并且启动ca server
3.3 迁移orderer
- 从目标instance的ca server为order签出msp证书。
- 从源instance导出系统genesis block,部署到目标instance的orderer node
- 修改orderer代码,从环境(配置)读取kakfa地址
orderer正常是从channel的config block里面读取kakfa地址的,在这个场景下channel的config block里面记录的kafka地址是源instance的kafka地址,所以orderer会去访问源instance的kafka,这显然是不符合目标的;在当前版本的fabric中并不支持从外面环境/配置读取kafka地址,所以这里必须非标准的修改orderer的代码使得能够从环境/配置中读取覆盖源config block中的kafka地址。 - 启动orderer,自动从kakfa同步所有channel数据
- 对所有的channel,修改配置块信息
- 修改orderer地址:
.channel_group.values.OrdererAddresses.value.addresses - 修改kafka地址:
.channel_group.groups.Orderer.values.KafkaBrokers.value.brokers - 修改anchor地址(如果是testchainid channel):
.channel_group.groups.Application.groups.<mspid>.values.AnchorPeers.value.anchor_peers
- 修改orderer地址:
3.4 迁移peer
- 从目标instance的ca server为peer签出msp证书。
- 修改peer的代码,从环境(配置)读取orderer地址
和修改orderer代码一样,peer正常是从channel的config block里面读取orderer地址的,在这个场景下channel的config block里面记录的orderer地址是源instance的orderer地址,所以peer会去访问源instance的orderer,这显然是不符合目标的;在当前版本的fabric中并不支持从外面环境/配置读取orderer地址,所以这里必须非标准的修改peer的代码使得能够从环境/配置中读取覆盖源config block中的orderer地址。 - 启动peer
- 安装chaincode
把源instance的peer下面的chaincode文件复制到目标instance对于的peer下面。 - 加入channel
加入后,peer开始从orderer同步channel数据
- 附录
修改orderer代码从环境/配置读取kafka地址,粗暴的做法是把下面函数改掉:
$ cat common/channelconfig/orderer.go
...
func (oc *OrdererConfig) KafkaBrokers() []string {
return oc.protos.KafkaBrokers.Brokers
}
...
修改peer代码从环境/配置读取orderer地址,粗暴的做法是把下面函数改掉:
$ cat common/channelconfig/channel.go
...
// OrdererAddresses returns the list of valid orderer addresses to connect to to invoke Broadcast/Deliver
func (cc *ChannelConfig) OrdererAddresses() []string {
return cc.protos.OrdererAddresses.Addresses
}
...
网友评论