一、写在前面
说到consul,很多人会说这是一个可以用于注册服务发现的工具,当然了,consul除了常用的注册服务发现,还可以用来当key-value数据库。这篇文章主要介绍一下consul 键值对数据库迁移。简单来说,当你在测试环境用到了consul的键值数据库存储,当你需要部署到线上的时候,需要同步整个kv数据库,就需要迁移了。
二、consul kv的简单介绍
consul的安装很简单,wget包下来之后,解压,就有可执行文件consul了
wget https://releases.hashicorp.com/consul/0.7.0/consul_0.7.0_linux_amd64.zip # 下载安装包,具体下载哪个版本自己更换
unzip consul_0.7.0_linux_amd64.zip # 解压wget下来的包
cd consul_0.7.0_linux_amd64 # 进入解压目录
cp consul /usr/local/bin/ #复制到bin目录下
consul agent -dev & # 以开发模式启动consul,后台运行,因为是开发模式,进程kill之后数据不会持久化
然后就可以用consul的kv操作了

如上图所示,就可以用consul进行简单的kv存储
三、consul导出kv到json文件
consul 提供了子命令 export、import 给用户导出 kv 到json文件,以及从json文件导入到consul里
我们可以看到确实可以用import命令导出到json文件,但是value好像不对,因为我们设置的kv是 foo - bar,但是出来的确是 YmFy?为什么呢?其实是经过了一次base64的加密,我们可以在consul kv get上加上参数就可以看到base64的value的输出:

也就是说 bar 经过一次base64映射就成了YmFy
我们把key删掉,然后用export从文件中导入试一下:
在上面的图片中,我们先是把foo这个key删除掉,然后再从json文件中导入,再次查询,发现查询成果,到目前为止,import 和 export 都能够满足我们的需求
四、替换的需求
到第三点的时候,我们已经能够从consul导出到json文件,并且从json文件里面还原进去,但是还有一个问题,有的时候数据是需要修改的,比如测试环境的mysql账户密码跟生产环境的mysql账户密码是不一样的,这个时候就需要我们批量替换,但是有什么问题呢?
问题就在于导出来的json文件是经过base64编码的,所以我们不能够直接用linux的 sed 命令替换
想到的一种方式,就是写python脚本,先求出 要被替换的源串的base64,以及目标串的base64
假设
base(s) = bs
base(t) = bt
把s和t作为入参,然后先用python算出bs和bt,然后读取consul导出的json文件,replace bs with bt,再输出到新的json文件
ps. 代码有空的时候补上 ? 休息一会
吃过晚饭啦,来补上代码
import base64
import sys
input_file = "./input.json"
output_file = "./output.json"
source_str = "old_psw"
target_str = "new_psw"
source_base64 = base64.b64encode(source_str.encode('utf-8')).decode('utf-8')
target_base64 = base64.b64encode(target_str.encode('utf-8')).decode('utf-8')
with open(input_file) as rf:
input_data = rf.read()
output_data = input_data.replace(source_base64, target_base64)
rf.close()
print(output_data)
with open(output_file, "w+") as wf:
wf.write(output_data)
wf.close()
补充:
洗澡的时候想了下,为哈不直接用shell呢 :-_-

export A=$(echo -n bar | base64) && export B=$(echo -n bbb | base64) && sed -i "s/$A/$B/g" kv.json