今天來跟你們分享的是奇虎360開源的 QConf 配置中心。php
爲何咱們須要作這麼一件事情?html
由於遇到了,當業務分佈較廣,配置分佈較廣的時候,就會很容易地出現一些問題,好比作了負載均衡,須要調整一下應用配置。恰好改漏了一臺機,就偶爾出現一些問題,排查起來也是很吃力的。java
QConf 的架構: QConf架構python
除了 QConf 自己提供的工具以外,咱們用到了一個有掌閱科技開發的 zkdash zookeeper 管理工具。git
我的理解: github
QConf 能夠說是一個 zookeeper 的客戶端,經過 agent 去 watch zookeeper 的變化,數據存在本機,當 zookeeper 發生變化是,自動改變本地數據,來達到同步更新的效果。shell
這也就是爲何 QConf 須要搭配 zookeeper 去使用的緣由之一吧。apache
QConf使用ZooKeeper集羣做爲服務端提供服務。衆所周知,ZooKeeper是一套分佈式應用程序協調服務,根據上面提到的對配置內容的定位,咱們認爲能夠將單條配置內容直接存儲在ZooKeeper的一個ZNode上,並利用ZooKeeper的Watch監聽功能實現配置變化時對客戶端的及時通知。 按照ZooKeeper的設計目標,其只提供最基礎的功能,包括順序一致,原子性,單一系統鏡像,可靠性和及時性。ubuntu
咱們選擇Zookeeper還由於它有以下特色:vim
一、類文件系統的節點組織
二、穩定,無單點問題
三、訂閱通知機制
關於Zookeeper,更多見:https://zookeeper.apache.org/
由於ZooKeeper在接口方面只提供了很是基本的操做,而且其客戶端接口原始,因此咱們須要在QConf的客戶端部分解決以下問題:
一、下降與ZooKeeper的連接數 原生的ZooKeeper客戶端中,全部須要獲取配置的進程都須要與ZooKeeper保持長鏈接,在生產環境中每一個客戶端機器可能都會有上百個進程須要訪問數據,這對ZooKeeper的壓力很是大並且也是沒必要要的。
二、本地緩存 固然咱們不但願客戶端進程每次須要數據都走網絡獲取,因此須要維護一份客戶端緩存,僅在配置變化時更新。
三、容錯 當進程死掉,網絡終端,機器重啓等異常狀況發生時,咱們但願能儘量的提供可靠的配置獲取服務。
四、多語言版本接口 目前提供的語言版本包括:c,php,java,python,go,lua,shell。
五、配置更新及時 能夠秒級同步到全部客戶端機器。
六、高效的配置讀取 內存級的訪問速度。
瞭解完基礎的知識和原理,就開始動手實踐想法和操做吧,理論要和實踐結合,否則就瞎扯淡了。
Linux: Ubuntu 16.04
安裝包地址: zookeeper
$ sudo wget http://apache.stu.edu.tw/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz $ sudo tar -zxvf zookeeper-3.4.9.tar.gz
解壓完成後,是能夠直接運行 zkServer 的,可是須要配置本身的基礎信息。
$ cd zookeeper-3.4.9 $ sudo cp conf/zoo_sample.cfg conf/zoo.cfg
啓動 zkServer
$ cd ../ $ ./bin/zkServer.sh start
默認監聽: 0.0.0.0:2181
測試服務是否啓動: telnet 127.0.0.1 2181
輸入 stat
Zookeeper version: 3.4.9-1757313, built on 08/23/2016 06:50 GMT Clients: xxx Latency min/avg/max: 0/0/51 Received: 252717 Sent: 252716 Connections: 5 Outstanding: 0 Zxid: 0x13 Mode: standalone Node count: 10
會輸出上述信息,服務器啓動成功.
而後建立一下 zookeeper 測試數據:
sh zkCli.sh create /demo demo create /demo/confs confs create /demo/confs/conf1 111111111111111111111 create /demo/confs/conf2 222222222222222222222 create /demo/confs/conf3 333333333333333333333
安裝方式能夠查看官方 wiki
安裝 FAQ
安裝完 qconf 後,進入 qconf 安裝目錄,調整 idc.conf
$ cd conf/ $ sudo vim idc.conf
輸入本身的 zookeeper 服務器地址,多個用 ,
隔開:
#[zookeeper] ############################################################################ # QCONF config # ############################################################################ # all the zookeeper host configuration. #[zookeeper] zookeeper.test=zookeeper host
保存便可。
啓動 QConf agent。
在 ubuntu 下使用 bash 去啓動
$ sudo bash ./bin/agent-cmd.sh start
啓動成功,查看 QConf 命令。
qconf get_conf /demo/confs/conf1 qconf get_batch_keys /demo/confs
若是返回對應的信息,那幾說明能夠正常獲取數據了。若是失敗,就去 logs/ 目錄查詢錯誤信息,對應修改。
/usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config --with-libqconf-dir=/usr/local/qconf/include --enable-static LDFLAGS=/usr/local/qconf/lib/libqconf.a make make install
qconf 配置在 qconf 安裝的目錄中,根據路徑找到對應的依賴包便可。
安裝完後,添加到 php.ini,使用 php --ini
查看配置文件位置。
查看擴展安裝:
php -m | grep qconf
安裝完 QConf 和 zookeeper,安裝咱們的管理後臺。
須要 Python >= 2.7,若是是 centos65 的用戶,須要升級本身的 Python 版本,升級方法請看: Python升級
地址: zkdash
安裝完 zkdash,配置對應節點,進行管理便可。
zkdash Web管理服務默認是全網公開訪問的,須要修改監聽host和端口,修改方式
$ sudo vim init.py
修改監聽的 host 地址:
74 def main(): 75 """主程序入口 76 """ 77 logger.init_logger(LOG_ITEMS, suffix=OPTIONS.port) 78 application = Application() 79 http_server = tornado.httpserver.HTTPServer(application, 80 xheaders=True) 81 http_server.listen(OPTIONS.port, address="輸入你須要監聽的地址") 82 tornado.ioloop.IOLoop.instance().start() 83
address 是新增的 host 參數。自己是沒有的
恭喜你,你已經構建完本身的配置中心了。接下來須要作的是,提升性能,和穩定性,擴展 zookeeper。我只能幫你到這裏了,接下來的路,本身走吧。
更多開源項目歡迎關注: https://github.com/janhuang