1. 程式人生 > >Zookeeper入門:基本概念、5項配置、啟動

Zookeeper入門:基本概念、5項配置、啟動

起源


   最早接觸Zookeeper,是在學習Hadoop權威指南這本書的時候,印象中是Hadoop專案的一個子工程。
   
   最近,專案中需要用到“分散式鎖”。
   
   之前,在開發P2P網貸系統的時候,就用到了“分散式鎖”,這個概念聽起來挺高階的,實際就是多臺機器下,同時執行專案下的“鎖”。
 之前是用Redis實現“分散式鎖”,但是週期性地出現了問題。只能是推測,程式異常退出,或者本地開發和測試環境用的一套Redis,
 本地執行緒定時任務,經常被強制關閉,鎖沒有成功釋放。
 
   聽Boss說,Memcache自帶的就是分散式的鎖,目前還沒用過。
   據Boss說,2005年之前,實現分散式鎖主要是用Memcache和Oracle。後來,出現了NoSQL的Redis,Oracle基本被MySQL取代,
“分散式鎖”就成了個問題。至於其他人是怎麼解決的,可能還是用了Memcache做快取,也可能還有其它機智或者解決方案。


   探討技術概念“分散式鎖”,真正的實現,必須是要考慮“業務場景”的。
   單獨的技術,很少有脫離業務場景的。
   
   後來Hadoop出現,有Zookeeper,不知什麼時候起,用Zookeeper實現分散式鎖的人就變多了。
   
   從哪裡可以看出來呢?百度搜索“Zookeeper”,相關的文章多了,搜尋Zookeeper+分散式鎖的人變多了。
   
   看一個技術火不火,看看有多少人在學習,有多少人在總結相關的文章,就知道了。
   
Zookeeper基本介紹

 
   ZooKeeper是一個分散式的,開放原始碼的分散式應用程式協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要元件。
   它是一個為分散式應用提供一致性服務的軟體,提供的功能包括:配置維護、名字服務、分散式同步、組服務等。
ZooKeeper的目標就是封裝好複雜易出錯的關鍵服務,將簡單易用的介面和效能高效、功能穩定的系統提供給使用者。
ZooKeeper包含一個簡單的原語集,[1]  提供Java和C的介面。
   ZooKeeper程式碼版本中,提供了分散式獨享鎖、選舉、佇列的介面,程式碼在zookeeper-3.4.3\src\recipes。其中分佈鎖和佇列有Java和C兩個版本,選舉只有Java版本。


   ZooKeeper是以Fast Paxos演算法為基礎的,paxos演算法存在活鎖的問題,即當有多個proposer交錯提交時,有可能互相排斥導致沒有一個proposer能提交成功,
   而Fast Paxos作了一些優化,通過選舉產生一個leader,只有leader才能提交proposer,具體演算法可見Fast Paxos。因此,要想弄懂ZooKeeper首先得對Fast Paxos有所瞭解。[3] 
ZooKeeper的基本運轉流程:
1、選舉Leader。
2、同步資料。
3、選舉Leader過程中演算法有很多,但要達到的選舉標準是一致的。
4、Leader要具有最高的zxid。
5、叢集中大多數的機器得到響應並follow選出的Leader。


官方網站

   http://zookeeper.apache.org/
   
Zookeeper啟動
   實際專案開發中,用的是Linux版本的。
   #Zookeeper啟動
./zkServer.sh start &
./zkCli.sh -server 127.0.0.1:2181 &
  沒啥大問題


  自己學習,用的是Windows版本的。
  #Zookeeper啟動
  cd /d E:\Mongodb-Redis-Nginx\zookeeper-3.5.1-alpha\bin
  
  zkServer start &
  zkCli -server 127.0.0.1:2181 &


  E:\Mongodb-Redis-Nginx\zookeeper-3.5.1-alpha\bin>zkServer.cmd start
系統找不到指定的路徑。
Error: JAVA_HOME is incorrectly set.


