zookeeper 와 자바 가 실현 하 는 통일 적 인 설정 관리 와 클 러 스 터 노드 관리 간단 한 사례
zk 는 서비스 로 존재 하 며 세 개 또는 세 개 이상 존재 합 니 다.서비스 노드 의 시작 은 앞 뒤 를 가리 지 않 고 leader 와 follower 를 자동 으로 선택 합 니 다.
서비스 홀수 개 는 잘못 사용 하 는 데 유리 하고 데이터 일치 성 은 구 글 에서 paxos 알고리즘 을 사용 할 수 있다.
2. 그 다음은 저희 가 개발 한 응용 프로그램 app 입 니 다.
app 은 노드 트 리 로 zk 에 존재 합 니 다.맨 위 는 부모 노드 이 고 그 다음은 app 노드 입 니 다.(노드 통과 ZK api 구축, 노드 에 데 이 터 를 저장 하고 데 이 터 를 변경 할 수 있 습 니 다).
사례 1 (APP 클 러 스 터 의 통합 설정 관리)
package org.zookeeper;
import java.io.File;
import org.apache.log4j.PropertyConfigurator;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
public class AppServer {
private static String groupNode = "sgroup";
private String subNode = "sub";
ZooKeeper zk;
Stat stat = new Stat();
private void updateConfig() throws KeeperException, InterruptedException {
// getdata boolean watch, true,
System.out.println(zk.hashCode()+": current config is:"+new String(zk.getData("/" + groupNode, true, null)));
}
public void connectZookeeper(String address) throws Exception {
//zk
zk = new ZooKeeper("10.15.107.105:2181,10.15.107.42:2181,10.15.107.43:2181", 30*1000, new Watcher() {
public void process(WatchedEvent event) {
if( event.getType().equals(EventType.NodeDataChanged) ){
System.out.println("config is changed");
try {
updateConfig();
} catch (KeeperException | InterruptedException e) {
e.printStackTrace();
}
}
}
});
// "/sgroup"
// EPHEMERAL_SEQUENTIAL, ,
// server
Stat s = zk.exists("/" + groupNode, false);
if( s == null ){
zk.create("/" + groupNode, "".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
zk.setData("/" + groupNode, "origin config".getBytes(), -1);
}
String createdPath = zk.create("/" + groupNode + "/" + subNode,address.getBytes("utf-8"), Ids.OPEN_ACL_UNSAFE,
CreateMode.EPHEMERAL_SEQUENTIAL);
zk.getData("/" + groupNode, true,null);
System.out.println("create: " + createdPath);
}
/***
* 3 app 。 5 。3 app 。
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// log4j
File f = new File( "user.dir"+ File.separator + "log");
if( !f.exists() ){
f.mkdir();
new File("user.dir" + File.separator + "log"+ File.separator+"land.log");
}
PropertyConfigurator.configureAndWatch(File.separator+ System.getProperty("user.dir") + File.separator + "conf"+ File.separator + "log4j.properties");
String[] hosts = new String[] { "10.15.107.105", "10.15.107.42","10.15.107.43" };
for (int i = 0; i < hosts.length; ++i) {
final AppServer as = new AppServer();
as.connectZookeeper(hosts[i]);
if( i == 2){
new Thread(){
public void run(){
try {
for( int i=0;i<5;++i ){
System.out.println("config begin change");
as.zk.setData("/" + groupNode, (as.zk.hashCode()+" change id:"+Math.random()).getBytes(), -1);
Thread.sleep(3 * 1000);
}
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}
Thread.sleep(1 * 1000);
}
Thread.sleep(Long.MAX_VALUE);
}
}
사례 2 (APP 클 러 스 터 노드 에 대한 모니터링 관리 실현: APP 온라인 과 오프라인 은 실시 간 으로 모니터링 프로그램 에 알 릴 수 있다)
APP 서비스 사용 사례 1 의 프로그램, 모니터링 프로그램 코드 는 다음 과 같다.
package org.zookeeper;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.PropertyConfigurator;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
public class AppClient {
private String groupNode = "sgroup";
private ZooKeeper zk;
private Stat stat = new Stat();
private volatile List serverList;
/**
* zookeeper
*/
public void connectZookeeper() throws Exception {
zk = new ZooKeeper("10.15.107.105:2181,10.15.107.42:2181,10.15.107.43:2181",
30*1000, new Watcher() {
public void process(WatchedEvent event) {
// "/sgroup" , server ,
if (event.getType() == EventType.NodeChildrenChanged && ("/" + groupNode).equals(event.getPath())) {
try {
updateServerList();
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
updateServerList();
}
/**
* server
*/
private void updateServerList() throws Exception {
List newServerList = new ArrayList();
// groupNode
// watch true, .
// , , , ,
List subList = zk.getChildren("/" + groupNode, true);
for (String subNode : subList) {
// server
byte[] data = zk.getData("/" + groupNode + "/" + subNode, false,stat);
newServerList.add(new String(data, "utf-8"));
}
// server
serverList = newServerList;
System.out.println("current active server address: " + serverList);
}
public static void main(String[] args) throws Exception {
// log4j
File f = new File( "user.dir"+ File.separator + "log");
if( !f.exists() ){
f.mkdir();
new File("user.dir" + File.separator + "log"+ File.separator+"land.log");
}
PropertyConfigurator.configureAndWatch(File.separator+ System.getProperty("user.dir") + File.separator + "conf"+ File.separator + "log4j.properties");
AppClient ac = new AppClient();
ac.connectZookeeper();
Thread.sleep(Long.MAX_VALUE);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.