應用服務器的配置一般會放到properties文件中,格式爲:數據庫
system1.module2.prop3=value4緩存
而後啓動的時候加載,這樣帶來的問題是啓動後沒法修改,想修改必需要重啓應用服務器;服務器
回過頭來看,配置的名字是一個標準的樹形結構,能夠直接將全部配置以及值放到zookeeper中,網絡
/config/system1/module2/prop3=value4併發
因爲zookeeper將全部的數據存放在內存中,因此讀操做很是快,應用服務器啓動以後從zookeeper中將全部配置存儲到本地一份,另外利用zookeeper的watcher,當配置修改以後全部的應用服務器均可以收到通知,同步修改本地配置便可,這樣達到的效果是若是配置沒有更新(極大機率事件),則全部的配置讀取都是本地操做(沒有網絡io);若是配置有更新(極小機率事件),全部的應用服務器均可以及時收到通知並更新本地;分佈式
在大規模集羣中一般有不少類型角色的服務器,這時會將服務器按照類型角色進行分組,而後能夠動態監控組內服務器的變動,而後作進一步處理;oop
好比在Dubbo中會將producer服務器分組,當producer服務器有變動時consumer端會及時收到更新方便作balance,這樣實現producer服務器動態增減以及自動發現;性能
好比在Kafka中會將consumer服務器分組,當consumer服務器有變動時也會觸發rebalance;事件
另外還能夠用來對組內服務器的存活進行監控報警;內存
衆多的開源軟件中好比Hadoop(HDFS、YARN)、HBase、Spark Standalone、Oozie等,都是經過zookeeper來實現master的HA,實現主從切換;
好比:
/hadoop-ha/$hdfs_name/ActiveStandbyElectorLock
/yarn-leader-election/$yarn_name/ActiveStandbyElectorLock
/hbase/master
分佈式環境中有時須要在服務器之間進行協調,好比一個任務只容許在集羣中的一臺服務器運行等,經常使用的方法是利用數據庫鎖,這裏分爲樂觀鎖和悲觀鎖兩種實現;
好比Quartz的分佈式部署,就是利用數據庫鎖;
使用數據庫鎖有一些問題,1 數據庫資源昂貴,並且有併發數限制,悲觀鎖會直接佔用鏈接數,樂觀鎖可能因爲數據庫鏈接池滿致使鎖釋放,悲觀鎖可能因爲數據庫鏈接池滿致使卡住;2 數據庫鏈接有超時時間限制;
利用zookeeper的Ephemeral Node+Sequence Node+watch能夠很方便的實現分佈式鎖,Sequence Node能夠保證只有一個節點能拿到鎖,Ephemeral Node+watch能夠保證一旦鎖的持有者掛掉,其餘等待鎖的節點能夠立刻收到通知,同時再利用Sequence Node保證下一個節點能拿到鎖;