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則選舉後面服務器
最低集羣
- 三臺服務器