在分佈式系統中,配置中心是一個基本的組件,它爲散佈在不一樣機器上的服務提供配置文件的通知,讀取,更新服務,通常對配置中心的設計要點以下:php
1) 配置持久化java
2) 多語言獲取接口python
3) client定時獲取,並緩存到本地,MD5比較是否更新mysql
4) 非關鍵路徑:多層級本地緩存,配置中心,客戶端機器。。,只要不是全部層級都掛掉就能夠訪問sql
5) 實時通知,主動獲取,定時獲取shell
下面介紹一下diamond和qconf都是如何作的數據庫
1) 配置持久化緩存
2) 集羣之間數據經過DB和通知來進行同步網絡
3) 數據庫和本地文件雙寫,下降對數據庫的壓力架構
4) 配置中心服務,提供http獲取方式
5) client主動獲取,緩存到本地
6) client定時獲取,MD5比較配置是否更新
7) 容災:容災目錄,client snapshot,server本地文件,mysql數據庫只要不是所有掛掉都能正常運行。
QConf是360普遍使用的配置管理服務,QConf對配置信息的定位,直接決定告終構設計和組件選擇。
1) 單條數據量小
2) 更新頻繁(較代碼而言)
3) 配置總數可能巨大,但單臺機器關心配置數有限
4) 讀多寫少
QConf的架構實現:
QConf使用ZooKeeper集羣做爲服務端提供服務。
在接口方面,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用新值更新共享內存中的該配置項。
配置中心是分佈式系統中一個很是重要的中間件,配置中心須要儘可能作到易用以及可靠,並須要作到可以多級容災,避免成爲系統單點。