Zookeeper節點增刪改查與集羣搭建(筆記)

一、上傳文件目錄說明

上傳的文件通常放在 /home/node

安裝文件通常在 /usr/local/sql

2. 安裝zookeeper

2.1zookeeper-3.4.11.tar.gz拷貝到/home/

2.2解壓、重命名、移動

tar -xvzf zookeeper-3.4.11.tar.gzvim

mv zookeeper-3.4.11.tar.gz zookeeper服務器

mv zookeeper /usr/localsession

3. 配置環境變量

vim /etc/profile多線程

export ZOOKEEPER_HOME=/usr/local/zookeeper異步

export PATH=$PATH:$ZOOKEEPER_HOME/bin;maven

 

sourse /etc/profile //刷新文件分佈式

 

4. 目錄結構

bin:運行命令ide

conf:配置文件

contri:附加功能

dist-mavenmaven編譯後的目錄

docs:文檔

lib:依賴的jar

recipes:案例demo代碼

src:源碼

5. 啓動zookeeper

5.1修改conf/

cd /usr/local/zookeeper/conf/

cp zoo_sample.cfg zoo.cfg

zoo.cfg參數說明:tickTime(時間單元)initLimit(節點同步到master節點的鏈接時間)syncLimit(master節點與從節點發消息請求和應答時間)dataDir(必須配置)dataLogDir(日誌目錄)clientPort(鏈接服務器端口,默認2181)

5.2啓動

cd /usr/local/zookeeper/bin

啓動服務端:./zkServer.sh start

啓動客戶端:./zkCli.sh

 

6. Linux端命令

啓動客戶端以後:

help:查看zk命令

lsls  / (/表明根節點,/下的目錄表明子節點)

ls2ls  /+狀態信息(stat /)

getget  / 得到當前節點的數據

session:客戶端與服務端的會話、可設置超時時間、心跳結束session過時、session過時臨時節點znode被拋棄

心跳機制:客戶端向服務端的ping包請求,或者不刪、掛了才刪,從新鏈接後若是心跳機制未超時,臨時節點還存在

create /zkfk zkfk-data:建立一個zkfk目錄,zkfk-data節點

create -e /zkfk/temp zdfk-data temp目錄下建立一個zkfk-data臨時節點(-e)

create -s /zkfk/seq seq:建立sequence目錄,名稱自動增加(-s)

set /zkfk new-data 1:修改zkfk節點,zkfk-data -> new-data,版本號加11表明最新版本號

delete /zkfk/seq0000000005 1:刪除目錄,版本號爲1的目錄

watcher:監督每一個節點的操做,znode變化時觸發,觸發後當即銷燬,父子節點增刪改可以觸發

stat /zkfk/one watch:建立時觸發watch()

get /zkfk/one watchget時設置,當修改、刪除時觸發watch()

ls /zkfk watch:建立、刪除子節點時觸發watch()

get /zkfk/one watch:修改時觸發watch()

acl:權限控制,getAcl(獲取節點權限信息)setAcl(設置節點權限信息)addauth(輸入認證受權信息)

crdwacreate(建立子節點)readdelete(刪除子節點)wirteadmin(設置權限)

setAcl /zkfk/one world:anyone:crwa:設置權限,不能刪除

addauth digest fk:fk:添加用戶fk,密碼fk或登陸

setAcl /zkfk/one auth:fk:fk:cdrwa:經過認證信息設置權限

setAcl /zkfk/one digest:fk:xJ0PRXcE29ROsbH4WtFbbjYdsP8=:cdrwa:經過認證信息設置權限

setAcl /zkfk/ip ip:192.168.1.103:cdrwa:經過ip設置權限

超級管理員權限:

vim zkServer.sh修改以下

 

重啓服務

 

四字命令:是有自身的簡短命令與服務器進行交互(先:yum install nc )

echo stat | nc localhost 2181:查看當前ip端口stat信息

echo ruok | nc localhost 2181:查看當前ip端口zk是否啓動

