zookeeper集羣

0,Zookeeper基本原理

  ZooKeeper集羣由一組Server節點組成,這一組Server節點中存在一個角色爲Leader的節點,其餘節點都爲Follower。當客戶端Client鏈接到ZooKeeper集羣,而且執行寫請求時,這些請求會被髮送到Leader節點上,而後Leader節點上數據變動會同步到集羣中其餘的Follower節點。html

  ZooKeeper採用一種稱爲Leader election的選舉算法(也有稱作:分佈式選舉算法-Paxos)的。在整個集羣運行過程當中,只有一個Leader,其餘的都是Follower,若是ZooKeeper集羣在運行過程當中Leader出了問題,系統會採用該算法從新選出一個Leader,java

ZooKeeper用於三臺以上的服務器集羣之中,只要還有超過半數的服務器在線,ZooKeeper就可以正常提供服務,過半,意味着實際可以有效參與選舉的節點數量是奇書個數,否者不能有效的過半linux

 

Zookeeper邏輯圖以下,算法

  1. 客戶端能夠鏈接到每一個server,每一個server的數據徹底相同。
  2. 每一個follower都和leader有鏈接,接受leader的數據更新操做。
  3. Server記錄事務日誌和快照到持久存儲。
  4. 大多數server可用,總體服務就可用。
  5. Leader節點在接收到數據變動請求後,首先將變動寫入本地磁盤,以做恢復之用。當全部的寫請求持久化到磁盤之後,纔會將變動應用到內存中。
  6. ZooKeeper使用了一種自定義的原子消息協議,在消息層的這種原子特性,保證了整個協調系統中的節點數據或狀態的一致性。Follower基於這種消息協議可以保證本地的ZooKeeper數據與Leader節點同步,而後基於本地的存儲來獨立地對外提供服務。
  7. 當一個Leader節點發生故障失效時,失敗故障是快速響應的,消息層負責從新選擇一個Leader,繼續做爲協調服務集羣的中心,處理客戶端寫請求,並將ZooKeeper協調系統的數據變動同步(廣播)到其餘的Follower節點。

1,系統環境配置

 我這裏使用的是在VMWare中安裝centos7每一個虛擬機都選擇橋接模式。便可在網絡中獨立分配一個IP,每臺機器單獨設定一個IP。apache

  •  配置hosts:vi /etc/hosts
    192.168.137.122 master
    192.168.137.123 slave1
    192.168.137.124 slave2
  • 關閉防火牆 (很重要,否則會出現No rout to host異常)
    systemctl status firewalld.service  #檢查防火牆狀態
    systemctl stop firewalld.service  #關閉防火牆
    systemctl disable firewalld.service  #禁止開機啓動防火牆  
  • 關閉SELINUX:vi /etc/selinux/config
    #SELINUX=enforcing  #註釋掉
    #SELINUXTYPE=targeted  #註釋掉
    SELINUX=disabled  #增長
  •  4. 當即生效配置
    setenforce 0  #使配置當即生效

     

2,java安裝環境變量配置

  略centos

3,配置無密鑰的SSH訪問

  在此處爲了方便,我將全部網內的節點機器都互相能SSH無密鑰登陸,能夠理解爲雙向無密鑰登陸。服務器

  • 使用下列命令在每一個虛擬機上都生成密鑰
    ssh-keygen -t rsa  #生成密鑰,一路回車便可,只適用於測試環境,正式環境請設定密碼
    
  • 每一個節點機器的公鑰傳輸到master機器上
    scp ~/.ssh/id_rsa.pub master:~/.ssh/slave1.id_rsa.pub #在slave1中,將公鑰文件傳輸至master機器上,並修改文件名爲slave1.id_rsa.pub
    scp ~/.ssh/id_rsa.pub master:~/.ssh/slave2.id_rsa.pub #在slave2中,將公鑰文件傳輸至master機器上,並修改文件名爲slave2.id_rsa.pub
    
  • 在master機器上生成統一的authorized_keys
    cd ~/.ssh
    cat id_rsa.pub >> authorized_keys #這個是master生成的公鑰,就在本機
    cat slave1.id_rsa.pub >> authorized_keys 
    cat slave2.id_rsa.pub >> authorized_keys
    

    完成後可使用rm -f slave1.id_rsa.pub刪除拷貝過來的祕鑰文件網絡

  •  將統一的authorized_keys分發至每一個節點
    scp authorized_keys root@master1:~/.ssh
    scp authorized_keys root@master2:~/.ssh

  authorized_keys是公鑰的字典文件,這樣下來全部的,全部節點的authorized_keys文件中記錄的祕鑰都相同了,由於能夠實現每一個機器的ssh互通了。架構

