Zookeeper學習記錄

Zookeeper學習記錄

環境安裝

概述

開源的分佈式的,爲分佈式應用提供協調服務的Apache項目

特點

基於觀察者模式設計的分佈式服務管理框架,負責存儲和管理大家都關心的數據,然後接受觀察者的註冊,一旦發現這些數據狀態發生變化,Zookeeper將負責通知在Zookeeper上註冊的觀察者

下載

官方網址

下載地址

部署

  • 解壓到目錄
tar -zvxf zookeeper-3.4.10.tar.gz

文件配置

  • zoo.cfg文件
dataDir={#dir}

啓動/關閉服務端

sh ./bin/zkServer.sh start

sh ./bin/kServer.sh stop

啓動客戶端

sh ./bin/zkCli.sh

配置文件解釋

tickTime=心跳時間(毫秒)
initLimit=初始化通信時限(心跳幀)
syncLimit=同步通信時限(心跳幀)
dataDir=數據目錄
clientPort=客戶端連接端口號

集羣部署(最少三臺)

  • 在數據目錄創建myid裏面寫上數字
  • zoo.cfg配置文件中添加集羣配置
###cluster###
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
  • 注意:如果hosts中配置的host不生效,改成IP則集羣成功啓動

get命令獲取stat內容說明

Stat結構體 解釋
czxid 創建節點的事務zxid
ctime znode被創建的毫秒數(從1970年開始)
mZxid znode最後更新的事務zxid
mtime 最後修改的毫秒數(從1970年開始)
pZxid 最後更新的子節點zxid
cversion znode子節點變化號,znode子節點修改次數
dataVersion znode數據變化號
aclVersion znode訪問控制列表的變化號
ephemeralOwner 如果是臨時節點,這個是znode擁有者的session id。如果不是臨時節點則是0。
dataLength znode的數據長度
numChildren znode子節點數量

開發

引用jar包

<dependencies>
    <dependency>
    	<groupId>junit</groupId>
    	<artifactId>junit</artifactId>
    	<version>RELEASE</version>
    </dependency>
    <dependency>
    	<groupId>org.apache.logging.log4j</groupId>
    	<artifactId>log4j-core</artifactId>
    	<version>2.8.2</version>
    </dependency>
    <dependency>
    	<groupId>org.apache.zookeeper</groupId>
    	<artifactId>zookeeper</artifactId>
    	<version>3.4.10</version>
    </dependency>
</dependencies>

log4j.properties文件(常用)

log4j.rootLogger=INFO, stdout  
log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n  
log4j.appender.logfile=org.apache.log4j.FileAppender  
log4j.appender.logfile.File=log/zookeeper.log  
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout  
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n  

初始化連接代碼

  • 代碼
//    連接服務器
private String connect = "192.168.0.101:2181,192.168.0.102:2181,192.168.0.103:2181";
//    超時時間
private int timeout = 2000;
//    監聽client
private ZooKeeper zkClient;

@Before //保證此方法先執行
@Test
public void init() throws IOException {
    zkClient = new ZooKeeper(connect, timeout, new Watcher() {
        public void process(WatchedEvent watchedEvent) {
            //監聽方法
        }
    });
}
  • 輸出
2020-02-24 19:21:49,011 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:zookeeper.version=3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
  2020-02-24 19:21:49,011 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:host.name=xxxx
  2020-02-24 19:21:49,011 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:java.version=1.8.0_31
  2020-02-24 19:21:49,011 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:java.vendor=Oracle Corporation
  2020-02-24 19:21:49,011 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:java.home=C:\Program Files\Java\jdk1.8.0_31\jre
  2020-02-24 19:21:49,011 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:java.class.path=D:\softload\IntelliJ IDEA 2019.2.4\lib\idea_rt.jar;D:\softload\IntelliJ IDEA 2019.2.4\plugins\junit\lib\junit5-rt.jar;D:\softload\IntelliJ IDEA 2019.2.4\plugins\junit\lib\junit-rt.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\rt.jar;G:\CODE\JAVA\zookeeper_Test01\target\classes;C:\Users\12154\.m2\repository\junit\junit\4.13\junit-4.13.jar;C:\Users\12154\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\12154\.m2\repository\org\apache\logging\log4j\log4j-core\2.8.2\log4j-core-2.8.2.jar;C:\Users\12154\.m2\repository\org\apache\logging\log4j\log4j-api\2.8.2\log4j-api-2.8.2.jar;C:\Users\12154\.m2\repository\org\apache\zookeeper\zookeeper\3.4.10\zookeeper-3.4.10.jar;C:\Users\12154\.m2\repository\org\slf4j\slf4j-api\1.6.1\slf4j-api-1.6.1.jar;C:\Users\12154\.m2\repository\org\slf4j\slf4j-log4j12\1.6.1\slf4j-log4j12-1.6.1.jar;C:\Users\12154\.m2\repository\log4j\log4j\1.2.16\log4j-1.2.16.jar;C:\Users\12154\.m2\repository\jline\jline\0.9.94\jline-0.9.94.jar;C:\Users\12154\.m2\repository\io\netty\netty\3.10.5.Final\netty-3.10.5.Final.jar;D:\softload\IntelliJ IDEA 2019.2.4\lib\idea_rt.jar
  2020-02-24 19:21:49,011 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:java.library.path=C:\Program Files\Java\jdk1.8.0_31\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;D:\softload\xftp\;D:\softload\xshell6\;D:\softload\python2.7\;D:\softload\python2.7\Scripts;C:\ProgramData\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\Java\jdk1.8.0_31\bin;C:\Program Files\Java\jdk1.8.0_31\jre\bin;D:\softload\Git\cmd;D:\softload\node\;D:\softload\WinSCP\;C:\Program Files (x86)\GtkSharp\2.12\bin;D:\softload\hadoop-2.7.2\bin;C:\Cocos\frameworks\cocos2d-x-3.9\tools\cocos2d-console\bin;D:\softload\cocos2d-x-3.17.1\templates;D:\softload\python\Scripts\;D:\softload\python\;C:\Users\12154\AppData\Local\Microsoft\WindowsApps;C:\Users\12154\AppData\Local\atom\bin;C:\Users\12154\AppData\Roaming\npm;C:\Cocos\tools\Python27;C:\Users\12154\AppData\Local\Microsoft\WindowsApps;;.
  2020-02-24 19:21:49,011 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:java.io.tmpdir=C:\Users\12154\AppData\Local\Temp\
  2020-02-24 19:21:49,011 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:java.compiler=<NA>
  2020-02-24 19:21:49,011 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:os.name=Windows 8.1
  2020-02-24 19:21:49,011 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:os.arch=amd64
  2020-02-24 19:21:49,011 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:os.version=6.3
  2020-02-24 19:21:49,011 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:user.name=12154
  2020-02-24 19:21:49,011 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:user.home=C:\Users\12154
  2020-02-24 19:21:49,011 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:user.dir=G:\CODE\JAVA\zookeeper_Test01
  2020-02-24 19:21:49,013 INFO [org.apache.zookeeper.ZooKeeper] - Initiating client connection, connectString=192.168.0.101:2181,192.168.0.102:2181,192.168.0.103:2181 sessionTimeout=2000 watcher=Test01$1@46f5f779
  2020-02-24 19:21:49,060 INFO [org.apache.zookeeper.ZooKeeper] - Initiating client connection, connectString=192.168.0.101:2181,192.168.0.102:2181,192.168.0.103:2181 sessionTimeout=2000 watcher=Test01$1@11531931

創建節點

  • 代碼
@Test
public void createNode() throws KeeperException, InterruptedException {
    String path = zkClient.create("/zzqq", "xxxxx".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    System.out.println(path);
}
  • 輸出
能打印出創建的節點內容

監控節點

  • 需要保持長連接

  • 代碼

    • 測試用例
@Test
public void getDataAndWatch() throws KeeperException, InterruptedException {
    Thread.sleep(Long.MAX_VALUE);
}
    • init中添加process的處理邏輯,打印變更信息
List<String> children = null;
try {
    children = zkClient.getChildren("/", true);
} catch (KeeperException e) {
    e.printStackTrace();
} catch (InterruptedException e) {
    e.printStackTrace();
}

System.out.println(">>>>>start<<<<<<");
for (String child: children) {
    System.out.println(child);
}
System.out.println(">>>>>end<<<<<<");

其它

選舉機制

  • 半數投票
  • 優先選自己,若沒有成爲leader則選舉後面服務器

最低集羣

  • 三臺服務器
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章