1. 程式人生 > >Zookeeper叢集搭建(配置詳解)

Zookeeper叢集搭建(配置詳解)

軟體環境準備:

  • Linux伺服器一臺、三臺、五臺(2*n+1臺);
  • Java jdk 1.7;
  • zookeeper 3.4.6版;

軟體安裝:

  1. 解壓jdk、zookeeper檔案到指定目錄,執行命令tar -zvxf xxxx.tar.gz -C /usr/local/program
  2. 配置環境變數,vi /etc/profile
  3. #set enviroment
    export JAVA_HOME=/usr/local/program/jdk1.7.0_79
    export ZK_HOME=/usr/local/program/zk/zookeeper-3.4.6
    export PATH=$JAVA_HOME/bin:$ZK_HOME/bin:$PATH
    
  4. java -version 命令測試是否成功配置jdk
  5. [[email protected] ~]# java -version
    java version "1.7.0_79"
    Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
    Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
    
  6. 配置zookeeper;首先建立兩個資料夾mkdir /usr/local/program/zk/zkdata ,mkdir /usr/local/program/zk/zkdataLog 
  7. 然後執行命令cd /usr/local/program/zk/zookeeper-3.4.6/conf/ 進入配置檔案目錄,拷貝一份配置檔案cp zoo_sample.cfg zoo.cfg改名為zoo.cfg
  8. 編輯配置檔案修改配置(將埠改大的目的是為了防止衝突):
  9. # 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=/usr/local/program/zk/zkdata
    dataLogDir=/usr/local/program/zk/zkdataLog
    # the port at which the clients will connect
    clientPort=12181
    # 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
    server.1=192.168.0.102:12888:13888
    server.2=192.168.0.103:12888:13888
    server.3=192.168.0.104:12888:13888
    
  10. 進入zkdata目錄,執行命令echo “1” > myid建立myid檔案並輸入值為1
  11. 依次在另外兩臺機器上執行同樣的操作,myid的數值依次為2,3
  12. 配置成功,執行命令zkServer.sh start分別啟動三臺機器
  13. 執行命令zkServer.sh status檢視對應的狀態發現出現:zookeeper Error contacting service. It is probably not running錯誤
  14. 執行命令:tail -f zookeeper.out
    檢視到錯誤記錄:
    2016-04-21 06:56:56,242 [myid:1] – WARN  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:[email protected]] – Exception when following the leader
    java.net.NoRouteToHostException: No route to host
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:579)
    at org.apache.zookeeper.server.quorum.Learner.connectToLeader(Learner.java:225)
    at org.apache.zookeeper.server.quorum.Follower.followLeader(Follower.java:71)
    at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:786)
  15. 經驗證:防火牆的問題,執行命令service iptables stop關閉防火牆(如要永久關閉防火牆執行命令:chkconfig iptables off)
  16. 重啟機器,執行命令zkServer.sh status 分別檢視每臺機器的狀態為leader、follower、follower則表明啟動成功

配置說明:

作用:
leader:從客戶端接收讀寫請求,響應讀寫請求,向slaver傳送資料
slaver:從leader同步資料,當leader失敗時,從新投票選舉新的leader

配置詳解:
myid:位於快照目錄,是用來標識本臺機器在叢集中的唯一標識
zoo.cfg:
	tickTime:是initLimit 和 syncLimit的時間單位(毫秒)
	initLimit:叢集機器之間的同步時間,比如啟動m1,s1在這個時間段內必須都起來
	syncLimit:leader與follower之間的通訊時間(心跳),超時則說明follower失敗

#快照日誌的儲存路徑
dataDir=/usr/local/program/zk/zkdata
#zk事物日誌儲存目錄 (如果不配置zkdataLog那麼快照日誌和事務日誌都將寫到dataDir中,嚴重影響效能)
dataLogDir=/usr/local/program/zk/zkdataLog
# the port at which the clients will connect
#本臺機器的埠,預設為2181
clientPort=12181
log4j.properties:
	日誌檔案,zookeeper.out位置bin下面,可以更改

注意:需要定期清理事務日誌檔案,否則會造成效能下降(crontab)
crontab -l檢視當前使用者定時任務
crontab -e編輯定時任務
(例:0 0 * * 0 sh /usr/local/program/zk/cleanup.sh)
另外2臺機器執行同樣的操作


#server.1標識本臺機器,通過myid檔案指定id=1;ip:機器之間通訊埠(預設為2888):leader選舉埠(預設為3888)
server.1=192.168.0.102:12888:13888