项目中需要实现container的nginx.conf的动态即时更新功能,container跨物理机部署,其中的nginx需要在conf文件更新后实时触发reload动作;

总体框架如下图所示,使用etcd集群来维护不同container的conf变量信息,container中部署有nginx和confd,confd在container启动时自动到etcd完成注册,并轮询使用etcd的restful api来拉取、更新本地conf变量值和reload本地nginx;

图1.0 etcd_confd_container模块架构

在整个架构中,核心模块主要有meta-server,confd和etcd,目前都使用docker image方式制作和部署;
1、meta-server
1.1、周期性的使用docker的restful api来获取跨物理机的container信息(json数据),将container信息注册到etcd集群中(比如注册到path:/optimize/host/{id},/optimize/memcache/{id}等);
1.2、业务端使用http/rpc与meta-server通信并发起任务,meta-server使用etcd锁住目标container并更新container path中的key;

2、confd
2.1、使用long pulling方式watch etcd集群中已注册的本地container path/key,根据key值更新本地模板中的变量,diff本地模板与nginx.conf,若不同则更新本地nginx.conf并reload本地nginx server;

3、etcd
一个高可用的键值存储系统,主要用于共享配置和服务发现。