1. 安裝JDK
參考jdk的安裝。
2. ZooKeeper安裝
2.1. 單機模式
2.1.1. 下載並安裝ZooKeeper
步驟:
1) 在下載地址:http://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.9/下載穩定版本的zookeeper。
2) $ tar -zxvf zookeeper-3.4.9.tar.gz 將zookeeper安裝包tar開。
3) 將tar開的文件目錄拷貝到安裝目錄
$ cp -R zookeeper-3.4.9 /software/
4) 切換到zookeeper安裝目錄創建zookeeper的軟連接
$ ln -s zookeeper-3.4.9/ zk
5)配置zookeeper的安裝路徑到操作系統環境變量
編輯環境變量文件:sudo vim/etc/profile
在文件中添加如下內容:
export ZOOKEEPER_HOME =/software/zk
export PATH=$ ZOOKEEPER_HOME /bin:$PATH
$ source /etc/profile #環境變量立即生效
2.1.2. 創建zoo.cfg配置文件
1)、切換到zookeeper的安裝目錄下的conf目錄
$ cp zoo_sample.cfg zoo.cfg
2)、修改zoo.cfg的內容
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hadoop/zookeeper/data
clientPort=2181
注:zookeeper配置參數詳解 (主要是$ZOOKEEPER_HOME/conf/zoo.cfg文件)
參數名 | 說明 |
clientPort | 客戶端連接server的端口,即對外服務端口,一般設置爲2181。 |
dataDir | 存儲快照文件snapshot的目錄。默認情況下,事務日誌也會存儲在這裏。建議同時配置參數dataLogDir, 事務日誌的寫性能直接影響zk性能。 |
tickTime | 這個時間是作爲 Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會發送一個心跳。 |
dataLogDir | 事務日誌輸出目錄。儘量給事務日誌的輸出配置單獨的磁盤或是掛載點,這將極大的提升ZK性能。 (No Java system property) |
globalOutstandingLimit | 最大請求堆積數。默認是1000。ZK運行的時候,儘管server已經沒有空閒來處理更多的客戶端請求了,但是還是允許客戶端將請求提交到服務器上來,以提高吞吐性能。當然,爲了防止Server內存溢出,這個請求堆積數還是需要限制下的。 |
preAllocSize | 預先開闢磁盤空間,用於後續寫入事務日誌。默認是64M,每個事務日誌大小就是64M。如果ZK的快照頻率較大的話,建議適當減小這個參數。(Java system property:zookeeper.preAllocSize) |
snapCount | 每進行snapCount次事務日誌輸出後,觸發一次快照(snapshot), 此時,ZK會生成一個snapshot.*文件,同時創建一個新的事務日誌文件log.*。默認是100000.(真正的代碼實現中,會進行一定的隨機數處理,以避免所有服務器在同一時間進行快照而影響性能)(Java system property:zookeeper.snapCount) |
traceFile | 用於記錄所有請求的log,一般調試過程中可以使用,但是生產環境不建議使用,會嚴重影響性能。(Java system property:? requestTraceFile) |
maxClientCnxns | 單個客戶端與單臺服務器之間的連接數的限制,是ip級別的,默認是60,如果設置爲0,那麼表明不作任何限制。請注意這個限制的使用範圍,僅僅是單臺客戶端機器與單臺ZK服務器之間的連接數限制,不是針對指定客戶端IP,也不是ZK集羣的連接數限制,也不是單臺ZK對所有客戶端的連接數限制。指定客戶端IP的限制策略,這裏有一個patch,可以嘗試一下:http://rdc.taobao.com/team/jm/archives/1334(No Java system property) |
clientPortAddress | 對於多網卡的機器,可以爲每個IP指定不同的監聽端口。默認情況是所有IP都監聽 clientPort指定的端口。 New in 3.3.0 |
minSessionTimeoutmaxSessionTimeout | Session超時時間限制,如果客戶端設置的超時時間不在這個範圍,那麼會被強制設置爲最大或最小時間。默認的Session超時時間是在2 * tickTime ~ 20 * tickTime 這個範圍 New in 3.3.0 |
fsync.warningthresholdms | 事務日誌輸出時,如果調用fsync方法超過指定的超時時間,那麼會在日誌中輸出警告信息。默認是1000ms。(Java system property: fsync.warningthresholdms)New in 3.3.4 |
autopurge.purgeInterval | 在上文中已經提到,3.4.0及之後版本,ZK提供了自動清理事務日誌和快照文件的功能,這個參數指定了清理頻率,單位是小時,需要配置一個1或更大的整數,默認是0,表示不開啓自動清理功能。(No Java system property) New in 3.4.0 |
autopurge.snapRetainCount | 這個參數和上面的參數搭配使用,這個參數指定了需要保留的文件數目。默認是保留3個。(No Java system property) New in 3.4.0 |
electionAlg | 在之前的版本中,這個參數配置是允許我們選擇leader選舉算法,但是由於在以後的版本中,只會留下一種“TCP-based version of fast leader election”算法,所以這個參數目前看來沒有用了,這裏也不詳細展開說了。(No Java system property) |
initLimit | Follower在啓動過程中,會從Leader同步所有最新數據,然後確定自己能夠對外服務的起始狀態。Leader允許Follower在initLimit時間內完成這個工作。通常情況下,我們不用太在意這個參數的設置。如果ZK集羣的數據量確實很大了,Follower在啓動的時候,從Leader上同步數據的時間也會相應變長,因此在這種情況下,有必要適當調大這個參數了。(No Java system property) |
syncLimit | 在運行過程中,Leader負責與ZK集羣中所有機器進行通信,例如通過一些心跳檢測機制,來檢測機器的存活狀態。如果Leader發出心跳包在syncLimit之後,還沒有從Follower那裏收到響應,那麼就認爲這個Follower已經不在線了。注意:不要把這個參數設置得過大,否則可能會掩蓋一些問題。(No Java system property) |
leaderServes | 默認情況下,Leader是會接受客戶端連接,並提供正常的讀寫服務。但是,如果你想讓Leader專注於集羣中機器的協調,那麼可以將這個參數設置爲no,這樣一來,會大大提高寫操作的性能。(Java system property: zookeeper.leaderServes)。 |
server.x=[hostname]:nnnnn[:nnnnn] | 這裏的x是一個數字,與myid文件中的id是一致的。右邊可以配置兩個端口,第一個端口用於F和L之間的數據同步和其它通信,第二個端口用於Leader選舉過程中投票通信。 |
group.x=nnnnn[:nnnnn]weight.x=nnnnn | 對機器分組和權重設置,可以 參見這裏(No Java system property) |
cnxTimeout | Leader選舉過程中,打開一次連接的超時時間,默認是5s。(Java system property: zookeeper. cnxTimeout) |
zookeeper.DigestAuthenticationProvider.superDigest | ZK權限設置相關,具體參見 《 使用super 身份對有權限的節點進行操作》 和 《 ZooKeeper 權限控制》 |
skipACL | 對所有客戶端請求都不作ACL檢查。如果之前節點上設置有權限限制,一旦服務器上打開這個開頭,那麼也將失效。(Java system property: zookeeper.skipACL) |
forceSync | 這個參數確定了是否需要在事務日誌提交的時候調用FileChannel.force來保證數據完全同步到磁盤。(Java system property: zookeeper.forceSync) |
jute.maxbuffer | 每個節點最大數據量,是默認是1M。這個限制必須在server和client端都進行設置纔會生效。(Java system property: jute.maxbuffer) |
2.1.3.啓動ZooKeeper服務
$ zkServer.sh start
2.1.4.啓動ZooKeeper客戶端
$ zkCli.sh
2.2. 僞分佈式模式
2.2.1. 新建myid文件
給每個zk server指定一個id(唯一性),存放在myid文件中,值介於1-255之間。
該myid文件存放在zoo.cfg配置文件中的dataDir=/home/hadoop/zookeeper/data配置項的路徑下。
這裏創建3個zk服務及創建三個zoo1.cfg、zoo2.cfg、zoo3.cfg,需要三個dataDir路徑,例如:
dataDir=/home/hadoop/zookeeper/data1
dataDir=/home/hadoop/zookeeper/data2
dataDir=/home/hadoop/zookeeper/data3
2.2.2. 在zoo.cfg中增加配置項
語法:server.n=hostname:port1:port2
其中n爲服務器ID,即myid中的值;hostname爲服務器名稱;port1爲follower連接leader的端口;port2被用於領導者選舉。
2.2.3. 啓動ZooKeeper服務
$>zkServer.shstart /software/zk/conf/zoo1.cfg
$>zkServer.sh start/software/zk/conf/zoo2.cfg
$>zkServer.sh start/software/zk/conf/zoo3.cfg
2.2.4. 查看zk服務狀態
1)、使用四字命令
$>echo ruok |nc localhost 2181
$>echo conf |nc localhost 2181
$>echo envi |nc localhost 2181
$>echo stat |nc localhost 2181
2)、使用其它命令
$ zkServer.shstatus /software/zk/conf/zoo1.cfg
2.2.5. 通過zk客戶端連接zk服務
$ zkCli.sh //默認連接到localhost2181,使用zoo.cfg
$ zkCli.sh -server s200:2182 //連接到指定的zk服務
2.3. 完全分佈式
2.3.1.分發ZooKeeper
將zookeeper安裝文件分發到需要安裝zookeeper服務的服務器上。
2.3.2.分發ZooKeeper的環境變量
將其中一臺配置好的環境變量分發到所有服務器上,並重啓服務器或者使用source命令使環境變量生效。
2.3.3.新建myid文件
參考僞分佈模式中的“新建myid文件”。
2.3.4.在zoo.cfg中增加配置項
在zk server服務器上的$ZOOKEEPER_HOME/conf/zoo.cfg文件中增加配置項,參考僞分佈模式。
例:
server.201=s201:2888:3888
server.202=s202:2888:3888
server.203=s203:2888:3888
2.3.5.啓動zk服務
登錄到每臺zk服務器使用下面命令啓動zk服務
$ zkServer.sh start