E:\Mongodb-Redis-Nginx\zookeeper-3.5.1-alpha\bin>call  "-Dzookeeper.log.dir=E:\M
ongodb-Redis-Nginx\zookeeper-3.5.1-alpha\bin\..\logs" "-Dzookeeper.root.logger=I
NFO,CONSOLE" "-Dzookeeper.log.file=zookeeper-Administrator-server-XIAOLEI.log" "
-XX:+HeapDumpOnOutOfMemoryError" "-XX:OnOutOfMemoryError=cmd /c taskkill /pid %%
p /t /f" -cp "E:\Mongodb-Redis-Nginx\zookeeper-3.5.1-alpha\bin\..\build\classes;
E:\Mongodb-Redis-Nginx\zookeeper-3.5.1-alpha\bin\..\build\lib\*;E:\Mongodb-Redis
-Nginx\zookeeper-3.5.1-alpha\bin\..\*;E:\Mongodb-Redis-Nginx\zookeeper-3.5.1-alp
ha\bin\..\lib\*;E:\Mongodb-Redis-Nginx\zookeeper-3.5.1-alpha\bin\..\conf" org.ap
ache.zookeeper.server.quorum.QuorumPeerMain "E:\Mongodb-Redis-Nginx\zookeeper-3.
5.1-alpha\bin\..\conf\zoo.cfg" start
檔名、目錄名或卷標語法不正確。


E:\Mongodb-Redis-Nginx\zookeeper-3.5.1-alpha\bin>endlocal


#列印Java_HOME,明明已經配置好了,所以排除JAVA_HOME的原因
E:\Mongodb-Redis-Nginx\zookeeper-3.5.1-alpha\bin>echo %JAVA_HOME%
C:\Program Files\Java\jdk1.7.0_17;
就算是把JAVA_HOME改為"C:\Program Files\Java\jdk1.7.0_17"還是不行。




網上搜了下,可能是JDK版本的問題,我用的是JDK1.7。
因此,我判斷很可能是JDK和Zookeeper的版本匹配問題。


重新下載3.4.6版本的Zookeeper
  cd /d E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin
  zkServer start &
  
  E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin>zkServer.cmd start


E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin>java "-Dzookeeper.log.dir=E:\Mongodb-
Redis-Nginx\zookeeper-3.4.6\bin\.." "-Dzookeeper.root.logger=INFO,CONSOLE" -cp "
E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin\..\build\classes;E:\Mongodb-Redis-Ngi
nx\zookeeper-3.4.6\bin\..\build\lib\*;E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin
\..\*;E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin\..\lib\*;E:\Mongodb-Redis-Nginx
\zookeeper-3.4.6\bin\..\conf" org.apache.zookeeper.server.quorum.QuorumPeerMain
"E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin\..\conf\zoo.cfg" start
錯誤: 找不到或無法載入主類 org.apache.zookeeper.server.quorum.QuorumPeerMain


E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin>endlocal


配置zoo.cfg檔案
在conf目錄,複製zoo_sample.cfg,重名為zoo.cfg,重新啟動


又報錯了
E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin>zkServer.cmd start


E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin>java "-Dzookeeper.log.dir=E:\Mongodb-
Redis-Nginx\zookeeper-3.4.6\bin\.." "-Dzookeeper.root.logger=INFO,CONSOLE" -cp "
E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin\..\build\classes;E:\Mongodb-Redis-Ngi
nx\zookeeper-3.4.6\bin\..\build\lib\*;E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin
\..\*;E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin\..\lib\*;E:\Mongodb-Redis-Nginx
\zookeeper-3.4.6\bin\..\conf" org.apache.zookeeper.server.quorum.QuorumPeerMain
"E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin\..\conf\zoo.cfg" start
2015-12-01 10:14:27,347 [myid:] - INFO  [main:
[email protected]
] - autopu
rge.snapRetainCount set to 3
2015-12-01 10:14:27,350 [myid:] - INFO  [main:[email protected]] - autopu
rge.purgeInterval set to 0
2015-12-01 10:14:27,351 [myid:] - INFO  [main:[email protected]] - Purge
 task is not scheduled.
2015-12-01 10:14:27,351 [myid:] - WARN  [main:[email protected]] - Either no co
nfig or no quorum defined in config, running  in standalone mode
2015-12-01 10:14:27,411 [myid:] - ERROR [main:[email protected]] - Invalid
arguments, exiting abnormally
java.lang.NumberFormatException: For input string: "E:\Mongodb-Redis-Nginx\zooke
eper-3.4.6\bin\..\conf\zoo.cfg"
        at java.lang.NumberFormatException.forInputString(Unknown Source)
        at java.lang.Integer.parseInt(Unknown Source)
        at java.lang.Integer.parseInt(Unknown Source)
        at org.apache.zookeeper.server.ServerConfig.parse(ServerConfig.java:60)
        at org.apache.zookeeper.server.ZooKeeperServerMain.initializeAndRun(ZooK
eeperServerMain.java:83)
        at org.apache.zookeeper.server.ZooKeeperServerMain.main(ZooKeeperServerM
ain.java:52)
        at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(Qu
orumPeerMain.java:116)
        at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain
