概述
当系统变的复杂,配置项越来越多,一方面配置管理变得繁琐,另一方面配置修改后需要重新上线同样十分痛苦。这时候,需要有一套集中化配置管理系统,一方面提供统一的配置管理,另一方面提供配置变更的自动下发,及时生效。提到统一配置管理系统,大家应该比较熟悉,常见的:zookeeper、etcd、consul、git等等。上述的集中配置中心使用的时候,部署图大致是这样的:
server端只需要调用config-server对应客户端获取配置,和监听配置变更就可以了。总体来说没有太大难度。
接下来要说一下confd,它提供了一种新的集成思路。confd的存在有点类似于快递员,买了东西不需要自己到店去取货了,confd这个快递员会把货取过来,然后送到家里,并且通知你货已经送到了。加入confd之后的架构大致是这样的:
confd工作原理
confd使用时有几个概念需要熟悉,并且熟悉他们之间的依赖关系,才能理解如何配置confd,不然会比较懵。这里我们先看一下confd配置的几个概念之间是如何交互的:
confd的部署
以Linux系统为例。官方下载地址
1 | 下载二进制文件 |
confd的配置
详情参考:confd模板语法详解
Confd
通过读取后端存储的配置信息来动态更新对应的配置文件,对应的后端存储可以是etcd
,redis
等,其中etcd的v3版本对应的存储后端为etcdv3
。
创建confdir
confdir底下包含两个目录:
conf.d
: confd的配置文件,主要包含配置的生成逻辑,例如模板源,后端存储对应的keys,命令执行等。templates
: 配置模板Template,即基于不同组件的配置,修改为符合 Golang text templates的模板文件。
1 | mkdir -p /etc/confd/{conf.d,templates} |
模板源
模板源配置文件是TOML
格式的文件,主要包含配置的生成逻辑,例如模板源,后端存储对应的keys,命令执行等。默认目录在/etc/confd/conf.d
。
必要参数
dest
(字符串) - 目标文件。keys
(字符串数组) - 键数组。src
(字符串) - 配置模板的相对路径 。
可选参数
gid
(int) - 应该拥有该文件的gid。默认为有效的gid。mode
(字符串) - 文件的权限模式。uid
(int) - 应该拥有该文件的uid。默认为有效的uid。reload_cmd
(字符串) - 重新加载配置的命令。check_cmd
(字符串) - 检查配置的命令。prefix
(字符串) - 键前缀的字符串。
例子
1 | cat /etc/confd/conf.d/myapp-nginx.toml |
模板
Template
定义了单一应用配置的模板,默认存储在/etc/confd/templates
目录下,模板文件符合Go的text/template
格式。
模板文件常用函数有base
,get
,gets
,lsdir
,json
等。具体可参考https://github.com/kelseyhightower/confd/blob/master/docs/templates.md。
例子:
1 | cat /etc/confd/templates/nginx.tmpl |
创建后端存储的配置数据
以etcdv3
存储为例,在etcd中创建以下数据.
1 | etcdctl --endpoints=$endpoints put /services/web/cust1/2 '{"IP": "10.0.0.2"}' |
启动confd的服务
confd支持以daemon
或者onetime
两种模式运行,当以daemon
模式运行时,confd会监听后端存储的配置变化,并根据配置模板动态生成目标配置文件。
如果以daemon
模式运行,则执行以下命令:
1 | confd -watch -backend etcdv3 -node http://172.16.5.4:12379 & |
以下以onetime
模式运行为例。其中对应的后端存储类型是etcdv3
。
1 | 执行命令 |
查看生成的配置文件
在/etc/confd/conf.d/myapp-nginx.toml
中定义的配置文件的生成路径为/tmp/myapp.conf
。
1 | cat myapp.conf |
confd动态更新twemproxy
twemproxy.toml
confd的模板源文件配置:/etc/confd/conf.d/twemproxy.toml
1 | [template] |
twemproxy.tmpl
模板文件:/etc/confd/templates/twemproxy.tmpl
1 | global: |
etcd中的配置格式
etcd
中的配置通过一个map来定义为完整的配置内容。其中key
是twemproxy
中pool
的名称,value
是pool
的所有内容。
配置对应go结构体如下:
1 | type Pool struct{ |
配置对应JSON
格式如下:
1 | { |
生成twemproxy
配置文件
1 | global: |
定时自动更新配置
方法一:使用confd的定时执行机制,启动confd时执行:
1 | interval单位是秒,默认值是600秒。 |
方法二:使用操作系统的crontab定时执行:
1 | crontab -e |