啓動ZooKeeper
ZooKeeper服務的啓動方式分爲三種,即單機模式、僞分佈式模式、分佈式模式,這裏針對三種模式均做逐一講解。
Tips 調試過程建議儘量使用分佈式模式,單機模式不推薦在生產環境下使用,僞分佈式模式實質上是在一個進程內派生多個線程模擬分佈式形態,由於操作系統的內部結構設計,容易造成一些問題,建議與其解決問題不如切換到分佈式模式。生產環境下建議一定採用分佈式模式,如果機器不夠,推薦採用虛擬機方式。 |
(1). Module1 單機模式
採用單機模式,意味着只有一臺機器或者一個節點,因此流程較爲簡單。首先,在conf目錄下面可以通過自己創建zoo.cfg文件的方式完成ZooKeeper的配置,如清單1-7所示,ZooKeeper服務會讀取該配置文件,具體的讀取代碼會在第四章介紹。
注意,ZooKeeper自帶了zoo_sample.cfg文件,這個是配置文件的模板文件,可以打開看看具體的內容,也可以作爲zoo.cfg的創建內容範例。
清單1-7 ZooKeeper配置文件
[root@localhost zookeeper-3.4.7]# cd conf
[root@localhost conf]# ls -rlt
total 12
-rw-rw-r--. 1 1000 1000 922 Nov 1022:32 zoo_sample.cfg
-rw-rw-r--. 1 1000 1000 2161 Nov 10 22:32 log4j.properties
-rw-rw-r--. 1 1000 1000 535 Nov 1022:32 configuration.xsl
[root@localhost conf]# cat zoo_sample.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
#http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
上面是自帶的示例配置,與我們相關的三個配置項是tickTime、dataDir和clientPort。
tickTime:這個參數主要是用來針對ZooKeeper服務端和客戶端的會話控制,包括心跳控制,一般來說,會話超時時間是該值的兩倍,它的單位是毫秒,我們設置爲2000毫秒。
dataDir:這個目錄用來存放數據庫的鏡像和操作數據庫的日誌。注意,如果這個文件夾不存在,需要手動創建一個並賦予讀寫權限,我們設置爲/tmp/zookeeper,不用手動創建這個文件夾,系統運行後會自動創建或覆蓋。
clientPort:ZooKeeper服務端監聽客戶端的端口,默認是2181,這裏沿用默認設置。
接下來通過bin目錄下面的zkServer.sh腳本啓動ZooKeeper服務,如果不清楚具體參數,可以直接調用腳本查看輸出,如清單1-8所示。
Tips ZooKeeper採用的是Bourne Shell。Shell基本上是一個命令解釋器,類似於DOS下的command。它接收用戶命令(如ls等),然後調用相應的應用程序。較爲通用的shell有標準的Bourne shell、C shell和Korn shell。 |
清單1-8 調用zkServer.sh腳本
[root@localhost bin]# ./zkServer.sh
ZooKeeper JMX enabled by default
Using config: /home/zhoumingyao/zookeeper/zookeeper-3.4.7/bin/../conf/zoo.cfg
Usage: ./zkServer.sh{start|start-foreground|stop|restart|status|upgrade|print-cmd}
輸出中可以看到有start等選項,具體每個選項的意義我們放在第四章解釋,這裏先啓動ZooKeeper服務,如清單1-9所示。
清單1-9 啓動ZooKeeper
[root@localhost bin]# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config:/home/zhoumingyao/zookeeper/zookeeper-3.4.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
ZooKeeper服務是否啓動成功,可以通過ps或者jps命令查看,如清單1-10所示。
清單1-10 查看ZooKeeper服務
[root@localhost bin]# jps
2737 QuorumPeerMain
2751 Jps
[root@localhost bin]# ps -ef | grep zookeeper | grep -v grep | awk '{print$2}'
2608
這裏我們看到的進程號爲2737的進程QuorumPeerMain代表了ZooKeeper服務。我們也可以通過ZooKeeper啓動腳本自帶的參數“Status”來查看ZooKeeper進程狀態,如清單1-11所示。
清單1-11 查看ZooKeeper進程狀態
[root@localhost bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config:/home/zhoumingyao/zookeeper/zookeeper-3.4.7/bin/../conf/zoo.cfg
Mode: standalone
ZooKeeper服務運行以後我們可以通過命令行工具去訪問它,默認是Java命令行腳本。我們可以通過以下命令方式啓動ZooKeeper命令行Shell,運行輸出如清單1-12所示。
清單1-12 ZKCli運行輸出
[root@localhost bin]# ./zkCli.sh -server localhost:2181
Connecting to localhost:2181
2015-12-20 23:22:10,620 [myid:] - INFO [main:Environment@100] - Clientenvironment:zookeeper.version=3.4.7-1713338, built on 11/09/2015 04:32 GMT
2015-12-20 23:22:10,645 [myid:] - INFO [main:Environment@100] - Client environment:host.name=localhost
2015-12-20 23:22:10,645 [myid:] - INFO [main:Environment@100] - Client environment:java.version=1.8.0_51
2015-12-20 23:22:10,657 [myid:] - INFO [main:Environment@100] - Client environment:java.vendor=OracleCorporation
2015-12-20 23:22:10,658 [myid:] - INFO [main:Environment@100] - Clientenvironment:java.home=/usr/lib/jdk1.8.0_51/jre
2015-12-20 23:22:10,658 [myid:] - INFO [main:Environment@100] - Client environment:java.class.path=/home/zhoumingyao/zookeeper/zookeeper-3.4.7/bin/../build/classes:/home/zhoumingyao/zookeeper/zookeeper-3.4.7/bin/../build/lib/*.jar:/home/zhoumingyao/zookeeper/zookeeper-3.4.7/bin/../lib/slf4j-log4j12-1.6.1.jar:/home/zhoumingyao/zookeeper/zookeeper-3.4.7/bin/../lib/slf4j-api-1.6.1.jar:/home/zhoumingyao/zookeeper/zookeeper-3.4.7/bin/../lib/netty-3.7.0.Final.jar:/home/zhoumingyao/zookeeper/zookeeper-3.4.7/bin/../lib/log4j-1.2.16.jar:/home/zhoumingyao/zookeeper/zookeeper-3.4.7/bin/../lib/jline-0.9.94.jar:/home/zhoumingyao/zookeeper/zookeeper-3.4.7/bin/../zookeeper-3.4.7.jar:/home/zhoumingyao/zookeeper/zookeeper-3.4.7/bin/../src/java/lib/*.jar:/home/zhoumingyao/zookeeper/zookeeper-3.4.7/bin/../conf:
2015-12-20 23:22:10,660 [myid:] - INFO [main:Environment@100] - Clientenvironment:java.library.path=/usr/java/packages/lib/i386:/lib:/usr/lib
2015-12-20 23:22:10,665 [myid:] - INFO [main:Environment@100] - Client environment:java.io.tmpdir=/tmp
2015-12-20 23:22:10,665 [myid:] - INFO [main:Environment@100] - Client environment:java.compiler=<NA>
2015-12-20 23:22:10,666 [myid:] - INFO [main:Environment@100] - Client environment:os.name=Linux
2015-12-20 23:22:10,666 [myid:] - INFO [main:Environment@100] - Client environment:os.arch=i386
2015-12-20 23:22:10,667 [myid:] - INFO [main:Environment@100] - Clientenvironment:os.version=2.6.32-504.el6.i686
2015-12-20 23:22:10,668 [myid:] - INFO [main:Environment@100] - Client environment:user.name=root
2015-12-20 23:22:10,668 [myid:] - INFO [main:Environment@100] - Client environment:user.home=/root
2015-12-20 23:22:10,668 [myid:] - INFO [main:Environment@100] - Clientenvironment:user.dir=/home/zhoumingyao/zookeeper/zookeeper-3.4.7/bin
2015-12-20 23:22:10,693 [myid:] - INFO [main:ZooKeeper@438] - Initiating client connection,connectString=localhost:2181 sessionTimeout=30000watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@b07fd3
Welcome to ZooKeeper!
2015-12-20 23:22:10,953 [myid:] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1032] - Openingsocket connection to server localhost/0:0:0:0:0:0:0:1:2181. Will not attempt toauthenticate using SASL (unknown error)
JLine support is enabled
2015-12-20 23:22:11,342 [myid:] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@876] - Socketconnection established to localhost/0:0:0:0:0:0:0:1:2181, initiating session
2015-12-20 23:22:11,672 [myid:] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1299] - Sessionestablishment complete on server localhost/0:0:0:0:0:0:0:1:2181, sessionid =0x151c241c15b0000, negotiated timeout = 30000
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0]
光標停留在[zk:localhost:2181(CONNECTED) 0]這一行,我們可以通過help請求來查看所有的支持命令,如清單1-13所示。
清單1-13 ZKCli help命令
[zk: localhost:2181(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path dataacl
addauth scheme auth
quit
getAcl path
close
connect host:port
關於ZKCli命令我們會在後續章節詳細解釋,這裏只做一個簡單的演示,我們可以使用類似於Linux的ls命令打印ZooKeeper內部ZNode列表,如清單1-14所示。
清單1-14 打印ZNode列表
[zk: localhost:2181(CONNECTED) 1] ls /
[zookeeper]
上面示例返回一個字符串zookeeper,這是一個ZooKeeper的ZNode(ZooKeeper術語),我們可以通過腳本創建一個ZNode,如清單1-15所示。
清單1-15 創建一個ZNode
[zk: localhost:2181(CONNECTED) 3] create /HelloWorld ""
Created /HelloWorld
[zk: localhost:2181(CONNECTED) 4] ls /
[zookeeper, HelloWorld]
歡迎關注麥克叔叔每晚十點說,感興趣的朋友可以關注公衆號,我們一起交流、學習。