分布式系统组件之配置中心
配置中心概述:
在分布式系统中,配置中心是一个基本的组件,它为散布在不同机器上的服务提供配置文件的通知,读取,更新服务,一般对配置中心的设计要点如下:
1) 配置持久化
2) 多语言获取接口
3) client定时获取,并缓存到本地,MD5比较是否更新
4) 非关键路径:多层级本地缓存,配置中心,客户端机器。。,只要不是所有层级都挂掉就可以访问
5) 实时通知,主动获取,定时获取
配置中心示例:
下面介绍一下diamond和qconf都是如何做的
淘宝配置中心(diamond)
1) 配置持久化
2) 集群之间数据通过DB和通知来进行同步
3) 数据库和本地文件双写,降低对数据库的压力
4) 配置中心服务,提供http获取方式
5) client主动获取,缓存到本地
6) client定时获取,MD5比较配置是否更新
7) 容灾:容灾目录,client snapshot,server本地文件,mysql数据库只要不是全部挂掉都能正常运行。
360配置中心(QConf)
QConf是360广泛使用的配置管理服务,QConf对配置信息的定位,直接决定了结构设计和组件选择。
1) 单条数据量小
2) 更新频繁(较代码而言)
3) 配置总数可能巨大,但单台机器关心配置数有限
4) 读多写少
QConf的架构实现:
QConf服务端:
QConf使用ZooKeeper集群作为服务端提供服务。
QConf客户端
在接口方面,ZooKeeper本身只提供了非常基本的操作,并且其客户端接口原始,所以我们需要在QConf的客户端部分解决如下问题:
l 降低与ZooKeeper的链接数。原生的ZooKeeper客户端中,所有需要获取配置的进程都需要与ZooKeeper保持长连接,在生产环境中每个客户端机器可能都会有上百个进程需要访问数据,这对ZooKeeper的压力非常大而且也是不必要的。
l 本地缓存。当然我们不希望客户端进程每次需要数据都走网络获取,所以需要维护一份客户端缓存,仅在配置变化时更新。
l 容错。当进程退出、网络中断、机器重启等异常情况发生时,我们希望能尽可能的提供可靠的配置获取服务。
l 多语言版本接口。目前提供的语言版本包括:c,php,java,python,go,lua,shell
l 配置更新及时,可以秒级同步到所有客户端机器。
l 高效的配置读取,内存级的访问速度。
QConf客户端主要有:agent、各种语言接口、连接他们的消息队列和共享内存。在QConf中,配置以key-value的形式存在,业务进程给出key获得对应value,这与传统的配置文件方式是一致的。
获取配置流程
l 业务进程调用某一种语言的QConf接口,从共享内存中查找需要的配置信息;
l 如果存在,直接获取,否则会向消息队列中加入该配置key;
l agent从消息队列中感知需要获取的配置key;
l agent向ZooKeeper查询数据并注册监听;
l agent将获得的配置value序列化后放入共享内存;
l 业务进程从共享内存中获得最新值。
更新配置流程
l ZooKeeper通知agent某配置项发生变化;
l agent从ZooKeeper查询新值并更新watcher;
l agent用新值更新共享内存中的该配置项。
总结:
配置中心是分布式系统中一个非常重要的中间件,配置中心需要尽量做到易用以及可靠,并需要做到能够多级容灾,避免成为系统单点。