echo dump | nc localhost 2181:查看當前ip端口未經處理的會話和臨時節點

echo conf | nc localhost 2181:查看當前ip端口服務器配置信息

echo confs| nc localhost 2181:查看當前ip端口鏈接到服務器的客戶端信息

echo envi| nc localhost 2181:查看當前ip端口環境變量

mntr:健康信息

wchswatch信息

4lw.commands.whitelist=*:開啓全部四字命令,修改zookeeper/conf/zoo.cfg文件,加載最後一行,重啓

wchcwatch節點

wchpwatch路徑

 

7. 集羣

7.1選舉模式:

master節點down機器,子節點會競爭,有一個子節點成爲master節點,若開始的master節點恢復,則成爲子節點

7.2僞分佈式集羣搭建

  1. zookeeper/conf/zoo.cfg中添加:

server.1=192.168.107.128:2888:3888

server.2=192.168.107.128:2889:3889

server.3=192.168.107.128:2890:3890

說明:2888端口(集羣中同步數據的端口)3888端口(選舉模式下選舉端口)

  1. 修改1中的dataDir=/usr/local/zookeeper/dataDir,並在對應目錄下建立myid文件
  2. zookeeper文件複製兩份,命名:zookeeper02zookeeper03

cp zookeeper zookeeper02 -rf

cp zookeeper zookeeper03 -rf

  1. 修改zookeeper02zookeeper03中重複2步驟:並將dataDir改成本身目錄、改clientPort
  2. 啓動三個zookeeper的服務端:./zkServer.sh start
  3. 客戶端鏈接服務端:./zkCli.sh -server localhost:2181 更改節點,在鏈接其餘服務端,可查看到節點已經更改 即:同步。

7.3真分佈式集羣搭建

一、準備三臺服務器,爲了區分zookeeper,分別命名爲:zookeeperzookeeper_c01zookeeper_c02ip分別爲:

CeantOS64(zookeeper)192.168.107.128

CeantOS64_clon01(zookeeper_c01)192.168.107.130

CeantOS64_clon02(zookeeper_c02)192.168.107.131

 

 

二、分別在三臺服務氣的 zookeeper/conf/zoo.cfg中添加:

server.1=192.168.107.128:2888:3888

server.2=192.168.107.130:2888:3888

server.3=192.168.107.131:2888:3888

其中clientPort都設置爲2181dataDir改成各自的目錄,分別在各自dataDir對應的目錄下建立myid文件夾,值分別爲123

三、啓動三臺zookeeper服務,並客戶端鏈接,在任意服務器建立、修改刪除zNode都會同步到其餘機器

四、查看主從節點:./zkServer.sh status

8.Java客戶端鏈接zookeeper服務

8.1會話重連:

/**

*鏈接服務端

*@param zkServerPathzk服務端地址端口,例如192.168.1.1:2181

*@param timeout:超時時間,例如5s5000

*@param ZKConnectSessionWatcherwatcher

**/

Zookeeper zk = new Zookeeper(zkServerPath,timeout,new ZKConnectSessionWatcher());

 

/**

*會話重連(根據sessionIdsessionPasswod

*前三個參數同上

*@param sessionIdzk.getSessionId()

*@param sessionPasswdzk.getSessionpasswd()

**/

Zookeeper zk = new Zookeeper(connectZkPath,timeout,ZKConnectSessionWatcher(),

sessionId,sessionPasswd);

8.2建立節點

/**

*同步方式建立節點

*@param path:節點路徑

*@param data:節點數據byte[]

*@param cals:權限, Ids.屬性

*@param CreateModeCreateMode.屬性(臨時節點、持久節點、順序節點)

**/

zk.create(path,data,acls,CreateMode.EPHEMERAL);

 

/**

*異步方式建立節點

*前四個參數與上面同樣

*@param new CreateCallBack():回調函數

*@param ctx:建立節點後作的一些操做,如:返回信息({‘create’:’success’}」)、執行sql、消 息隊列發送消息等

**/

zk.create(path,data,acls,CreateMode.PERSISTENT,new CreateCallBack(),ctx);

