Zookeeper知識要點與集羣安裝,歡迎糾錯

Zookeeper

什麼是zookeeper?原理?

分佈式協調服務,底層基於ZAB協議(原子消息廣播),保證各服務之間同步;
由Leader、Follower、Observer組成。
維護有層次的數據結構;數據一般存儲在內存中;數據讀取性能高;(JMeter壓測讀取性能最高可達12-13w)
leader負責統一接收客戶端數據,廣播給Follower處理;各個請求之間是順序的;
各個Follower之間數據是一致的;
Observer負責監控Leader與Follower;
創建集羣服務時,zookeeper服務官方推薦爲奇數個,比如3個,5個等;

ZAB:支持崩潰恢復的原子廣播協議,爲分佈式主備系統設計的;

崩潰恢復機制:
	Leader掛了,則升級ZXID最大的Follower爲Leader,選取後其他Follower向新的leader同步狀態後,新的leader才處理客戶端請求。
消息廣播:
	1.客戶端提交數據,Leader接收,生成事務(含事務id,zxid等)
	2.leader生成事務隊列提交事務給各個Follower,Follower接收寫入事務日誌待處理;
	3.各個Follower向Leader作出ACK迴應;
	4.Leader確保收到半數以上回應後,向Follower發出Commit指令提交事務;
	5.響應客戶端

ZAB底層基於cas算法,cas是基於paxos算法;
paxos算法:一致性狀態;隨機算法;

ZK應用

  • 配置管理
    (要求:數據量小;
    運行時數據動態變化;
    集羣中各個節點共享信息,配置一直)

程序分佈式的部署在不同的機器上,將程序的配置信息放在zk的znode下,當有配置發生改變時,也就是znode發生變化時,可以通過改變zk中某個目錄節點的內容,利用watcher通知給各個客戶端,從而更改配置。

  • 數據庫切換

  • 命名服務

命名服務是指通過指定的名字來獲取資源或者服務的地址,利用zk創建一個全局的路徑,即是唯一的路徑,這個路徑就可以作爲一個名字,指向集羣中的集羣,提供的服務的地址,或者一個遠程的

  • 發佈與訂閱(eg:zk+rocketmq)
  • 分佈式鎖/分佈式隊列管理

有了zookeeper的一致性文件系統,鎖的問題變得容易。鎖服務可以分爲兩類,一個是保持獨佔,另一個是控制時序。對於第一類,我們將zookeeper上的一個znode看作是一把鎖,通過createznode的方式來實現。所有客戶端都去創建/distribute_lock節點,最終成功創建的那個客戶端也即擁有了這把鎖。用完刪除掉自己創建的distribute_lock節點就釋放出鎖。
對於第二類,/distribute_lock已經預先存在,所有客戶端在它下面創建臨時順序編號目錄節點,和選master一樣,編號最小的獲得鎖,用完刪除,依次方便

  • 集羣管理(eg:zk+dubbo)

所謂集羣管理無在乎兩點:是否有機器退出和加入、選舉master。對於第一點,所有機器約定在父目錄下創建臨時目錄節點,然後監聽父目錄節點的子節點變化消息。一旦有機器掛掉,該機器與zookeeper的連接斷開,其所創建的臨時目錄節點被刪除,所有其他機器都收到通知:某個兄弟目錄被刪除,於是,所有人都知道:它上船了。新兄弟目錄加入,highcount又有了,對於第二點,我們稍微改變一下,所有機器創建臨時順序編號目錄節點,每次選取編號最小的機器作爲master就好

  • 分佈式日誌收集

相較於zk,nameserver更輕量級且無狀態同步,支持存儲策略;
rocketMq後續使用的就是nameserver;

zk安裝

官方文檔:http://dubbo.apache.org/zh-cn/docs/admin/install/zookeeper.html

外網下載:
wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.6.1/zookeeper-3.6.1.tar.gz

解壓:
tar zxvf (目錄)/zookeeper-3.6.1.tar.gz 目標目錄

##配置開始
修改配置文件名稱:mv zoo_sample.cfg zoo.cfg

配置集羣節點:
格式:server.編號(需包含數字)=ip:2888:3888

server.1=ip:2888:3888
server.2=ip:2889:3889
server.3=ip:2890:3890

