搭建zookeeper集羣,docker-compose.yml文件內容如下
version: '3.1'
services:
zoo1:
image: zookeeper
restart: always
hostname: zoo1
ports:
- 2181:2181
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
zoo2:
image: zookeeper
restart: always
hostname: zoo2
ports:
- 2182:2181
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zoo3:2888:3888;2181
zoo3:
image: zookeeper
restart: always
hostname: zoo3
ports:
- 2183:2181
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181
networks:
default:
external:
name: zookeeper_cluster2
可以使用java代碼鏈接到zookeeper集羣,進行節點數據的增刪改操作,代碼如下:
引入依賴:implementation 'org.apache.zookeeper:zookeeper:3.4.0'
//連接
CountDownLatch connectedSignal = new CountDownLatch(1);
ZooKeeper zoo;
zoo = new ZooKeeper("127.0.0.1:2182", 5000, new Watcher() {
@Override
public void process(WatchedEvent we) {
if (we.getState() == Event.KeeperState.SyncConnected){
connectedSignal.countDown();
}
}
});
connectedSignal.await();
//判斷節點是否存在
// znode path
String path = "/MyFirstZnode4"; // Assign path to znode
// data in byte array
byte[] data = "My first zookeeper app".getBytes(); // Declare data
Stat stat = zoo.exists(path, true);
//讀取數據
if (stat != null){
System.out.println("Node exists and the node version is " +
stat.getVersion());
final CountDownLatch readedSignal = new CountDownLatch(1);
byte[] b = zoo.getData(path, new Watcher() {
@Override
public void process(WatchedEvent we) {
if (we.getType() == Event.EventType.None) {
switch(we.getState()) {
case Expired:
readedSignal.countDown();
break;
}
} else {
try {
byte[] bn = zoo.getData(path,
false, null);
String data = new String(bn,
"UTF-8");
System.out.println(data);
readedSignal.countDown();
} catch(Exception ex) {
System.out.println(ex.getMessage());
}
}
}
}, null);
String data2 = new String(b, "UTF-8");
System.out.println(data2);
//修改數據
zoo.setData(path, Long.toString(System.currentTimeMillis()).getBytes(), stat.getVersion());
readedSignal.await();
//創建節點
}else {
zoo.create(path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
zoo.close();
參考資料: