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:
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實現iOS、Android投屏:基本概念
基礎概念 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 理論篇:基本概念和術語整理 一、關系數據庫 關系數據庫是目前應用最為廣泛的數據庫系統,它采用關系數據模型作為數據的組織方式,關系數據模型由關系的數據結構,關系的操作集合和關系的完整