服務治理讓人掉頭髮?用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>View Codezookeeper</artifactId> 8 9 10 <version>3.5.5</version> 11 12 13 </dependency>
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 類表示,類結構如下:
- ACL
- Id
- scheme // 對應許可權模式scheme
- id // 對應模式中的id值
- perms // 對應許可權位permission
- Id
關於許可權位的表示方式:
每個許可權位都是一個唯一數字,將其合時通過或執行生成一個全新的數字即可
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個也表示其並不是大部分存活,因此也會掛掉。
-
叢集部署
配置語法:
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
叢集配置流程:
- 分別建立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