1. 程式人生 > 實用技巧 >服務治理讓人掉頭髮?用zookeeper啦!(一)

服務治理讓人掉頭髮?用zookeeper啦!(一)

前序

原理看這個

ZooKeeper 這麼牛逼,基本原理你懂嗎?

轉載連結:https://mp.weixin.qq.com/s/DtLdmLhGO4wJxIaOWgrXQg

正文

一、客戶端API常規應用

zookeeper 提供了java與C兩種語言的客戶端。我們要學習的就是java客戶端。引入最新的maven依賴:

 1 <dependency>
 2 
 3 
 4             <groupId>org.apache.zookeeper</groupId>
 5 
 6 
 7             <artifactId>
zookeeper</artifactId> 8 9 10 <version>3.5.5</version> 11 12 13 </dependency>
View Code

1.初始連線:

常規的客戶端類是 org.apache.zookeeper.ZooKeeper,例項化該類之後將會自動與叢集建立連線。構造引數說明如下:

引數名稱

型別

說明

connectString

String

連線串,包括ip+埠 ,叢集模式下用逗號隔開

192.168.0.149:2181,192.168.0.150:2181

sessionTimeout

int

會話超時時間,該值不能超過服務端所設定的

minSessionTimeout 和maxSessionTimeout

watcher

Watcher

會話監聽器,服務端事件將會觸該監聽

sessionId

long

自定義會話ID

sessionPasswd

byte[]

會話密碼

canBeReadOnly

boolean

該連線是否為只讀的

hostProvider

HostProvider

服務端地址提供者,指示客戶端如何選擇某個服務來呼叫,預設採用StaticHostProvider實現

2.建立、檢視節點

建立節點

通過org.apache.zookeeper.ZooKeeper#create()即可建立節點,其引數說明如下:

引數名稱

型別

說明

path

String

給定的目錄節點 path

data

byte[]

資料

acl

List<ACL>

許可權

createMode

CreateMode

標識有四種形式的目錄節點

cb

StringCallback

回撥方法

ctx

Object

上下文

檢視節點:

通過org.apache.zookeeper.ZooKeeper#getData()即可建立節點,其引數說明如下:

引數名稱

型別

說明

path

String

路徑

watch

boolean

是否需要註冊一個watcher

watcher

Watcher

注入的watcher

cb

DataCallback

回撥函式

ctx

Object

上下文

檢視子節點:

通過org.apache.zookeeper.ZooKeeper#getChildren()即可獲取子節點,其引數說明如下:

引數名稱

型別

說明

path

String

指定資料節點的路徑

watch

boolean

表明是否需要註冊一個Watcher,如果為true,則使用預設的watcher(在客戶端建立會話的時候傳入的Watcher),false則不使用watcher

watcher

Watcher

註冊的Watcher。一旦在此次獲取子節點以後,如果子節點列表發生變更,該Watcher將會收到通知

cb

Children2Callback

註冊一個非同步回撥函式

ctx

Object

用於傳遞的上下文物件

3.監聽節點

getData() 與getChildren()兩個方法中可分別設定監聽資料變化和子節點變化。通過設定watch為true,當前事件觸發時會呼叫zookeeper()構建函式中Watcher.process()方法。也可以新增watcher引數來實現自定義監聽。一般採用後者。

注:所有的監聽都是一次性的,如果要持續監聽需要觸發後在新增一次監聽。

4.設定節點ACL許可權

ACL包括結構為scheme:id:permission

客戶端中由org.apache.zookeeper.data.ACL 類表示,類結構如下:

  1. ACL
    1. Id
      1. scheme // 對應許可權模式scheme
      2. id // 對應模式中的id值
    2. perms // 對應許可權位permission

關於許可權位的表示方式:

每個許可權位都是一個唯一數字,將其合時通過或執行生成一個全新的數字即可

 1 @InterfaceAudience.Public
 2 
 3 public interface Perms {
 4 
 5     int READ = 1 << 0;
 6 
 7     int WRITE = 1 << 1;
 8 
 9     int CREATE = 1 << 2;
10 
11     int DELETE = 1 << 3;
12 
13     int ADMIN = 1 << 4;
14 
15  
16 
17     int ALL = READ | WRITE | CREATE | DELETE | ADMIN;
18 
19 }
View Code

5.第三方客戶端ZkClient

zkClient 是在zookeeper客戶端基礎之上封裝的,使用上更加友好。主要變化如下:

可以設定持久監聽,或刪除某個監聽

可以插入JAVA物件,自動進行序列化和反序列化

簡化了基本的增刪改查操作。

二、Zookeeper叢集

zookeeper叢集的目的是為了保證系統的效能承載更多的客戶端連線設專門提供的機制。通過叢集可以實現以下功能:

讀寫分離:提高承載,為更多的客戶端提供連線,並保障效能。

主從自動切換:提高服務容錯性,部分節點故障不會影響整個服務叢集。

半數以上執行機制說明:

叢集至少需要三臺伺服器,並且強烈建議使用奇數個伺服器。因為zookeeper 通過判斷大多數節點的存活來判斷整個服務是否可用。比如3個節點,掛掉了2個表示整個叢集掛掉,而用偶數4個,掛掉了2個也表示其並不是大部分存活,因此也會掛掉。

  1. 叢集部署

配置語法:

server.<節點ID>=<ip>:<資料同步埠>:<選舉埠>

節點ID:服務id手動指定1至125之間的數字,並寫到對應服務節點的 {dataDir}/myid 檔案中。

IP地址:節點的遠端IP地址,可以相同。但生產環境就不能這麼做了,因為在同一臺機器就無法達到容錯的目的。所以這種稱作為偽叢集。

資料同步埠:主從同時資料複製埠,(做偽叢集時埠號不能重複)。

遠舉埠:主從節點選舉埠,(做偽叢集時埠號不能重複)。

配置檔案示例:

tickTime=2000

dataDir=/var/lib/zookeeper/

clientPort=2181

initLimit=5

syncLimit=2

#以下為叢集配置,必須配置在所有節點的zoo.cfg檔案中

server.1=zoo1:2888:3888

server.2=zoo2:2888:3888

server.3=zoo3:2888:3888

叢集配置流程:

  1. 分別建立3個data目錄用於儲存各節點資料

mkdir data

mkdir data/1

mkdir data/3

mkdir data/3

編寫myid檔案

echo 1 > data/1/myid

echo 3 > data/3/myid

echo 2 > data/2/myid

3、編寫配置檔案

conf/zoo1.cfg

tickTime=2000

initLimit=10

syncLimit=5

dataDir=data/1

clientPort=2181

#叢集配置

server.1=127.0.0.1:2887:3887

server.2=127.0.0.1:2888:3888

server.3=127.0.0.1:2889:3889

conf/zoo2.cfg

tickTime=2000

initLimit=10

syncLimit=5

dataDir=data/2

clientPort=2182

#叢集配置

server.1=127.0.0.1:2887:3887

server.2=127.0.0.1:2888:3888

server.3=127.0.0.1:2889:3889

conf/zoo3.cfg

tickTime=2000

initLimit=10

syncLimit=5

dataDir=data/3

clientPort=2183

#叢集配置

server.1=127.0.0.1:2887:3887

server.2=127.0.0.1:2888:3888

server.3=127.0.0.1:2889:3889

4.分別啟動

./bin/zkServer.sh start conf/zoo1.cfg

./bin/zkServer.sh start conf/zoo2.cfg

./bin/zkServer.sh start conf/zoo3.cfg