## 一、Zookeeper基礎知識、體系結構、數據模型Zookeepr
1. zookeeper是一個類似hdfs的樹形文件結構,zookeeper可以用來保證數據在(zk)集
群之間的數據的事務性一致、
2. zookeeper有watch事件,是一次性觸發的,當watch監視的數據發生變化時,通
知設置了該watch的client,即watcher
3. zookeeper有三個角色:Learner,Follower,Observer
4. zookeeper應用場景:
統一命名服務(Name Service)
配置管理(Configuration Management)
集群管理(Group Membership)
共享鎖(Locks)
隊列管理
## 二、Zookeeper配置(搭建zookeeper服務器集群)
1. 結構:一共三個節點 (zk服務器集群規模不小于3個節點),要求服務器之間系統時間保持一致。
2.上傳zk
進行解壓: tar zookeeper-3.4.5.tar.gz
重命名: mv zookeeper-3.4.5 zookeeper
修改環境變量: vi /etc/profile
3.ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=.:$HADOOP_HOME/bin:$ZOOKEEPER_HOME/bin:$JAVA_HOME/...
刷新: source /etc/profile
到zookeeper下修改配置文件
cd /usr/local/zookeeper/conf
mv zoo_sample.cfg zoo.cfg
修改conf: vi zoo.cfg 修改兩處
(1)dataDir=/usr/local/zookeeper/data
(2)最后面添加
server.0=wuliang:2888:3888
server.1=hadoop1:2888:3888
server.2=hadoop2:2888:3888
服務器標識配置:
創建文件夾:mkdir data
創建文件myid并填寫內容為0:vi
myid (內容為服務器標識 : 0)
進行復制zookeeper目錄到hadoop01和hadoop02
還有/etc/profile文件
把hadoop01、hadoop02中的myid文件里的值修改為1和2
路徑(vi /usr/local/zookeeper/data/myid)
啟動zookeeper:
路徑:/usr/local/zookeeper/bin
執行:zkServer.sh start
(注意這里3臺機器都要進行啟動)
狀態:zkServer.sh
status(在三個節點上檢驗zk的mode,一個leader和倆個follower)
1.3 操作zookeeper (shell)
zkCli.sh 進入zookeeper客戶端
根據提示命令進行操作:
查找:ls / ls /zookeeper
創建并賦值:create /wuliang hadoop
獲取:get /wuliang
設值:set /wuliang master
可以看到zookeeper集群的數據一致性
創建節點有倆種類型:短暫(ephemeral)
持久(persistent)
## 三、zoo.cfg詳解:
tickTime: 基本事件單元,以毫秒為單位。這個時間是作為 Zookeeper
服務器之間或客戶端與服務器之間維持心跳的時間間隔,
也就是每隔 tickTime時間就會發送一個心跳。
dataDir:存儲內存中數據庫快照的位置,顧名思義就是 Zookeeper
保存數據的目錄,默認情況下,Zookeeper
將寫數據的日志文件也保存在這個目錄里。
clientPort: 這個端口就是客戶端連接 Zookeeper 服務器的端口,Zookeeper
會監聽這個端口,接受客戶端的訪問請求。
initLimit: 這個配置項是用來配置 Zookeeper接受客戶端初始化連接時最長能忍受多少個心跳時間間隔數,
當已經超過 10 個心跳的時間(也就是 tickTime)長度后
Zookeeper 服務器還沒有收到客戶端的返回信息,那么表明這個客戶端連接失敗。總的時間長度就是10*2000=20 秒。
syncLimit: 這個配置項標識 Leader 與 Follower之間發送消息,請求和應答時間長度,最長不能超過多少個 tickTime
的時間長度,總的時間長度就是 5*2000=10 秒
server.A = B:C:D :
A表示這個是第幾號服務器,
B 是這個服務器的 ip 地址;
C 表示的是這個服務器與集群中的 Leader
服務器交換信息的端口;
D 表示的是萬一集群中的 Leader
服務器掛了,需要一個端口來重新進行選舉,選出一個新的 Leader
## 四、JAVA 怎么操作zookeeper
zk的構造器的參數詳解
String connectString 連接服務器列表,已,分割
int sessionTimeout 心跳檢測時間周期 (毫秒)
Watcher watcher 事件處理通知
canBeReadOnly 標識當前會話是否支持只讀
long sessionId sessionPasswd 提供連接zookeeper的sessionId 和密碼,通過這兩個確定唯一一臺客戶端, 目前可以提供重復會話
/** zookeeper地址 */
static final String CONNECT_ADDR = "192.168.80.88:2181,192.168.80.87:2181,192.168.80.86:2181";
/** session超時時間 */
static final int SESSION_OUTTIME = 2000;//ms
/** 信號量,阻塞程序執行,用于等待zookeeper連接成功,發送成功信號 */
static final CountDownLatch connectedSemaphore = new CountDownLatch(1);
public static void main(String[] args) throws Exception{
ZooKeeper zk = new ZooKeeper(CONNECT_ADDR, SESSION_OUTTIME, new Watcher(){
@Override
public void process(WatchedEvent event) {
//獲取事件的狀態
KeeperState keeperState = event.getState();
EventType eventType = event.getType();
//如果是建立連
if(KeeperState.SyncConnected == keeperState){
if(EventType.None == eventType){
//如果建立連接成功,則發送信號量,讓后續阻塞程序向下執行
connectedSemaphore.countDown();
System.out.println("zk 建立連接");
}
}
}
});
//進行阻塞
connectedSemaphore.await();
System.out.println("..");
## 五、創建節點
### 第一個create的介紹
zk.create("/testRoot", "testRoot".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
第一個參數: 路徑的問題
第二個參數: 數據
第三個參數: 認證的方式
第四個參數: 創建節點的持久化
關閉連接 zk.close();
總結
1.不能創建相同的的節點
2.如果在某個父節點下面創建某個子節點 要寫全路徑
3.臨時節點 一次會話
## 怎么獲取、更新、判斷上面的節點zk上面節點的數據
//獲取節點洗信息
byte[] data = zk.getData("/testRoot", false, null);
System.out.println(new String(data));
//獲取該路徑下面的所有子節點(直接子節點)
System.out.println(zk.getChildren("/testRoot", false));
byte[] data = zk.getData("/testRoot", false, null);
zk.getChildren("/testRoot", false)
//修改節點的值
zk.setData("/testRoot", "modify data root".getBytes(), -1);
byte[] data = zk.getData("/testRoot", false, null);
//判斷節點是否存在
System.out.println(zk.exists("/testRoot/children", false));
### 第二個delete的方法
//刪除節點
-1 表示全部刪除
zk.delete("/testRoot/children", -1);
## 總結:
### ## zookpeer分布式鎖的呢
第一可以采用zk的臨時節點,先讀取該臨時節點上有沒有數據,
如果有沒有則創建,如果有則更新。
注意:
原生的zk不允許遞歸創建節點,也支持節點遞歸的刪除
## 六、同步和異步
異步方式:(在同步參數的基礎上添加兩個參數)
參數五:注冊一個異步回調函數,要實現AsyncCallBackStringCallBack接口,重寫
processResult(int rc,String path,Object ctx,String name)方法,當節點創建完畢
后執行此方法。
rc:為服務端響應嗎 0 表示調用成功,-4 表示端口連接,-110表示指定節點存在,-112
表示會話已經過期。
path:接口調用時傳入API的數據節點的路徑參數
ctx:為調用接口傳入API的ctx值
name:實際在服務器端創建節點的名稱
參數六,傳遞給回調的從參數,一般為上下文(context)信息