分布式系统组件之配置中心

配置中心概述:

在分布式系统中,配置中心是一个基本的组件,它为散布在不同机器上的服务提供配置文件的通知,读取,更新服务,一般对配置中心的设计要点如下:

1)       配置持久化

2)       多语言获取接口

3)       client定时获取,并缓存到本地,MD5比较是否更新

4)       非关键路径:多层级本地缓存,配置中心,客户端机器。。,只要不是所有层级都挂掉就可以访问

5)       实时通知,主动获取,定时获取

 

配置中心示例:

下面介绍一下diamondqconf都是如何做的

淘宝配置中心(diamond

clip_image002

1) 配置持久化

2) 集群之间数据通过DB和通知来进行同步

3) 数据库和本地文件双写,降低对数据库的压力

4) 配置中心服务,提供http获取方式

5) client主动获取,缓存到本地

6) client定时获取,MD5比较配置是否更新

7) 容灾:容灾目录,client snapshotserver本地文件,mysql数据库只要不是全部挂掉都能正常运行。

360配置中心(QConf

QConf360广泛使用的配置管理服务,QConf对配置信息的定位,直接决定了结构设计和组件选择。

1)       单条数据量小

2)       更新频繁(较代码而言)

3)       配置总数可能巨大,但单台机器关心配置数有限

4)       读多写少

QConf的架构实现:

clip_image004

QConf服务端:

QConf使用ZooKeeper集群作为服务端提供服务。

QConf客户端

在接口方面,ZooKeeper本身只提供了非常基本的操作,并且其客户端接口原始,所以我们需要在QConf的客户端部分解决如下问题:

l  降低与ZooKeeper的链接数。原生的ZooKeeper客户端中,所有需要获取配置的进程都需要与ZooKeeper保持长连接,在生产环境中每个客户端机器可能都会有上百个进程需要访问数据,这对ZooKeeper的压力非常大而且也是不必要的。

l  本地缓存。当然我们不希望客户端进程每次需要数据都走网络获取,所以需要维护一份客户端缓存,仅在配置变化时更新。

l  容错。当进程退出、网络中断、机器重启等异常情况发生时,我们希望能尽可能的提供可靠的配置获取服务。

l  多语言版本接口。目前提供的语言版本包括:cphpjavapythongoluashell

l  配置更新及时,可以秒级同步到所有客户端机器。

l  高效的配置读取,内存级的访问速度。

clip_image006

QConf客户端主要有:agent、各种语言接口、连接他们的消息队列和共享内存。QConf中,配置以key-value的形式存在,业务进程给出key获得对应value,这与传统的配置文件方式是一致的。

获取配置流程

l  业务进程调用某一种语言的QConf接口,从共享内存中查找需要的配置信息;

l  如果存在,直接获取,否则会向消息队列中加入该配置key

l  agent从消息队列中感知需要获取的配置key

l  agentZooKeeper查询数据并注册监听;

l  agent将获得的配置value序列化后放入共享内存;

l  业务进程从共享内存中获得最新值。

更新配置流程

l  ZooKeeper通知agent某配置项发生变化;

l  agentZooKeeper查询新值并更新watcher

l  agent用新值更新共享内存中的该配置项。

 

总结:

配置中心是分布式系统中一个非常重要的中间件,配置中心需要尽量做到易用以及可靠,并需要做到能够多级容灾,避免成为系统单点。

 

posted @ 2016-07-20 22:28  三丰SanFeng  阅读(2768)  评论(1编辑  收藏  举报