公司consul key/value已经使用了一段时间,本身没有修改记录和备份容灾,后者是git的强项。 所以本文采用把项目的配置提交到指定的gitlab repo,用程序自动同步到consul的结构。
安装go(注意设置$GOPATH),再安装fsconsul,编写备份配置文件fsconsul_config.json:
{
"consul" : {
"addr": "10.0.40.111:8500", // 别写前缀http:
"dc": "dc1",
"token" : "my-reader-token" // consul没有开启acl就不需要
} ,
"runOnce" : true, // 只备份一次
"mappings" : [{
"prefix": "/service", // 要备份的consul目录
"path": "/Users/sean/workspace/study/fsconsul_back" // 本地备份目录
}]
}
执行同步命令:
fsconsul -configFile fsconsul_config.json
注意fsconsul不会同步空文件夹。
把path提交到git上作为同步的repo即可。
找一台机器能pull上述的repo,安装nodejs、npm,再安装git2consul。
编写配置:
{
"version":"1.0",
"local_store": "/data/git2consul", // 本地repo cache,默认是/tmp
"logger":{
"name":"git2consul",
"streams":[
{
"level":"trace", // 线上可以用debug
"type":"rotating-file",
"path":"/var/log/git2consul/git2consul.log"
}
]
},
"repos":[
{
"name":"service",
"url":"git@your_git_lab_host:consul_config/keyvalue.git",
"include_branch_name" : false, //默认到consul是/name/branch这样的结构,去掉
"branches":[
"master"
],
"hooks":[
{ // gitlab上需要配置webhook
"type" : "gitlab",
"port" : "5252",
"url" : "/gitpoke"
},
{ // 轮询拉取也要配置,防止webhoook不成功
"type" : "polling",
"interval" : "1" // 最小1分钟
}
]
}
]
}
启动git2consul:
node /usr/bin/git2consul --endpoint 10.0.40.111 --port 8500 --config-file git2consul_config.json
git2consul在和git、consul交互时发生错误,会删除本地的repo,重新pull并提交consul。 但测试环境为了方便程序员临时修改,往往也需要直接修改consul,只要git上相同文件未被修改, 就不会覆盖consul。 要实现这个需求目前只能修改git2consul源代码,参见后续博文。