zookeeper 와 자바 가 실현 하 는 통일 적 인 설정 관리 와 클 러 스 터 노드 관리 간단 한 사례

6058 단어
1. 먼저 zookeeper 에 대한 인식 을 이야기 하고 다음은 zk 라 고 약칭 한다.
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);
}
}

좋은 웹페이지 즐겨찾기