配置中心概述:
在分布式系統中,配置中心是一個基本的組件,它為散布在不同機器上的服務提供配置文件的通知,讀取,更新服務,一般對配置中心的設計要點如下:
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用新值更新共享內存中的該配置項。
總結:
配置中心是分布式系統中一個非常重要的中間件,配置中心需要盡量做到易用以及可靠,並需要做到能夠多級容災,避免成為系統單點。