本文版權歸部落格園和作者吳雙本人共同所有 轉載和爬蟲請注明原文位址 www.cnblogs.com/tdws
一.寫在前面
ZK是一個高效的分布式協調服務,高可用的分布式管理協調架構。 朋友推薦一本書《從paxos到zookeeper》,對我幫助的确很大。
二.叢集配置和踩坑
java安裝和環境變量配置可以參考 http://www.cnblogs.com/tdws/p/4096300.html
1 wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz 下載下傳
2
3 tar -zxvf zookeeper-3.4.10.tar.gz 解壓
4
5 mv zookeeper-3.4.10 /usr/local 剪切
6
7 mv zookeeper-3.4.10/ zookeeper 重命名
下面修改配置檔案命名
1 cd /usr/local/zookeeper/conf
2 mv zoo_sample.cfg zoo.cfg
配置一共沒幾行 。指定配置中的 dataDir
dataDir=/usr/local/zookeeper/data
自行mkdir建立data檔案夾。
在配置檔案末尾 配置叢集 我是單台機器僞叢集 三個節點
1 server.1=your_ip:20881:30881
2 server.2=your_ip:20882:30882
3 server.3=your_ip:20883:30883
在data檔案夾中建立檔案myid 來做一個辨別
nano myid 在檔案中填寫0 并且儲存。需要注意的是剛才我們的zookeeper檔案夾是不使用的,僅作為我們copy新節點的原本。
接下來複制三份zk
1 cp -r zookeeper/ zookeeper1
2 cp -r zookeeper/ zookeeper2
3 cp -r zookeeper/ zookeeper3
分别修改三台節點 其datadir 将路徑指定到自己節點之下
分别修改其端口号和myid,是各個zoo.conf 配置的其中port 設定分别為2181 2182 2183
各個myid内容分别為1 2 3
下面 去三個zk bin目錄下 執行zkServer.sh start
第一次 出錯
Error contacting service. It is probably not running.
哎 檢查好幾個小時ZK配置檔案 試了十幾種方法, 結果之前JAVA_HOME不小心配置錯了,我是yum安裝的jdk。
第二次 出錯與解決
後來又出一次錯誤 是我stop zk所有節點之後 再次啟動起不來 首先 jps指令 然後看到程序id和QuorumPeerMain
把Quorumpeermain的程序kill -9殺死
第三次 我丢雷樓某! 這個真是困擾了
如果使用阿裡雲ECS 專有網絡+彈性公網IP
一般不能直接在ECS執行個體的程式例綁定和使用彈性公網IP位址。因為這個公網IP位址在ECS之外。是以我開了所有的端口,根本沒有用,最後使用0.0.0.0解決問題。
1 server.1=0.0.0.0:20881:30881
2 server.2=0.0.0.0:20882:30882
3 server.3=0.0.0.0:20883:30883
三.應用和小結
學習ZK一段時間,原生API比較難以使用,一般使用zkClient(dubbo依賴于此)和curator架構來操作ZK比較容易。 其典型應用場景包括以下幾點:
1.資料釋出與訂閱
ZK在dubbo中作為注冊中心的角色,服務方和調用方都在這裡注冊。舉例來說明,我釋出了一個dubbo service,消費者webapp引用這個服務
<dubbo:service interface="com.s2s.service.ItemService" ref="itemServiceImpl"/> 釋出的服務
<dubbo:reference interface="com.s2s.service.ItemService" id="itemService"/> 引用服務(将使用RPC調用)
接下來去伺服器上檢視資料節點,
可以看到根目錄上有dubbo節點,dubbo下有com.s2s.service.ItemService, 其節點下又有consumers和providers等。
服務提供者啟動時向/dubbo/com.s2s.service.ItemService/providers目錄下寫入URL
服務消費者啟動時訂閱/dubbo/com.s2s.service.ItemService/providers目錄下的URL。 并且向/dubbo/com.s2s.service.ItemService/consumers目錄下寫入自己的URL
監控中心啟動時訂閱/dubbo/com.s2s.service.ItemService/目錄下的所有提供者和消費者URL。
是以dubbo監控中心,檢視到消費者和服務提供者
2.負載均衡
3.命名服務
4.分布式通知和協調
5.叢集管理與Master選舉
比如SolrCloud管理。管理叢集配置,監控叢集狀态,選舉分片leader
6.分布式鎖
有很多人用它做分布式鎖 但是做法比較底層。臨時節點是在一次會話内有效,保證了出現異常時,鎖能得以釋放。比如client1 做分布式操作 那他建立一個臨時節點 然後去做一些其他資料操作 做完操作後, 再去把臨時節點移除。這時c2才能去操作。如果有10個用戶端 要操作同一個資料,但是這個資料,有多個複制的版本 在不同的DB當中(當然值是一緻)。
這個時候 分布式鎖的作用就是同步操作。用戶端1 操作 這條資料, 那就去zk立即 就create個節點 代表占用了這條資料,這時候用戶端2 并發操作這條資料 先去zk上get一下這個節點,get到的話 可以等待一下,等用戶端1 釋放掉後,去再次create一下占領資料。
7.分布式隊列
本文主要是安裝配置,分布式理論的學習還是比較好,接下來将會繼續分享實踐中的收獲。