環境:CentOS 6.7, java version "1.7.0_51, ZooKeeper 3.4.6
環境:CentOS 6.7, jdk 1.7.0_51, ZooKeeper 3.4.6
(可選)創建新用戶
一般我傾向於把需要啓動daemon進程,對外提供服務的程序,即服務器類的程序,安裝在單獨的用戶下面。這樣可以做到隔離,運維方面,安全性也提高了。
創建一個新的group,
groupadd zookeeper useradd -g zookeeper zookeeper
1. 單機模式(Standalone mode) 單機模式在開發和調試階段很有用。 1.1 下載,解壓 cd /opt ;mkdir app cd app wget http://archive.apache.org/dist/zookeeper/stable/zookeeper-3.4.6.tar.gz tar zxf zookeeper-3.4.6.tar.gz
1.2 啓動 默認就是單機模式, $ mv conf/zoo_sample.cfg conf/zoo.cfg $ ./bin/zkServer.sh start
1.3 使用java 客戶端連接ZooKeeper $ ./bin/zkCli.sh -server 127.0.0.1:2181 然後就可以使用各種命令了,跟文件操作命令很類似,輸入help可以看到所有命令。
1.4 關閉 $ ./bin/zdServer.sh stop
2. 分佈式模式(Replicated mode) 在生產環境中,要配置成分佈式模式,才能發揮威力。 ZooKeeper集羣一般被稱爲ZooKeeper ensemble,或者 quorum.
2.1 準備3臺機器 假設有三臺機器,hostname和ip對應關係是: 192.168.10.80 zk01 192.168.10.81 zk02 192.168.10.82 zk03 ZooKeeper不存在明顯的master/slave關係,各個節點都是服務器,leader掛了,會立馬從follower中 選舉一個出來作爲leader.由於沒有主從關係,也不用配置SSH無密碼登錄了,各個zk服務器是自己啓動 的,互相之間通過TCP端口來交換數據。
2.2 修改配置文件conf/zoo.cfg dataDir=/opt/zookeeper/data dataLogDir=/opt/zookeeper/logs clientPort=2181 tickTime=2000 initLimit=5 syncLimit=2 server.1=zk01:2888:3888 server.2=zk02:2888:3888 server.3=zk03:2888:3888
注: dataDir:數據目錄 dataLogDir:日誌目錄 clientPort:客戶端連接端口 tickTime:Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會發送一個心跳。 initLimit:Zookeeper的Leader 接受客戶端(Follower)初始化連接時最長能忍受多少個心跳時間間隔數。當已經超過 5個心跳的 時間(也就是tickTime)長度後 Zookeeper 服務器還沒有收到客戶端的返回信息,那麼表明這個 客戶端連接失敗。總的時間長度就是 5*2000=10 秒 syncLimit:表示 Leader 與 Follower 之間發送消息時請求和應答時間長度,最長不能超過多少 個tickTime 的時間長度,總的時間長度就是 2*2000=4 秒。 server.A=B:C:D:其中A 是一個數字,表示這個是第幾號服務器;B 是這個服務器的 ip 地址; C 表示的是這個服務器與集羣中的 Leader 服務器交換信息的端口;D 表示的是萬一集羣中的 Leader 服務器掛了,需要一個端口來重新進行選舉,選出一個新的 Leader,而這個端口就是用來 執行選舉時服務器相互通信的端口。如果是僞集羣的配置方式,由於 B 都是一樣,所以不同的 Zookeeper 實例通信端口號不能一樣,所以要給它們分配不同的端口號。
2.3 myid文件 要在每臺機器的dataDir下,新建一個myid文件,裏面存放一個數字,用來標識當前主機。 echo "1" >> /opt/zookeeper/data/myid echo "2" >> /opt/zookeeper/data/myid echo "3" >> /opt/zookeeper/data/myid
2.4 啓動每臺機器 zookeeper-3.4.6/bin/zkServer.sh start zookeeper-3.4.6/bin/zkServer.sh start zookeeper-3.4.6/bin/zkServer.sh start
2.5 查看狀態 zookeeper-3.4.6/bin/zkServer.sh status
3.使用java客戶端連接ZooKeeper集羣 ./bin/zkCli.sh -server zk01:2181 ./bin/zkCli.sh -server zk01:2181 ./bin/zkCli.sh -server zk01:2181
./zkCli.sh -server 127.0.0.1 2181 Connecting to 127.0.0.1 2015-12-03 16:42:31,452 [myid:] - INFO [main:Environment@100] - [zk: 127.0.0.1:2181(CONNECTED) 0] ls / 顯示當前數據 [test1, zookeeper]
1) 創建節點 格式:create [-s] [-e] path data acl 其中"-s"表示創建一個"有序"節點,"-e"表示創建一個臨時節點.默認爲持久性節點 ->create -s /test null ->create /test null 如下爲包括ACL的例子: ->create -s /test null digest:test:Kk3Nr5X06NH+XdlGMyOrULgK/mo=:rwcda 創建一個path爲"/test"的節點,值爲"null",ACL授權方式爲"digest",其中授權的用戶名:密碼爲"test:Kk3Nr5X06NH+XdlGMyOrULgK/mo=",ACL的權限列表爲"r""w""c""d""a". "digest"授權方式表示client方位此節點數據,需要指定用戶名和密碼,可以參考zookeeper中 DigestAuthenticationProvider.generateDigest(String ipName)方法;通過向此方法指定原始的用戶名和密碼即可獲得"digest"之後的字符串,比如傳入"test:test",將會得 到"test:V28q/NynI4JI3Rk54h0r8O5kMug=",其內部原理是將"密碼"部分進行MD5 + sha1操作.再zkCli.sh指令上你需要傳遞digest之後的字符串. 其中ACL的授權方式有很多種,你可以在ZooDefs類中找到更多的信息. 最後一個參數爲權限列表,r表示"read",w表示"write",c表示"create",d表示"delete",a表示"admin" 2) 獲取節點數據 格式:get path -> get /test -e cZxid = 0x5b ctime = Mon Sep 16 14:14:06 CST 2013 mZxid = 0x5b mtime = Mon Sep 16 14:14:06 CST 2013 pZxid = 0x67 cversion = 7 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 2 numChildren = 5 你可以從結果列表中,獲得所有的節點信息. 3) 查看子節點列表 指令: ls /path 4) 設置節點值 格式: set path data [version] -> set /test 1313131 -1 其中值需要爲字符串,版本號可以通過2)中的指令獲取,如果版本號爲"-1"表示更新時忽略版本校驗. 5) 刪除所有節點 格式: rmr path -> rmr /test 將會刪除"/test"以及其下的所有子節點. 6) 設置ACL 格式: setAcl path acl -> setAcl /test digest:test:Kk3Nr5X06NH+XdlGMyOrULgK/mo=:rwcda 和create指令非常相似. 7) 刪除節點 格式: delete path [version] -> delete /test -1 需要注意的是,如果此path下還有子節點,將導致刪除失敗.這是和"rmr"指令的區別. 8) 添加授權信息 格式: addauth schema auth -> addauth digest test:test 只有授權之後,才能夠訪問那些具有ACL控制的節點數據.注意"auth"信息爲原始的用戶名和密碼,而不是經過 DigestAuthenticationProvider簽名之後的. 如果使用了錯誤的授權信息,可能導致"Authentication is not valid : ".