分布式配置之qconf

2021-09-11 21:38:33 字數 2555 閱讀 7852

qconf 是乙個分布式配置管理工具。 用來替代傳統的配置檔案,使得配置和業務**分離,同時配置能夠實時同步到客戶端保證配置及時生效。

qconf採用cmake進行構建(cmake 版本 2.6及以上)

可以使用以下命令完成qconf的編譯安裝:

mkdir build && cd build

cmake ..

make

make install複製**

vi qconf_install_prefix/conf/idc.conf複製**

#all the zookeeper host configuration.

#[zookeeper]

zookeeper.test=127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183 #test機房zookeeper配置

複製**

echo

test > qconf_install_prefix/conf/localidc #指定本地機房為test

複製**

cd qconf_install_prefix/bin && sh agent-cmd.sh start複製**

qconf get_conf /demo/node1   # get the value of '/demo/node1'

複製**

qconf採用zookeeper為分布式配置資料集群,利用qconf_agent與zookeeper集**互獲取資料,業務**通過與qconf進行互動獲取配置資訊,qconf服務端與zookeeper集**互進行配置集群資料。總體來看還是很清晰的,其核心就是利用zookeeper分布式系統及其watcher功能。

進入主題,開始介紹qconf的架構實現,下圖展示的是qconf的基本結構,從角色上劃分主要包括qconf客戶端qconf服務端,qconf管理端 。

qconf使用zookeeper集群作為服務端提供服務。可以將單條配置內容直接儲存在zookeeper的乙個znode上,並利用zookeeper的watch監聽功能實現配置變化時對客戶端的及時通知。 按照zookeeper的設計目標,其只提供最基礎的功能,包括順序一致,原子性,單一系統映象,可靠性和及時性。

因為zookeeper在介面方面只提供了非常基本的操作,並且其客戶端介面原始,所以我們需要在qconf的客戶端部分解決如下問題:

下面來看下qconf客戶端的架構:

可以看到qconf客戶端主要有:agent、各種語言介面、連線他們的訊息佇列和共享記憶體。

在qconf中,配置以key-value的形式存在,業務程序給出key獲得對應value,這與傳統的配置檔案方式是一致的。

下面通過兩個主要場景的資料流動來說明他們各自的功能和角色:

場景1.業務程序請求資料:

業務程序呼叫某一種語言的qconf介面,從共享記憶體中查詢需要的配置資訊。

如果存在,直接獲取,否則會向訊息佇列中加入該配置key。

agent從訊息佇列中感知需要獲取的配置key。

agent向zookeeper查詢資料並註冊監聽。

agent將獲得的配置value序列化後放入共享記憶體。

業務程序從共享記憶體中獲得最新值。

場景2.配置資訊更新:

圖6 資料流動-配置更新

zookeeper通知agent某配置項發生變化。

agent從zookeeper查詢新值並更新watcher。

agent用新值更新共享記憶體中的該配置項。

通過上面的說明,可以看出qconf的整體結構和流程非常簡單。 qconf中各個元件或執行緒之間僅通過有限的中間資料結構通訊,耦合性非常小,各自只負責自己的本職工作和一畝三分地,而不感知整體結構。

下面通過幾個點來詳細介紹:

無鎖根據上文提到的配置資訊的特徵,我們認為在qconf客戶端進行的是多程序並行讀取的過程,對配置資料來說讀操作遠多於寫操作。為了盡可能的提高讀效率,整個qconf客戶端在操作共享記憶體時採用的是無鎖的操作,同時為了保證資料的正確,採取了如下兩個措施:

單點寫將寫操作集中到單一執行緒,其他執行緒通過中間資料結構與之通訊,寫操作排隊,用這種方法犧牲掉一些寫效率。 在qconf客戶端,需要對共享記憶體進行寫操作的場景有:

讀驗證無鎖的讀寫方式,會存在讀到未寫入完全資料的危險,但考慮到在絕對的讀多寫少環境中這種情況發生的概率較低,所以我們允許其發生,通過讀操作時的驗證來發現。共享記憶體資料在序列化時會帶其md5值,業務程序從共享記憶體中讀取時,利用預存的md5值驗證是否正確讀取。

異常處理

qconf中採取了一些處理來應對不可避免的異常情況:

資料序列化

qconf 客戶端中有多處需要將資料序列化通訊或儲存,包括共享記憶體,訊息佇列,落盤資料中的內容。 我們採取了如下協議:

圖7 資料序列化協議

agent任務

圖8 agent內部結構

奇虎360開源專案QConf 分布式配置管理工具

qconf 是乙個分布式配置管理工具,主要用來替代傳統的配置檔案,使得配置資訊和程式 分離,同時配置變化能夠實時同步到客戶端,而且保證使用者高效讀取配置,這使的工程師從瑣碎的配置修改 提交 配置上線流程中解放出來,極大地簡化了配置管理工作。該項目的主要特點 專案文件 wiki 專案原始碼 githu...

sphinx分布式配置

單機配置請參考 搭建coreseek sphinx mmseg3 詳細安裝配置 php之sphinx擴充套件安裝 php呼叫示例 分布式配置很簡單,只需要將區域網內的機器連線即可。vi usr local coreseek etc csft.conf php view plain copy prin...

RabbitMQ分布式配置

通過增加更多的節點來擴充套件訊息通訊的吞吐量 1 集群配置方式 federation 應用於廣域網,允許單台伺服器上的交換機或佇列接收發布到另一台伺服器上交換機或佇列的訊息,可以是單獨機器或集群。federation佇列類似於單向點對點連線,訊息會在聯盟佇列之間 任意次,直到被消費者接受。通常使用f...