1. 程式人生 > >Zookeeper學習之叢集搭、簡單命令、javaAPI

Zookeeper學習之叢集搭、簡單命令、javaAPI

Zookeeper是開源的、分散式的協調服務框架。是Apache Hadoop的子件,適用於絕大部分的分散式叢集的管理。
分散式引發的問題:
1.死鎖:至少有一個執行緒佔用資源,但是不佔用CPU
2.活鎖:所有的執行緒都沒有佔用資源,但是執行緒卻是在不斷的排程佔用資源
3.需要引入一個管理節點
4.為了防止入口的單點問題,需要引入管理節點的叢集
5.需要在管理節點中選出一個子節點
6.需要確定一套管理演算法
7.主節點和從節點之間要保持資料的一致性
Zookeeper的單機版安裝
在這裡插入圖片描述
JAVA api
public class ZooKeeperDemo01 {

private ZooKeeper zk;
@Before
public void connect() throws IOException, InterruptedException{
	CountDownLatch cdl = new CountDownLatch(1);
	// connectString - 連線地址+埠號
	// sessionTimeout - 會話超時時間 - 表示連線超時時間,單位預設為毫秒
	// watcher - 監控者 - 監控連線狀態
	// Zookeeper本身是一個非阻塞式連線
	zk = new ZooKeeper("10.10.10.10:2181", 5000, new Watcher() {
		// 監控連線狀態
		public void process(WatchedEvent event) {

			if (event.getState() == KeeperState.SyncConnected) {
				System.out.println("連線成功~~~");
				cdl.countDown();
			}
			
		}
	});
	cdl.await();
}

@Test //建立一個節點
public void create () throws KeeperException, InterruptedException{
	// path - 節點路徑
	// data - 資料
	// acl - acl策略
	// createMode - 節點型別
	// 返回值表示節點的實際路徑
	String str = zk.create
			("/node06", "hello world".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
	System.out.println(str);
}
@Test  //刪除一個節點
public void delete() throws InterruptedException, KeeperException {
	// path - 節點路徑
	// version - 資料版本
	// 在刪除節點的時候回比較指定的資料版本和節點的實際資料版本是否一致
	// 如果一致則刪除,如果不一致則放棄該操作
	// zk.delete("/node04", 0);
	// -1表示強制執行
	zk.delete("/node04", -1);
}
@Test  //修改一個節點內容
public void set() throws KeeperException, InterruptedException {
	Stat s = zk.setData("/node01", "你好".getBytes(), -1);
	System.out.println(s);
}
@Test  //獲取節點內容
public void get() throws KeeperException, InterruptedException, UnsupportedEncodingException {
	//path -- 節點路徑
	//watch - 監控
	//stat - 節點資訊
	Stat s = new Stat();
	byte[] data = zk.getData("/node01", null, s);
	System.out.println(new String(data,"utf-8"));
}
//判斷節點是否存在
@Test
public void exist() throws KeeperException, InterruptedException {
	//path - 節點路徑
	//watch - 監控者
	//返回的節點的資訊
	Stat s = zk.exists("/node06", null);
	System.out.println(s);
}
//獲取子節點
@Test
public void getChildren() throws KeeperException, InterruptedException {
	//path
	//watch
	//返回子節點的路徑
	List<String> nodes = zk.getChildren("/", null);
	for (String str : nodes) {
		System.out.println(str);
	}
}

}