CentOS 6.7安裝ZooKeeper
環境:CentOS 6.7, jdk 1.7.0_51, ZooKeeper 3.4.6(可選)建立新使用者
一般我傾向於把需要啟動daemon進程,對外提供服務的程式,即伺服器類的程式,安裝在單獨的使用者下面。這樣可以做到隔離,營運方面,安全性也提高了。
建立一個新的group,
groupaddzookeeperuseradd-gzookeeperzookeeper
1.單機模式(Standalonemode)單機模式在開發和調試階段很有用。1.1下載,解壓cd/opt;mkdirappcdappwgethttp://archive.apache.org/dist/zookeeper/stable/zookeeper-3.4.6.tar.gztarzxfzookeeper-3.4.6.tar.gz
1.2啟動預設就是單機模式,$mvconf/zoo_sample.cfgconf/zoo.cfg$./bin/zkServer.shstart
1.3使用java用戶端串連ZooKeeper$./bin/zkCli.sh-server127.0.0.1:2181然後就可以使用各種命令了,跟檔案操作命令很類似,輸入help可以看到所有命令。
1.4關閉$./bin/zdServer.shstop
2.分布式模式(Replicatedmode)在生產環境中,要配置成分布式模式,才能發揮威力。ZooKeeper叢集一般被稱為ZooKeeperensemble,或者quorum.
2.1準備3台機器假設有三台機器,hostname和ip對應關係是:192.168.10.80zk01192.168.10.81zk02192.168.10.82zk03ZooKeeper不存在明顯的master/slave關係,各個節點都是伺服器,leader掛了,會立馬從follower中選舉一個出來作為leader.由於沒有主從關係,也不用配置SSH無密碼登入了,各個zk伺服器是自己啟動的,互相之間通過TCP連接埠來交換資料。
2.2修改設定檔conf/zoo.cfgdataDir=/opt/zookeeper/datadataLogDir=/opt/zookeeper/logsclientPort=2181tickTime=2000initLimit=5syncLimit=2server.1=zk01:2888:3888server.2=zk02:2888:3888server.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.3myid檔案要在每台機器的dataDir下,建立一個myid檔案,裡面存放一個數字,用來標識當前主機。echo"1">>/opt/zookeeper/data/myidecho"2">>/opt/zookeeper/data/myidecho"3">>/opt/zookeeper/data/myid
2.4啟動每台機器zookeeper-3.4.6/bin/zkServer.shstartzookeeper-3.4.6/bin/zkServer.shstartzookeeper-3.4.6/bin/zkServer.shstart
2.5查看狀態zookeeper-3.4.6/bin/zkServer.shstatus
3.使用java用戶端串連ZooKeeper叢集./bin/zkCli.sh-serverzk01:2181./bin/zkCli.sh-serverzk01:2181./bin/zkCli.sh-serverzk01:2181./zkCli.sh-server127.0.0.12181Connectingto127.0.0.12015-12-0316:42:31,452[myid:]-INFO[main:Environment@100]-[zk:127.0.0.1:2181(CONNECTED)0]ls/顯示當前資料[test1,zookeeper]1)建立節點格式:create[-s][-e]pathdataacl其中"-s"表示建立一個"有序"節點,"-e"表示建立一個臨時節點.預設為持久性節點->create-s/testnull->create/testnull如下為包括ACL的例子:->create-s/testnulldigest: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(StringipName)方法;通過向此方法指定原始的使用者名稱和密碼即可獲得"digest"之後的字串,比如傳入"test:test",將會得到"test:V28q/NynI4JI3Rk54h0r8O5kMug=",其內部原理是將"密碼"部分進行MD5+sha1操作.再zkCli.sh指令上你需要傳遞digest之後的字串.其中ACL的授權方式有很多種,你可以在ZooDefs類中找到更多的資訊.最後一個參數為許可權列表,r表示"read",w表示"write",c表示"create",d表示"delete",a表示"admin"2)擷取節點資料格式:getpath->get/test-ecZxid=0x5bctime=MonSep1614:14:06CST2013mZxid=0x5bmtime=MonSep1614:14:06CST2013pZxid=0x67cversion=7dataVersion=0aclVersion=0ephemeralOwner=0x0dataLength=2numChildren=5你可以從結果清單中,獲得所有的節點資訊.3)查看子節點列表指令:ls/path4)設定節點值格式:setpathdata[version]->set/test1313131-1其中值需要為字串,版本號碼可以通過2)中的指令擷取,如果版本號碼為"-1"表示更新時忽略版本校正.5)刪除所有節點格式:rmrpath->rmr/test將會刪除"/test"以及其下的所有子節點.6)設定ACL格式:setAclpathacl->setAcl/testdigest:test:Kk3Nr5X06NH+XdlGMyOrULgK/mo=:rwcda和create指令非常相似.7)刪除節點格式:deletepath[version]->delete/test-1需要注意的是,如果此path下還有子節點,將導致刪除失敗.這是和"rmr"指令的區別.8)添加授權資訊格式:addauthschemaauth->addauthdigesttest:test只有授權之後,才能夠訪問那些具有ACL控制的節點資料.注意"auth"資訊為原始的使用者名稱和密碼,而不是經過DigestAuthenticationProvider簽名之後的.如果使用了錯誤的授權資訊,可能導致"Authenticationisnotvalid:".