8.3修改節點

/**

*@param path :節點路徑,如:/node

*@param data :節點數據byte[],如:」nodeData」.getBytes()

*@param version :版本號(至關於樂觀鎖,get /  後顯示的dataVersion

* @return Stat :執行以後顯示的信息,與get / 返回的信息一致

**/

Stat status = zk.setData(path,data,version);

異步與8.2相似

8.4刪除節點

/**

*@param path :節點路徑

*@param version : 版本號(至關於樂觀鎖,get /  後顯示的dataVersion

**/

zk.delete(path,version);

異步與8.2相似,同步方式無返回值,建議使用異步方式

 

8.5CountDownLatch

CountDownLatch:計數器、用於多線程(可暫停、繼續)

.await():阻塞當前線程

.countDown():減1,當countDown的值爲0時,await()纔不阻塞

檢查集羣中各個中間件是否正常:正常,則啓動,不正常,啓動不了

8.6節點查詢

State state = new State();

CountDownLatch countDown = new CountDownLatch (1);

 

/**

*@param path:節點路徑

*@param b:是否註冊watch事件

*@ state:狀態,get /path 得到的信息

*@return bytes[]:節點值

**/

byte[] bytes = zk.getZookeeper().getData(String path,boolean b,State state);//異步方式參考8.2

countDown.await();//掛起線程不運行,直到countDown值爲0,線程纔開始運行

 

/**

*獲取事件的監聽方法

*EventType.屬性:建立、刪除、修改、修改子節點

**/

@override

public void process(WatchEvent event){

try{

if(event.getType == EventType.屬性){

...

count.countDown();

}

}catch(...){

...

}

}

 

8.7子節點查詢

查詢父節點下的子節點

 

/**

*同步

*@param path:節點路徑

*@param watch:是否開啓watcher

*@return childList:子節點列表

**/

List<String> childList = zkServer.getZookeeper().getChildren(String path,boolean watch);

8.6重寫process方法

 

/**

*異步

*@前兩個參數同上

*@param new ChildrenCallBack():類實現了ChildrenCallBack接口或者Children2CallBack(),重*processResult()

*@return ctx:查詢成功返回值

**/

List<String> childList = zkServer.getZookeeper().getChildren(String path,boolean watch,

new ChildrenCallBack(),Object ctx);

 

8.8判斷節點是否存在

Stat stat = zk.getZookeeper().exist(String path,boolean watch);//與上面同樣

stat==null?xx:xxx;

異步與上面同樣

 

8.9自定義用戶權限

List<ACL> acls = new ArrayList<ACL>();

Id id1 = new Id(「digest」,DigestAuthenticationProvider.generateDigest(id1:123456));//定義用戶

Id id2 = new Id(「digest」,DigestAuthenticationProvider.generateDigest(id2:123456));user:pwd

acls.add(new ACL(Perms.ALL,id1));//用戶設置權限

acls.add(new ACL(Perms.READ,id2));

acls.add(new ACL(Perms.DELETE | Perms.CREATE,id2));//用戶設置多個權限

zk.createZKNode(String path,byte[] b,acls);//目錄添加用戶權限

//用戶必須addAuthInfo後才能操做節點

zk.getZookeeper().addAuthInfo(「digest」,」id2:123456」.getBytes());//參數:schema,用戶名:密碼

zk.createZKNode(path/子節點,byte[] b,Ids.屬性);//在添加自定義用戶權限的節點下添加子節點

 

8.10 ip權限

List<ACL> aclsIp = new ArrayList<ACL>();

Id idIp = new Id(「ip」,」192.168.1.1」);//定義ip用戶

aclsIp.add(new ACL(Perms.ALL,idIp));//ip用戶添加權限

zk.createZKNode(String path,byte[] b,aclsIp);

//當前ip必須是定義的權限ip才能操做(即:ip192.168.1.1的機器才能對節點操做)

zk.getZookeeper().setData(String path,byte[] b,int version);

相關文章
相關標籤/搜索