4,Zookeeper集羣安裝

zookeeper安裝很是簡單,只要獲取到 Zookeeper 的壓縮包並解壓到某個目錄,修改一下配置便可。app

  • 下載zookeeper-3.4.8,使用下列命令解壓到指定路徑
    tar -zxvf  zookeeper-3.4.8.tar.gz 
    mv zookeeper-3.4.8 /home/zookeeper #這裏能夠指定你喜歡的任意目錄
  • 修改環境變量:vi /etc/profile 加入下列內容
    # set zookeeperpath
    export ZOOKEEPER_HOME=/home/zookeeper
    export PATH=$PATH:$ZOOKEEPER_HOME/bin
    
  • 使用下面命令複製配置文件(也可直接創建)
    cp /home/zookeeper/conf/zoo_sample.cfg /home/zookeeper/conf/zoo.cfg
    
  • 使用 vi /home/zookeeper/conf/zoo.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=/home/zookeeper/zkdata
    dataLogDir=/home/zookeeper/zklog
    # 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
    server.1=master:2888:3888  
    server.2=slaver1:2888:3888  
    server.3=slaver2:2888:3888 
    

    tickTime: zookeeper中使用的基本時間單位, 毫秒值.
    dataDir: 數據目錄. 能夠是任意目錄.
    dataLogDir: log目錄, 一樣能夠是任意目錄. 若是沒有設置該參數, 將使用和dataDir相同的設置.
    clientPort: 監聽client鏈接的端口號.
    nitLimit:這個配置項是用來配置 Zookeeper 接受客戶端(這裏所說的客戶端不是用戶鏈接 Zookeeper 服務器的客戶端,而是 Zookeeper 服務器集羣中鏈接到 Leader 的 Follower 服務器)初始化鏈接時最長能忍受多少個心跳時間間隔數。當已經超過 5個心跳的時間(也就是 tickTime)長度後 Zookeeper 服務器尚未收到客戶端的返回信息,那麼代表這個客戶端鏈接失敗。總的時間長度就是 5*2000=10 秒
    syncLimit:這個配置項標識 Leader 與 Follower 之間發送消息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是 2*2000=4 秒
    server.A=B:C:D:其中 A 是一個數字,表示這個是第幾號服務器;B 是這個服務器的 ip 地址;C 表示的是這個服務器與集羣中的 Leader 服務器交換信息的端口;D 表示的是萬一集羣中的 Leader 服務器掛了,須要一個端口來從新進行選舉,選出一個新的 Leader,而這個端口就是用來執行選舉時服務器相互通訊的端口。若是是僞集羣的配置方式,因爲 B 都是同樣,因此不一樣的 Zookeeper 實例通訊端口號不能同樣,因此要給它們分配不一樣的端口號。

  • 建立myid文件:在zoo.cfg指定的dataDir目錄下創建以服務器節點對應的myid文件,如master節點中,建立myid文件內容爲1,slave1中建立myid文件內容爲2...
  • 使用下列命令將zoopeeper拷貝到其餘節點
    scp /home/zookeeper root@master1: /home/
    scp /home/zookeeper root@master2: /home/
    

    完成後,只需在其餘節點上修改vi /etc/profile,以及對應的myid,便可

4,啓動Zookeeper集羣

  • 在全部節點執行下列命令啓動
    cd /home/zookeeper
    bin/zkServer.sh start  
    

    正常會顯示以下狀態

  • 使用jps命令查看系統進程
  • 使用下列命令檢查運行狀態
    bin/zkServer.sh -status
    

    如顯示一下狀態表示啓動失敗

    具體失敗緣由可閱讀zookeeper/zookeeper.out文件查閱 如顯示一下狀態表示啓動成功

    查看其他節點,整個包括集羣中各個結點的角色會有一個leader,其餘都是follower。
    咱們經過more zookeeper.out檢查啓動輸入日誌,會發現有下列異常

    我啓動的順序是master>slave1>slave2,因爲ZooKeeper集羣啓動的時候,每一個結點都試圖去鏈接集羣中的其它結點,先啓動的確定連不上後面還沒啓動的,因此上面日誌前面部分的異常是能夠忽略的。經過後面部分能夠看到,集羣在選出一個Leader後,最後穩定了。 其餘結點可能也出現相似問題,屬於正常。
  • 客戶端鏈接測試: 對於客戶端來講,ZooKeeper是一個總體(ensemble),不管鏈接到那個節點,實際上都在獨享整個ZooKeeper集羣的服務,因此,咱們能夠在任何一個結點上創建到服務集羣的鏈接

5,參考

相關文章
相關標籤/搜索