zoo.cfg文件編輯:vim zoo.cfg
添加以上集羣節點配置,同時修改data數據存放目錄爲:
data=/temp/zookeeper/data/node1(zookeeper目錄下沒有data)

保存退出:esc :wq(保存/退出)
強制保存退出:esc :wq!

在zookeeper下創建data&node1目錄:mkdir data mkdir node1
在node1目錄下創建內容文件(myid):vim myid 編號(數字)

##配置結束

集羣節點2和3重複以上步驟;

啓動: ./bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/cheilpengtai/apache-zookeeper-3.6.1/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
關閉:./bin/zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /home/cheilpengtai/apache-zookeeper-3.6.1/bin/../conf/zoo.cfg
Stopping zookeeper ... ./bin/zkServer.sh: line 213: kill: (31380) - No such process
STOPPED
查詢狀態./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/cheilpengtai/software/apache-zookeeper-3.6.1-bin2/bin/../conf/zoo.cfg
Client port found: 2182. Client address: localhost.
Mode: follower

zoo.conf

tickTime:維持心跳時間間隔
dataDir:數據存儲目錄
clientPort:客戶端連接zk端口,zk監聽這個端口;
initLimit:zk接受客戶端初始化連接最長時間;
synclimit:leader與follower之間發送消息,請求與應答時間長度;

4種節點類型,如何實現分佈式鎖?

通過創建臨時節點來實現分佈式鎖,臨時節點在本次會話中有效;
Znode的四種類型:

1、PERSISTENT-持久化目錄節點
客戶端與zookeeper斷開連接後,該節點依舊存在
2、PERSISTENT_SEQUENTIAL-持久化順序編號目錄節點
客戶端與zookeeper斷開連接後,該節點依舊存在,只是Zookeeper給該節點名稱進行順序編號
3、EPHEMERAL-臨時目錄節點
客戶端與zookeeper斷開連接後,該節點被刪除
4、EPHEMERAL_SEQUENTIAL-臨時順序編號目錄節點
客戶端與zookeeper斷開連接後,該節點被刪除,只是Zookeeper給該節點名稱進行順序

ZK通知機制

client端會對某個znode建立一個watcher事件,當該znode發生變化時,這些client會收到zk的通知,然後client可以根據znode變化來做出業務上的改變。

WatchManager :一個接口,用於管理各個監聽器,只有一個方法 materialize(),返回一個 Watcher 的 set。

//客戶端創建zk連接實例時,註冊watcher
//這個 Watcher 將作爲整個 ZK會話期間的默認 Watcher,會一直被保存在客戶端 ZKWatchManager 的 defaultWatcher 中。
//WatchRegistration/register()/watches.put(this.clientPath, watchers);
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)
//也可以通過 getData、exists 和 getChildren 三個接口來向 ZooKeeper 服務器註冊 Watcher
public byte[] getData(String path, Watcher watcher, Stat stat) throws KeeperException, InterruptedException

ZK文件系統

文件系統:多層級命名空間,可設置關聯的數據。只有文件節點可以存放數據而目錄節點不行。在內存中維護了這個樹狀的目錄結構,這種特性使得Zk不能用於存放大量的數據,每個節點的存放數據上限爲1M。

ZK設置ACL權限控制

權限控制引用:https://www.cnblogs.com/fesh/p/5798353.html

ZK的節點有5種操作權限:

CREATE、READ、WRITE、DELETE、ADMIN 也就是
增、刪、改、查、管理權限,這5種權限簡寫爲crwda(即:每個單詞的首字符縮寫)
注:這5種權限中,delete是指對子節點的刪除權限,其它4種權限指對自身節點的操作權限

身份的認證有4種方式:

world:默認方式,相當於全世界都能訪問 auth:代表已經認證通過的用戶(cli中可以通過addauth digest user:pwd
來添加當前上下文中的授權用戶) digest:即用戶名:密碼這種方式認證,這也是業務系統中最常用的 ip:使用Ip地址認證

設置訪問控制:

方式一:(推薦) 1)增加一個認證用戶 addauth digest 用戶名:密碼明文 eg. addauth digest
user1:password1 2)設置權限 setAcl /path auth:用戶名:密碼明文:權限 eg. setAcl /test
auth:user1:password1:cdrwa 3)查看Acl設置 getAcl /path

方式二:

setAcl /path digest:用戶名:密碼密文:權限
注:這裏的加密規則是SHA1加密,然後base64編碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章