在windows下 zookeeper 入門安裝和測試
一、序言
以下是我對zookeeper 的一些理解:
zookeeper 作為一個服務註冊資訊儲存的管理工具,好吧,這樣說得很抽象,我們舉個“例子”。
栗子1號:
假設我是一家KTV的老闆,我同時擁有5家KTV,我肯定得時刻監視我KTV 的情況吧,是不是有人打架,或者發生火災什麼的,這時候我會給設定一個視訊監控,然後每一家都連線到我的視訊監控裡面,那麼我就可以在家裡看到所有KTV 的情況了,如果某一家出現問題,我就能及時發現,並且做出反應。
這個視訊監控就相當於zookeeper,每一家的連線,就相當於KTV 的資訊。
二、安裝過程
2.1 http://mirrors.hust.edu.cn/apache/zookeeper/ 下載,我的版本是 3.4.6(stable) 穩定
2.2 解壓到 F:\zookeeper-3.4.6
3.3 到目錄conf 下建立 zoo.cfg 檔案,預設就是載入這個檔案,檔案內容 我直接copy 的sample裡面的
#zoo.cfg 的內容 # 心跳檢查的時間 2秒 tickTime=2000 # 初始化時 連線到伺服器端的間隔次數,總時間10*2=20秒 initLimit=10 # ZK Leader 和follower 之間通訊的次數,總時間5*2=10秒 syncLimit=5 # 儲存記憶體中資料庫快照的位置,如果不設定引數,更新事務日誌將被儲存到預設位置。 dataDir=F:\\zk\\tmp\\zookeeper # 錯誤日誌的存放位置 dataLogDir=F:\\zk\\logs\\zookeeper # ZK 伺服器端的監聽埠 clientPort=2181
上面的說明介紹:http://zookeeper.apache.org/doc/current/zookeeperStarted.html
然後 cd 到bin 目錄下 執行zkServer.cmd 就啟動成功了。
注意:dataDir 和 dataLogDir 目錄不會自動建立,得手動建立才能啟動。
可以用netstat -ano|findstr "2181" 看看是否OK。
也可以用JPS 檢視啟動的JAVA 程序的情況,會出現這樣
C:\windows\system32>jps 8068 10040 QuorumPeerMain // 這東西是zk的東西,原始碼有介紹 10556 Jps
也可以用自帶客戶端命令 : zkCli.cmd -server 127.0.0.1:2181
關於JPS的東西,可以自己去JAVA_HOME\bin 目錄下去看,裡面很多命令。
四、JAVA 操作zookeeper :
上面安裝挺簡單的,我們來實際操作下:
4.1 匯入依賴:
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
或者匯入以下lib包
jline-0.9.94.jar
log4j-1.2.15.jar
netty-3.2.2.Final.jar
slf4j-api-1.6.1.jar
slf4j-log4j12-1.6.1.jar
zookeeper-3.4.5.jar
4.2 JAVA 實現:這裡我們簡單實現上面的例子
package cn.itcast.bigdata.zk;
import java.util.Arrays;
import java.util.List;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
public class ZkserverExample {
// 根節點
public static final String ROOT = "/root-ktv";
private static final String connectString = "127.0.0.1:2191";
private static final int sessionTimeout = 2000;
public static void main(String[] args) throws Exception {
// 建立一個與伺服器的連線
ZooKeeper zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
@Override
public void process(WatchedEvent event) {
// 收到事件通知後的回撥函式(應該是我們自己的事件處理邏輯)
System.out.println("狀態:" + event.getState()+":"+event.getType()+":"+event.getWrapper()+":"+event.getPath());
}
});
// 建立一個總的目錄ktv,並不控制權限,這裡需要用持久化節點,不然下面的節點建立容易出錯
zk.create(ROOT, "root-ktv".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
// 然後杭州開一個KTV , PERSISTENT_SEQUENTIAL 型別會自動加上 0000000000 自增的字尾
zk.create(ROOT+"/杭州KTV", "杭州KTV".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
// 也可以在北京開一個, EPHEMERAL session 過期了就會自動刪除
zk.create(ROOT+"/北京KTV", "北京KTV".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
// 同理,我可以在北京開多個,EPHEMERAL_SEQUENTIAL session 過期自動刪除,也會加數字的字尾
zk.create(ROOT+"/北京KTV-分店", "北京KTV-分店".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
// 我們也可以 來看看 一共監視了多少家的ktv
List<String> ktvs = zk.getChildren(ROOT, true);
System.out.println(Arrays.toString(ktvs.toArray()));
for(String node : ktvs){
// 刪除節點
zk.delete(ROOT+"/"+node,-1);
}
// 根目錄得最後刪除的
zk.delete(ROOT, -1);
zk.close();
}
}
輸出:
狀態:SyncConnected:None:-1,3,
:null
[北京KTV-分店0000000002, 杭州KTV0000000000, 北京KTV]
狀態:SyncConnected:NodeChildrenChanged:4,3,'/root-ktv
:/root-ktv
zookeeper 的結構圖和其他的一些功能,可參考: http://www.blogjava.net/shenh062326/archive/2011/10/29/zookeeper_yuling.html
三、zookeeper 偽叢集
上面栗子我們看到,如果我們的監控室也停電了,那不是就監測不到KTV情況了?一般情況下,zk 也是作為分散式部署了,也就是有多臺監控,由於監控多了,肯定要有一定為準(比如直播會有一些延遲),就要涉及到選舉的演算法,這裡暫時不介紹,先搭建一個偽叢集,因為機器不夠,只能再一臺機器上模擬搭建,整個過程無非是將上面的一些配置copy 幾份,然後配置不同的 地址和埠就行。
3.1 我們將F:\zookeeper-3.4.6\conf\下的zoo.cfg 改成zoo1.cfg,內容改為:
# 儲存記憶體中資料庫快照的位置,如果不設定引數,更新事務日誌將被儲存到預設位置。
# 每一個檔案路徑和下面的對應,zk1 zk2 zk3
dataDir=F:\\zk\\tmp\\zk1
# 錯誤日誌的存放位置
dataLogDir=F:\\zk\\logs\\zk1
# ZK 伺服器端的監聽埠
# 對應分別:2191 2192 2193
clientPort=2191
# 偽叢集
#2887 是server 之間通訊的,3887 是應用程式通訊的
# 同時加入其他兩個服務的地址和埠資訊
server.1=127.0.0.1:2887:3887
server.2=127.0.0.1:2888:3888
server.3=127.0.0.1:2889:3889
# 最後在錢檔案目錄下建立3份,zoo1.cfg,zoo2.cfg,zoo3,cfg 記得改引數
記得建立data目錄和log目錄,修改客戶埠號.
說明:
dataDir:資料目錄,不同的Zookeeper對應的目錄不一樣
dataLogDir:日誌目錄,不同的Zookeeper對應的目錄不一樣
clientPort:客戶端連線時用到的埠,不同的Zookeeper對應的目錄不一樣
“server.1=127.0.0.1:6660:7770”表示叢集中的伺服器,其格式為:
server.X=A:B:C,X是伺服器標識ID,即其myid檔案中的內容;A是該
Zookeeper的IP,C是該Zookeeper的IP埠;
C是叢集中各Zookeeper伺服器間進行選舉leader時要用到的埠。
3.2 同時我們將F:\zookeeper-3.4.6\bin\下的 zkServer.cmd 改為zkServer1.cmd,內容加上:
set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain
# 讀取配置的路徑,每個啟動服務對應一份
set ZOOCFG=..\conf\zoo1.cfg
# 同理建立3個zkServer1.cmd,zkServer2.cmd,zkServer3.cmd 記得改zoo 1 2 3.cfg
3.3 還得在dataDir 指定目錄,也就是F:\\zk\\tmp\\zk1 下建立myid 的檔案,內容對應1 2 3 即可。
這個的數字是唯一的,在1-255 之間,用來表示自身的id(其實我不明白 為啥zk 要這麼設計- -!)
3.4 啟動3個zkServer1.cmd 就OK了,如果要多伺服器配置,只需要要將 3份分開放到不同伺服器就OK
依次啟動的時刻有錯誤資訊,因為你啟動server1 的時候 2 和 3 沒找到,但是後面都啟動了 就沒問題了。
3.5連線指令碼zkCli1.cmd加上
set ZOOCFG=..\conf\zoo1.cfg
3.6連線
E:\zookeeper-qun\bin>zkCli1.cmd -server 127.0.0.1:2191
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[zk: 127.0.0.1:2191(CONNECTED) 0]
小結:
1.zookeeper 現在大家都用得比較多,這裡也是僅僅介紹下入門知識,linux 上安裝區別不打,還是得看具體應用。
2.關於選舉、一致性 和一些其他的東西,慢慢再寫!
3.有錯誤,請指出哦~。~ 感激。
參考資料:
官網的:
http://zookeeper.apache.org/doc/trunk/zookeeperStarted.html
API 文件:
http://zookeeper.apache.org/doc/r3.4.6/api/
別人介紹的一些流程:
http://cailin.iteye.com/blog/2014486
常用的場景:
http://nileader.blog.51cto.com/1381108/1040007
ZooKeeper系列之八:ZooKeeper的簡單操作
http://blog.csdn.net/shenlan211314/article/details/6187035