.java:78)
2015-12-01 10:14:27,415 [myid:] - INFO  [main:[email protected]] - Usage: Z
ooKeeperServerMain configfile | port datadir [ticktime] [maxcnxns]
Usage: ZooKeeperServerMain configfile | port datadir [ticktime] [maxcnxns]


媽蛋啊,網上找了很多資料,沒啥可用的。
後來,還是根據錯誤資訊“windows zookeeper啟動 java.lang.NumberFormatException”找到了1個答案。
zkServer.cmd 不要後面的“start”就正常啟動了。


cd /d E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin
zkCli.cmd -server 127.0.0.1:2181
通過艱難的幾步,就正常啟動了。


Zookeeper啟動總結
1.實際專案用的是Linux,問題不大,本地開發學習用Windows,問題多多。
2.Zookeeper3.5.1-alpha,和本地JDK1.7,有衝突,無法正常啟動。
3.Zookeeper啟動,需要配置conf目錄下的zoo.cfg。複製-貼上-重新命名一次就可以了。
4.Windows下啟動,不需要帶“start”引數,直接zkServer.cmd,真是夠坑的。


zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=C:/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1




dataDir和clientPort應該是必須的。

一點感想:逃避or面對
在Windows下遇到問題的時候,其實我非常想立即轉到Linux下,就沒有這麼多屁事了。
但是,我一直意識到“人”比較喜歡逃避問題,就硬是忍著去正面解決了問題。
另外,是想把遇到的每一個問題都解決了,自己解決問題的能力,肯定是大幅度提高了。




參考資料
Zookeeper百度百科
http://baike.baidu.com/link?url=MsOQSGlqQA1BKF8v9OlB7k_jRi6lZm4fU9JeyP_pwA8yFa8mJopj3B7INfVVLRCIKkkEo2osXfBqnnSvuTq0p_


Zookeeper異常ConnectionLossException解決
http://www.sjsjw.com/kf_cloud/article/022572ABA018042.asp
E:\Mongodb-Redis-Nginx\zookeeper-3.5.1-alpha\bin


啟動Zookeeper時丟擲“Invalid arguments, exiting abnormally”錯誤資訊
http://www.bug315.com/article/156.htm

相關推薦

Zookeeper入門基本概念5配置啟動

起源   最早接觸Zookeeper,是在學習Hadoop權威指南這本書的時候,印象中是Hadoop專案的一個子工程。      最近,專案中需要用到“分散式鎖”。      之前,在開發P2P網貸系統的時候,就用到了“分散式鎖”,這個概念聽起來挺高階的,實際就是多臺機器下,

