文章目錄
第一章 入夢
概述
Zookeeper是一個開源的分佈式的,爲分佈式應用提供協調服務的Apache項目。
特點
數據結構
應用場景
提供的服務包括:統一命名服務、統一配置管理、統一集羣管理、服務器節點動態上下線、軟負載均衡等。
分佈式安裝部署
- 集羣規劃,—— 在大數據欄裏
分佈式安裝
- 解壓安裝等,與hadoop 一樣
- 採用xsync.sh 同步文件
配置服務器編號
- 在軟件目錄下,創建zkData
- 在目錄下,創建myid文件並編輯
編號 如 234
- 拷貝文件到其他服務器上
配置zoo.cfg文件
- 先重命名zoo_sample.cfg-》zoo.cfg
- 編輯
dataDir=/opt/module/zookeeper-3.4.10/zkData 記得編號對應 #######################cluster########################## server.2=hadoop100:2888:3888 server.3=hadoop101:2888:3888 server.4=hadoop102:2888:3888
- 配置參數解讀
A是一個數字,表示這個是第幾號服務器;
集羣模式下配置一個文件myid,這個文件在dataDir目錄下,這個文件裏面有一個數據就是A的值,Zookeeper啓動時讀取此文件,拿到裏面的數據與zoo.cfg裏面的配置信息比較從而判斷到底是哪個server。
B是這個服務器的ip地址;
C是這個服務器與集羣中的Leader服務器交換信息的端口;
D是萬一集羣中的Leader服務器掛了,需要一個端口來重新進行選舉,選出一個新的Leader,而這個端口就是用來執行選舉時服務器相互通信的端口。
- 啓動集羣,是各個分別啓動的
bin/zkServer.sh start
(可以寫腳本,各個啓動)
客戶端命令行操作
命令基本語法 | 功能描述 |
---|---|
help | 顯示所有操作命令 |
ls path [watch] | 使用 ls 命令來查看當前znode中所包含的內容 |
ls2 path [watch] | 查看當前節點數據並能看到更新次數等數據 |
create | 普通創建 -s 含有序列 -e 臨時(重啓或者超時消失) |
get path [watch] | 獲得節點的值 |
set | 設置節點的具體值 |
stat | 查看節點狀態 |
delete | 刪除節點 |
rmr | 遞歸刪除節點 |
API 應用
環境搭建
<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>
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<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=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
下面是代碼
package com.study.zookeeper;
import org.apache.zookeeper.*;
import java.io.IOException;
/**
* Created by IntelliJ IDEA.
*
* @author : Firewine
* @version : 1.0
* @Program Name: DistributeServer
* @Create : 2020/2/13
* @Description :
*/
public class DistributeServer {
public static void main(String[] args) throws Exception {
DistributeServer server = new DistributeServer();
// 1 連接zookeeper集羣
server.getConnect();
System.out.println(args[0]);
// 2 註冊節點
server.regist(args[0]);
// 3 業務邏輯處理
server.business();
}
private void business() throws InterruptedException {
Thread.sleep(Long.MAX_VALUE);
}
private void regist(String hostname) throws KeeperException, InterruptedException {
String path = zkClient.create("/servers/server", hostname.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
System.out.println(hostname +"is online ");
}
private String connectString="192.168.11.100:2181,192.168.11.101:2181,192.168.11.102:2181";
private int sessionTimeout = 2000;
private ZooKeeper zkClient;
private void getConnect() throws IOException {
zkClient = new ZooKeeper(connectString , sessionTimeout , new Watcher() {
@Override
public void process(WatchedEvent event) {
}
});
}
}
客戶端
package com.study.zookeeper;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* Created by IntelliJ IDEA.
*
* @author : Firewine
* @version : 1.0
* @Program Name: DistributeClient
* @Create : 2020/2/13
* @Description :
*/
public class DistributeClient {
public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
DistributeClient client = new DistributeClient();
// 1 獲取zookeeper集羣連接
client.getConnect();
// 2 註冊監聽
client.getChlidren();
// 3 業務邏輯處理
client.business();
}
private void business() throws InterruptedException {
Thread.sleep(Long.MAX_VALUE);
}
private void getChlidren() throws KeeperException, InterruptedException {
List<String> children = zkClient.getChildren("/servers", true);
// 存儲服務器節點主機名稱集合
ArrayList<String> hosts = new ArrayList<>();
for (String child : children) {
byte[] data = zkClient.getData("/servers/"+child, false, null);
hosts.add(new String(data));
}
// 將所有在線主機名稱打印到控制檯
System.out.println(hosts);
}
private String connectString="192.168.11.100:2181,192.168.11.101:2181,192.168.11.102:2181";
private int sessionTimeout = 2000;
private ZooKeeper zkClient;
private void getConnect() throws IOException {
zkClient = new ZooKeeper(connectString , sessionTimeout , new Watcher() {
@Override
public void process(WatchedEvent event) {
try {
getChlidren();
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
期間注意問題:
- 注意客戶端與服務器的版本的不一致的問題,
- 注意代碼邏輯,是否服務器有父節點
- 運行出錯,有可能是報的其他博客說的版本不一樣,但是有可能是你的代碼問題,