前言
應用項目中都會有一些配置信息,這些配置信息數據量少,一般會保存到內存、文件或者數據庫,有時候需要動態更新。當需要在多個應用服務器中修改這些配置文件時,需要做到快速、簡單、不停止應用服務器的方式修改並同步配置信息到所有應用中去。本篇文章就是介紹如何使用ZooKeeper來實現配置的動態同步。
ZooKeeper
在《hive Driver類運行過程》一文中可以看到hive為了支持並發訪問引入了ZooKeeper來實現分布式鎖。參考《ZooKeeper典型應用場景一覽》一文,ZooKeeper還可以用作其他用途,例如:
- 數據發布與訂閱(配置中心)
- 負載均衡
- 命名服務(Naming Service)
- 分布式通知/協調
- 集群管理與Master選舉
- 分布式鎖
- 分布式隊列
一些在線系統在運行中,需要在不停止程序的情況下能夠動態調整某一個變量的值並且能夠及時生效。特別是當部署了多台應用服務器的時候,需要能夠做到在一台機器上修改配置文件,然后在同步到所有應用服務器。這時候使用ZooKeeper來實現就很合適了。
數據發布與訂閱
發布與訂閱模型,即所謂的配置中心,顧名思義就是發布者將數據發布到ZK節點上,供訂閱者動態獲取數據,實現配置信息的集中式管理和動態更新。例如全局的配置信息,服務式服務框架的服務地址列表等就非常適合使用。
使用ZooKeeper的發布與訂閱模型,可以將應用中用到的一些配置信息放到ZK上進行集中管理。這類場景通常是這樣:應用在啟動的時候會主動來獲取一次配置,同時,在節點上注冊一個Watcher,這樣一來,以后每次配置有更新的時候,都會實時通知到訂閱的客戶端,從來達到獲取最新配置信息的目的。這樣的場景適合數據量很小,但是數據更新可能會比較快的需求。
配置存儲方案
配置文件通常有如下幾種保存方式:
-
將配置信息保存在程序代碼中
這種方案簡單,但每次修改配置都要重新編譯、部署應用程序。顯然這種方案很不方便,也不可靠,更無法做到修改的實時生效。 -
將配置信息保存在xml文件或者屬性文件中
在參數信息保存在xml或者屬性文件中,當需要修改參數時,直接修改 xml 文件。這樣無需重新編譯,只需重新部署修改的文件即可。但然后對所有的應用進行重新部署。這樣做的缺點顯而易見,要往上百台機器上重新部署應用,簡直是一個噩夢。同時該方案還有一個缺點,就是配置修改無法做到實時生效。修改后往往過一段時間才能生效。 -
將配置信息保存在數據庫中
當需要修改參數時,直接修改數據庫,然后重啟分布式應用程序,或者刷新分布式應用的緩存。盡管這種做法比以上兩種方案簡單,但卻面臨着單點失效問題。如果數據庫服務器停機,則分布式應用程序的配置信息將無法更新。另外這種方案的配置修改生效實時性雖然比第二種方案好些,但仍然不能達到某些情況下的要求。
基於ZooKeeper的配置信息同步方案
如果使用ZooKeeper來實現,就可以直接把配置信息保存到ZooKeeper中,或者把屬性文件內容保存到ZooKeeper中,當屬性文件內容發生變化時,就通知監聽者如應用程序去重新讀取配置文件。
在網上搜索了一下,很能找到好用的現成的代碼實現。有的基於ZooKeeper來擴張jdk的hashmap來存儲配置參數,如:使用ZooKeeper實現靜態數據中心化配置管理,也有人直接實現了一個基於java並發框架的工具包,如:menagerie。
注意
:以下部分文字和圖來自:基於ZooKeeper的配置信息存儲方案的設計與實現1.pdf
基於ZooKeeper的特性,借助ZooKeeper可以實現一個可靠的、簡單的、修改配置能夠實時生效的配置信息存儲方案,整體的設計方案如圖:
整個配置信息存儲方案由三部分組成:ZooKeeper服務器集群、配置管理程序、分布式應用程序。
ZooKeeper服務器集群存儲配置信息,在服務器上創建一個保存數據的節點(創建節點操作);配置管理程序提供一個配置管理的UI界面或者命令行方式,用戶通過配置界面修改ZooKeeper服務器節點上配置信息(設置節點數據操作);分布式應用連接到ZooKeeper集群上(創建ZooKeeper客戶端操作),監聽配置信息的變化(使用獲取節點數據操作,並注冊一個watcher)。
當配置信息發生變化時,分布式應用會更新程序中使用配置信息。
源代碼
找到一個淘寶工程師寫的實現方式, 代碼見:zkpublisher
優點
借助 ZooKeeper我們實現的配置信息存儲方案具有的優點如下:
- 簡單。盡管前期搭建ZooKeeper服務器集群較為麻煩,但是實現該方案后,修改配置整個過程變得簡單很多。用戶只要修改配置,無需進行其他任何操作,配置自動生效。
- 可靠。ZooKeeper服務集群具有無單點失效的特性,使整個系統更加可靠。即使ZooKeeper 集群中的一台機器失效,也不會影響整體服務,更不會影響分布式應用配置信息的更新。
- 實時。ZooKeeper的數據更新通知機制,可以在數據發生變化后,立即通知給分布式應用程序,具有很強的變化響應能力。
總結
本文參考了網上的一些文章,給出了基於ZooKeeper的配置信息同步方案,解決了傳統配置信息同步方案的缺點如實時性差、可靠性差、復雜等。