這次將Zookeeper的一些基礎用法以及權限這塊的都補充一下在這篇博客中。
上篇博客介紹了基于ZooKeeper實現的分布式鎖,也介紹了一些ZooKeeper的節點類型以及監聽機制,今天這里就不作過多的介紹了,大家也可以自行的去官方文檔上看看更具體的介紹ZooKeeper官方鏈接
會話
會話(session)是zookepper非常重要的概念,客戶端和服務端之間的任何交互操作都與會話有關,
客戶端與服務端的一次會話連接,本質是TCP長連接,通過會話可以進行心跳檢測和數據傳輸:
?
看下這圖,Zk客戶端和服務端成功連接后,就創建了一次會話,ZK會話在整個運行期間的生命周期中,會在不同的會話狀態之間切換,這些狀態包括:
CONNECTING、CONNECTED、RECONNECTING、RECONNECTED、CLOSE
一旦客戶端開始創建Zookeeper對象,那么客戶端狀態就會變成CONNECTING狀態,同時客戶端開始嘗試連接服務端,連接成功后,客戶端狀態變為CONNECTED,通常情況下,由于斷網或其他原因,客戶端與服務端之間會出現斷開情況,一旦碰到這種情況,Zookeeper客戶端會自動進行重連服務,同時客戶端狀態再次變成CONNCTING,直到重新連上服務端后,狀態又變為CONNECTED,在通常情況下,客戶端的狀態總是介于CONNECTING和CONNECTED之間。但是,如果出現諸如會話超時、權限檢查或是客戶端主動退出程序等情況,客戶端的狀態就會直接變更為CLOSE狀態
目錄
下載了ZooKeeper之后在bin目錄下有以下可執行文件:
常用腳本
zkCli:連接ZooKeeper服務的客戶端腳本
bin/zkCli.sh -server 127.0.0.1:2181
zkServer:ZooKeeper服務的啟動、狀態以及關閉腳本
啟動ZK服務:? bin/zkServer.sh?start
查看ZK服務狀態: bin/zkServer.sh?status
停止ZK服務: bin/zkServer.sh?stop
重啟ZK服務: bin/zkServer.sh?restart?
參數大全
ZooKeeper服務啟動默認需加載conf文件夾下的zoo.cfg文件,參數也可以自行去官方文檔查詢,ZooKeeper配置文件官方參數大全
這里列舉一些常用的:
clientPort:參數無默認值,必須配置,用于配置當前服務器對外的服務端口,客戶端必須使用這端口才能進行連接
clientPortAddress:在3.3.0版本之后,監聽客戶端連接的地址(ipv4、ipv6或主機名);即客戶端試圖連接到的地址。這是可選的,默認情況下,我們以這樣一種方式進行綁定,即服務器上的任何地址/接口/網卡的任何連接都將被接受。
dataDir:用于存放內存數據庫快照的文件夾,同時用于集群的myid文件也存在這個文件夾里(注意:一個配置文件只能包含一個dataDir字樣,即使它被注釋掉了。)
dataLogDir:用于單獨設置transaction log的目錄,transaction log分離可以避免和普通log還有快照的競爭
dataDir:新安裝zk這文件夾里面是沒有文件的,可以通過snapCount參數配置產生快照的時機
以下配置集群中才會使用,后面再討論
tickTime:心跳時間,為了確保連接存在的,以毫秒為單位,最小超時時間為兩個心跳時間
initLimit:多少個心跳時間內,允許其他server連接并初始化數據,如果ZooKeeper管理的數據較大,則應相應增大這個值
syncLimit:多少個tickTime內,允許follower同步,如果follower落后太多,則會被丟棄。
常用命令
在ZooKeeper的客戶端使用help命令是可以看到所有命令:
介紹一些常用命令:
顯示根目錄下、文件:?ls?/?使用?ls?命令來查看當前?ZooKeeper?中所包含的內容?
顯示根目錄下、文件:?ls2?/?查看當前節點數據并能看到更新次數等數據?
創建文件,并設置初始內容:?create?/zk?"test"?創建一個新的?znode節點“?zk?”以及與它關聯的字符串? [-e] [-s] 【-e 零時節點】 【-s 順序節點】
獲取文件內容:?get?/zk?確認?znode?是否包含我們所創建的字符串? [watch]【watch 監聽】
修改文件內容:?set?/zk?"zkbak"?對?zk?所關聯的字符串進行設置
刪除文件:?delete?/zk?將剛才創建的?znode?刪除,如果存在子節點刪除失敗?
遞歸刪除:rmr? /zk將剛才創建的?znode?刪除,子節點同時刪除
退出客戶端:?quit
幫助命令:?help
節點
上篇講過節點,所以今天這里就不談節點類型了,談談節點狀態屬性,在使用get命令查看具體數據的時候,會打印:
?
?ACL權限
在ZooKeeper里面可以控制節點的訪問權限,保障數據的安全
表示為scheme:id:permissions,第一個字段表示采用哪一種機制,第二個id表示用戶,permissions表示相關權限(如只讀,讀寫,管理等)
schema:代表授權策略
id:代表用戶
permission:代表權限
scheme
?world: 它下面只有一個id, 叫anyone, world:anyone代表任何人,zookeeper中對所有人有權限的結點就是屬于world:anyone的
auth: 它不需要id, 只要是通過authentication的user都有權限(zookeeper支持通過kerberos來進行authencation, 也支持username/password形式的authentication)
digest: 它對應的id為username:BASE64(SHA1(password)),它需要先通過username:password形式的authentication
ip: 它對應?的id為客戶機的IP地址,設置的時候可以設置一個ip段,比如ip:192.168.1.0/16, 表示匹配前16個bit的IP段
id
scheme為auth時:
username:password
scheme為digest時:username:BASE64(SHA1(password))
scheme為ip時:客戶端的ip地址。
scheme為world時anyone。
permission
CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、刪、改、查、管理權限,這5種權限簡寫為crwda(即:每個單詞的首字符縮寫)
CREATE(c):創建子節點的權限
DELETE(d):刪除節點的權限
READ(r):讀取節點數據的權限
WRITE(w):修改節點數據的權限
ADMIN(a):設置子節點權限的權限
ACL命令
getAcl?
獲取指定節點的ACL權限信息
setAcl
setAcl /demo?world:anyone:crwa 設置指定節點的ACL權限
由于沒用設置刪除權限,所以在刪除的時候就會提示無法刪除
addauth
addauth? digest user1:123456設置用戶和密碼,
setAcl /demo auth:user1:123456:crwa?使用用戶去設置指定的權限,然后就可以直接登陸用戶進行訪問
在退出客戶端之后再次連接客戶端
對使用用戶設置權限的節點無權訪問,所以需登陸用戶進行訪問
即addauth digest user1:123456執行一下,就可以訪問指定節點了
digest
auth與digest的區別就是,前者使用明文密碼進行登錄,后者使用密文密碼進行登錄
addauth digest user1:123456? 設置用戶密碼
setAcl /demo digest:user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=:crwa?使用digest來設置權限
如果這里使用明文登陸的話,會導致改節點不可訪問
在ZooKeeper里面有可以獲取密文方法,在命令執行如下:
命令:java -Djava.ext.dirs=/soft/zookeeper-3.4.12/lib -cp /soft/zookeeper-3.4.12/zookeeper-3.4.12.jar org.apache.zookeeper.server.auth.DigestAuthenticationProvider deer:123456
結果:deer:123456->deer:ACFm5rWnnKn9K9RN/Oc8qEYGYDs=
IP
create? /testDir/testIp data? 創建節點
setAcl? /testDir/testIp ip:192.168.30.10:cdrwa? 給指定節點設置指定IP可訪問
getAcl ?/testDir/testIp?獲取節點權限信息
超級管理員
為了避免出現因權限設置的問題,所以在ZooKeeper中有超級管理員的權限存在
先獲取super:admin的密文:super:xQJmxLMiHGwaqBvst5y6rkB6HQs=
在ZooKeeper啟動的參數中添加啟動超級管理員
添加參數:"-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs="
在客戶端中啟動超級管理員:
addauth digest super:admin?
常用四字命令
ZooKeeper?支持某些特定的四字命令字母與其的交互。用來獲取?ZooKeeper?服務的當前狀態及相關信息。可通過?telnet?或?nc?向?ZooKeeper?提交相應的命令?:
當然,前提是安裝好了nc
echo?stat|nc?127.0.0.1?2181?來查看哪個節點被選擇作為follower或者leader
echo?ruok|nc?127.0.0.1?2181?測試是否啟動了該Server,若回復imok表示已經啟動。
echo?dump|?nc?127.0.0.1?2181?,列出未經處理的會話和臨時節點。
echo?kill?|?nc?127.0.0.1?2181?,關掉server
echo?conf?|?nc?127.0.0.1?2181?,輸出相關服務配置的詳細信息。
echo?cons?|?nc?127.0.0.1?2181?,列出所有連接到服務器的客戶端的完全的連接?/?會話的詳細信息
echo?envi?|nc?127.0.0.1?2181?,輸出關于服務環境的詳細信息(區別于?conf?命令)。
echo?reqs?|?nc?127.0.0.1?2181?,列出未經處理的請求。
echo?wchs?|?nc?127.0.0.1?2181?,列出服務器?watch?的詳細信息。
echo?wchc?|?nc?127.0.0.1?2181?,通過?session?列出服務器?watch?的詳細信息,它的輸出是一個與?watch?相關的會話的列表。
echo?wchp?|?nc?127.0.0.1?2181?,通過路徑列出服務器?watch?的詳細信息。它輸出一個與?session?相關的路徑。
還有一些其他的東西,后面有空在說呀