SQL優化基本概念(索引調優統計資訊查詢調整資源調控)

 1、索引碎片 /*======================================================= 注意:所有的引數都是以當前資料庫來計算的,所以必須指定完全限定。 模式影響如何收集碎片資料: LIMITED:掃描堆所有的頁,對於索引,

Zookeeper入門 基本概念 5配置 啟動

                起源   最早接觸Zookeeper,是在學習Hadoop權威指南這本書的時候,印象中是Hadoop專案的一個子工程。      最近,專案中需要用到“分散式鎖”。      之前,在開發P2P網貸系統的時候,就用到了“分散式鎖”,這個概念聽起來挺高階的,實際就是多臺機器下,同

《C語言程式設計現代方法(第2版)(K.N.King 著)》學習筆記六C語言基本概念5

問與答 GCC 最初是 GNU C Compiler 的簡稱。現在指 GNU Compiler Collection,這是因為最新版本的 GCC 能夠編譯用 Ada、C、C++、Fortran、Ja

基於DLNA實現iOSAndroid投屏基本概念

基礎概念 DLNA DLNA的全稱是DIGITAL LIVING NETWORK ALLIANCE(數字生活網路聯盟), 其宗旨是Enjoy your music, photos and videos, anywhere anytime, DLNA(Digital Liv

MongoDB入門基本概念

一.資料庫的分類 目前的資料庫主要分為關係型資料庫和非關係型資料。 關係型資料庫: 通過SQL結構化查詢和儲存語句,最常見的就是Oracle和MySQL 保持資料一致性理論,遵循ACID原理 非關係型資料庫: - Not Only SQL,是對不同於

挖掘頻繁模式關聯和相關性基本概念和方法

基本概念 頻繁模式: 頻繁模式是頻繁地出現在資料集中的模式(如項集、子序列或子結構)。 例如:頻繁地同時出現在交易資料集中的商品(如香皂和洗衣液)的集合是頻繁項集。 序號 交易號 香皂(a) 洗髮露(b) 洗衣液(c) 牙膏

【資料探勘筆記六】挖掘頻繁模式關聯和相關性基本概念和方法

6.挖掘頻繁模式、關聯和相關性:基本概念和方法 頻繁模式(frequent pattern)是頻繁地出現在資料集中的模式。 6.1 基本概念 頻繁模式挖掘搜尋給定資料集中反覆出現的聯絡,旨在發現大型事務或關係資料集中項之間有趣的關聯或相關性,其典型例子就是購物籃分析。 購物

【資料探勘概念與技術】學習筆記6-挖掘頻繁模式關聯和相關性基本概念和方法(編緝中)

頻繁模式是頻繁地出現在資料集中的模式(如項集、子序列或子結構)。頻繁模式挖掘給定資料集中反覆出現的聯絡。“購物籃”例子,想象全域是商店中商品的集合,每種商品有一個布林變數,表示該商品是否出現。則每個購物籃可以用一個布林向量表示。分析布林向量,得到反映商品頻繁關聯或同時購買的購買模式。這些模式可用關聯規則來表示

2018-03-24 第六章挖掘頻繁模式關聯和相關性基本概念

6.3 模式評估方法  大部分關聯規則挖掘演算法都使用支援度-置信度框架。儘管最小支援度和置信度閥值有助於排除大量無趣規則的探查,但仍然會產生一些使用者不感興趣的規則。強規則不一定是有趣的,甚至會誤導。    如:假設有10000個事務中,資料顯示6000個顧客事務包含計算機遊戲,7500個事務包含錄影,而4

ROS學習筆記(一) 入門基本概念

mes rap 打開 創建 創建ca cpp wiki 管理器 速度 目錄 基本概念 實踐操作 基本概念 1. Package 程序包,裏面包含節點Node、ROS程序庫、數據集、配置文件 Package Manefist 程序包的配置文件,即描述程序包的相關信息,包括其名

Python簡明教程基本概念

python1 字面意義上的常量,如2、‘This is ok‘這樣的字符串>>> print(‘a,2,3‘)a,2,32 字符串單引號(‘)使用單引號指示字符串,類似shell中的強引用,所有的空格、制表符照原樣保留。>>> print(‘This is ok‘)Thi

Python爬蟲(一)基本概念

popu 通用 字符 spider dai 自身 部分 螞蟻 people 網絡爬蟲的定義 網絡爬蟲(Web Spider。又被稱為網頁蜘蛛。網絡機器人,又稱為網頁追逐者),是一種依照一定的規則,自己主動的抓取萬維網信息的程序或者腳本。另外一些不常使用

第三章基本概念

npr bject 字面量 enume 不能 數據 開頭 clas int() 語法 借鑒了C語言以及類C語言(如java,perl)的語法 區分大小寫 標記符 字母數字下劃線$ 開頭不為數字 嚴格模式 use strict; 語句以分號結尾 關鍵

應用負載均衡之LVS(一)基本概念和三種模式

保存 訪問 方式 video big key vhdl cisc vid 網站架構中,負載均衡技術是實現網站架構伸縮性的主要手段之一。所謂"伸縮性",是指可以不斷向集群中添加新的服務器來提升性能、緩解不斷增加的並發用戶訪問壓力。通俗地講,就是一頭牛拉不動時,就用兩頭、三

高可用之KeepAlived(一)基本概念配置文件分析

leg bold touch event radius chm present ket temp KeepAlived系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 本文目錄:1. 概述2. VRRP協

Python 入門基本語法

2.7 oop 全路徑 perl 雙引號 one map 基本數據 安裝路徑 對於多數從其他編程語言轉入Python的來說,或多或少會有些不習慣。如果沿用其他編程語言的語法來寫Python代碼,那麽碰壁是不可避免的了。 本文是基於我看了兩個小時的官方文檔(Python 2

TensorFlow(二)基本概念以及練習

ssi AR oss -a n) counter 全部 enter num 一:基本概念 1、使用圖(graphs)來表示計算任務 2、在被稱之為會話(Session)的上下文(context)中執行圖 3、使用tensor表示數據 4、通過變量(Variable)維護狀

002-創建基本目-新已有

rmi copies .html ack 結構 eat bundles 依賴項 fig 一、創建基本項目   您可以使用create-react-app軟件包或創建一個空的IntelliJ IDEA項目並在其中安裝React。create-react-app項目地址:ht

Oracle知識梳理(一)理論篇基本概念和術語整理

http 知識梳理 屬性集 操作 url 本質 開發 表格 weight 理論篇:基本概念和術語整理 一、關系數據庫 關系數據庫是目前應用最為廣泛的數據庫系統,它采用關系數據模型作為數據的組織方式,關系數據模型由關系的數據結構,關系的操作集合和關系的完整