1.安裝zookeeper
下載zookeeper后,解壓,安裝
cd zookeeper-3.4.5/src/c ./configure make make install
2.啟動zookeeper服務
cd zookeeper-3.4.5/conf mv zoo_sample.cfg zoo.cfg vim zoo.cfg #修改dataDir=/data/database/zookeeper mkdir -p /data/database/zookeeper cd .. zookeeper-3.4.5-cdh5.0.0]# cd bin/ ./zkServer.sh start #啟動服務 ./zkServer.sh status #查看啟動狀態
如果顯示
Mode: standalone
則表示啟動成功
如果顯示 It is probably not running,原因是沒有安裝jdk或者沒有配置JAVA_HOME路徑
3.安裝zkpython
在https://pypi.python.org/pypi/zkpython/0.4.2 下載,然后解壓后安裝
如果 import zookeeper就表示成功安裝
4.python連接和操作zookeeper
輸入python進入python界面
>>> import zookeeper >>> zk=zookeeper.init("localhost:2181") #初始化zookeeper連接
#創建zookeeper節點 >>> zookeeper.create(zk,"/zk_for_py","mydata1",[{"perms":4,"scheme":"world","id":"anyone"}],0) '/zk_for_py'
#獲取'/'下面的所以節點
>>> zookeeper.get_children(zk,"/",None)
['app', 'zookeeper', 'zk_for_py'] #創建zookepper節點 >>> zookeeper.create(zk,"/zk_for_py1","mydata1",[{"perms":0x1f,"scheme":"world","id":"anyone"}],0) '/zk_for_py1'
#獲取節點信息 >>> zookeeper.get(zk,"/zk_for_py1") ('mydata1', {'pzxid': 9L, 'ctime': 1398512377068L, 'aversion': 0, 'mzxid': 9L, 'numChildren': 0, 'ephemeralOwner': 0L, 'version': 0, 'dataLength': 7, 'mtime': 1398512377068L, 'cversion': 0, 'czxid': 9L}) >>> zookeeper.get_children(zk,"/zk_for_py1",None) [] >>> zookeeper.get_children(zk,"/") ['app', 'zookeeper', 'zk_for_py1', 'zk_for_py']
#節點的數據只能是字符串 >>> zookeeper.set(zk,"/zk_for_py1",{"k":"v"}) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: must be string or read-only buffer, not dict >>> zookeeper.set(zk,"/zk_for_py1","hello") 0 >>> zookeeper.get(zk,"/zk_for_py1") ('hello', {'pzxid': 9L, 'ctime': 1398512377068L, 'aversion': 0, 'mzxid': 10L, 'numChildren': 0, 'ephemeralOwner': 0L, 'version': 1, 'dataLength': 5, 'mtime': 1398512533595L, 'cversion': 0, 'czxid': 9L}) >>> zookeeper.delete(zk,"zk_for_py") Traceback (most recent call last): File "<stdin>", line 1, in <module> zookeeper.BadArgumentsException: bad arguments >>> zookeeper.delete(zk,"/zk_for_py") 0 >>> zookeeper.get(zk,"/zk_for_py1") ('hello', {'pzxid': 9L, 'ctime': 1398512377068L, 'aversion': 0, 'mzxid': 10L, 'numChildren': 0, 'ephemeralOwner': 0L, 'version': 1, 'dataLength': 5, 'mtime': 1398512533595L, 'cversion': 0, 'czxid': 9L})
這是可以新開一個shell頁面,在python中再初始化一個連接,可以獲取前面set的數據“hello"
>>> import zookeeper >>> zk=zookeeper.init("localhost:2181") >>> zookeeper.get(zk,"/zk_for_py1") ('hello', {'pzxid': 9L, 'ctime': 1398512377068L, 'aversion': 0, 'mzxid': 10L, 'numChildren': 0, 'ephemeralOwner': 0L, 'version': 1, 'dataLength': 5, 'mtime': 1398512533595L, 'cversion': 0, 'czxid': 9L}) #定義一個監聽器 >>> def myWatch(zk,type,state,path): ... print "zk:",str(type),str(state),str(path) ... zookeeper.get(zk,path,myWatch) ... >>> data=zookeeper.get(zk,"/zk_for_py1",myWatch)#設定監聽節點
#當在上面的shell中改變這個節點的數據時,這個shell就會有這樣的輸出 >>> TypeError: 'str' object is not callable
zk: 3 3 /zk_for_py1 zk: 3 3 /zk_for_py1
創建節點說明:
zookeeper.create(self.handle, path, data, [acl2], flags) zk創建節點的api,flags可以為EPHEMERAL SEQUENCE 或0,如果設置為EPHEMERAL ,這個節點只會短暫存在,即過期就好被刪除,過期的時間為session的時間,SEQUENCE a unique monotonically increasing sequence number is appended to the path name ,可能是排序的意思。
zookeeper.create(handler,"/zkpython_create_node","mydata1",[{"perms":0x1f,"scheme":"world","id":"anyone"}]),0);
這個地方需要詳細的解釋一下,第一個參數就是我們剛才建立的鏈接,第二個參數是創建的節點的路徑,第三個是創建的節點的數據,第四個是acl(zookeeper中的訪問控制列表),第四個是創建的節點的類型(0表示持久化的,1表示持久化+序號,2表示瞬時的,3表示瞬時加序號型的)
好...疑問來了,acl的描述為什么是這樣的,首先第一個參數是perms,這個代表了控制這個節點的權限,具體值參考如下:
int READ = 1 << 0;
int WRITE = 1 << 1;
int CREATE = 1 << 2;
int DELETE = 1 << 3;
int ADMIN = 1 << 4;
也就是說,這是一個數字,而我們例子中為什么是1f呢?實際上就是 READ | WRITE | CREATE | DELETE | ADMIN的結果,這下明白是什么意思了吧??好,后面還有兩個參數,實際上現在java和c的api中定義的值只有兩種,除了例子中的還有一種是
"scheme":"auth","id":""組合的,但是實際上,官方的文檔中是有四種的,有興趣的同學可以參考:
http://zookeeper.apache.org/doc/trunk/zookeeperProgrammers.html 里的內容
監聽器說明:
首先,我們先要定義一個watch方法,比如這里的myWatch方法,之后在調用get方法的時候,把這個watch傳遞進去就可以了
接下來詳細解釋下watcher中的各個參數的意思
handler:就是我們創建連接之后的返回值,我試了下,發現好像指的是連接的一個索引值,以0開始
type:事件類型,-1表示沒有事件發生,1表示創建節點,2表示節點刪除,3表示節點數據被改變,4表示子節點發生變化
state:客戶端的狀態,0:斷開連接狀態,3:正常連接的狀態,4認證失敗,-112:過期啦
path:這個狀態就不用解釋了,znode的路徑
參考資料:http://justfansty.blog.sohu.com/218331818.html
http://justfansty.blog.sohu.com/217953183.html
http://blog.csdn.net/chenyi8888/article/details/6626302