Zookeeper集群搭建


1、zookeeper概念

zookeeper是一個分布式協調服務:

Zookeeper是一個高效的分布式協調服務,可以提供配置信息管理、命名、分布式同步、集群管理、數據庫切換等服務。它不適合用來存儲大量信息,可以用來存儲一些配置、發布與訂閱等少量信息。Hadoop、Storm、消息中間件、RPC服務框架、分布式數據庫同步系統,這些都是Zookeeper的應用場景。

2、zookeeper集群機制

Zookeeper集群中節點個數一般為奇數個(>=3),若集群中Master掛掉,剩余節點個數在半數以上時,就可以推舉新的主節點,繼續對外提供服務 

3、zookeeper特性

  • Zookeeper:一個leader,多個follower組成的集群
  • 全局數據一致:每個server保存一份相同的數據副本,client無論連接到哪個server,數據都是一致的
  • 分布式讀寫,更新請求轉發,由leader實施
  • 更新請求順序進行,來自同一個client的更新請求按其發送順序依次執行
  • 數據更新原子性,一次數據更新要么成功,要么失敗
  • 實時性,在一定時間范圍內,client能讀到最新數據

4、zookeeper數據結構

Zookeeper使用的數據結構為樹形結構,根節點為"/"。Zookeeper集群中的節點,根據其身份特性分為leader、follower、observer。leader負責客戶端writer類型的請求;follower負責客戶端reader類型的請求,並參與leader選舉;observer是特殊的follower,可以接收客戶端reader請求,但是不會參與選舉,可以用來擴容系統支撐能力,提高讀取速度。

5、zookeeper原理及內部選舉機制

原理:zookeeper在配置文件中並沒有指定master和slave,但是,zookeeper在工作時,只有一個節點為leader,其余節點為follower,leader是通過內部的選舉機制臨時產生的。

 選舉機制:(兩種情況)

(1)全新集群paxos

假設有五台服務器組成的zookeeper集群,它們的id從1-5,同時它們都是最新啟動的,也就是沒有歷史數據,在存放數據量這一點上,都是一樣的.假設這些服務器依序啟動,來看看會發生什么.
  1) 服務器1啟動,此時只有它一台服務器啟動了,它發出去的報沒有任何響應,所以它的選舉狀態一直是LOOKING狀態
  2) 服務器2啟動,它與最開始啟動的服務器1進行通信,互相交換自己的選舉結果,由於兩者都沒有歷史數據,所以id值較大的服務器2勝出,但是由於沒有達到超過半數以上的服務器都同意選舉它(這個例子中的半數以上是3),所以服務器1,2還是繼續保持LOOKING狀態.
  3) 服務器3啟動,根據前面的理論分析,服務器3成為服務器1,2,3中的老大,而與上面不同的是,此時有三台服務器選舉了它,所以它成為了這次選舉的leader.
  4) 服務器4啟動,根據前面的分析,理論上服務器4應該是服務器1,2,3,4中最大的,但是由於前面已經有半數以上的服務器選舉了服務器3,所以它只能接收當小弟的命了.
  5) 服務器5啟動,同4一樣,當小弟.

(2)非全新集群(數據恢復)

初始化的時候,是按照上述的說明進行選舉的,但是當zookeeper運行了一段時間之后,有機器down掉,重新選舉時,選舉過程就相對復雜了。

需要加入數據id、leader id和邏輯時鍾。

數據id:數據新的id就大,數據每次更新都會更新id。

Leader id:就是我們配置的myid中的值,每個機器一個。

邏輯時鍾:這個值從0開始遞增,每次選舉對應一個值,也就是說:  如果在同一次選舉中,那么這個值應該是一致的 ;  邏輯時鍾值越大,說明這一次選舉leader的進程更新.

選舉的標准就變成:

  1、邏輯時鍾小的選舉結果被忽略,重新投票

  2、統一邏輯時鍾后,數據id大的勝出

  3、數據id相同的情況下,leader id大的勝出

根據這個規則選出leader。

6、zookeeper集群的搭建

     重命名:mv zookeeper-3.4.5.tar.gz zookeeper

  • 修改環境變量

    vi /etc/profile

    添加內容:export ZOOKEEPER_HOME=/usr/local/zookeeper

            export PATH=.:$ZOOKEEPER_HOME/bin....

    刷新環境變量

    source /etc/profile

    注意:3台機器都要修改

  • 修改配置文件

    cd /usr/local/zookeeper/conf

    cp zoo_sample.cfg zoo.cfg

    vi zoo.cfg

    添加內容: 

    maxClientCnxns=60

    tickTime=2000

    initLimit=10

    syncLimit=5

    dataDir=/data/zookeeper/data

    dataLogDir=/data/logs/zookeeper

    clientPort=2181  (客戶端連接端口)

    server.1=192.168.1.11:2888:3888  (主機名, 心跳端口、數據端口)

    server.2=192.168.1.12:2888:3888  (都是默認端口)

    server.3=192.168.1.13:2888:3888  (2888表示zookeeper程序監聽端口,3888表示zookeeper選舉通信端口)

    創建文件夾

    mkdir /usr/local/zookeeper/data

    mkdir /usr/local/zookeeper/log

    在data文件夾中新建myid文件,myid文件的內容為1(一句話創建:echo 1 > myid)

    cd data

    vi myid

    添加內容:1

  • 把zookeeper目錄復制到hadoop2和hadoop3中

    設置三個機器的本機免密登錄(三台機器配置一樣):

    scp -r /usr/local/zookeeper/ hadoop2:/usr/local/
    scp -r /usr/local/zookeeper/ hadoop3:/usr/local/
    將hadoop0中的環境變量復制到hadoop2和hadoop3中
    scp /etc/profile hadoop2:/etc/
    scp /etc/profile hadoop3:/etc/
    環境變量復制好了以后,在hadoop2和hadoop3上都要執行source /etc/profile

  • 把hadoop2中相應的myid的值改為2

    vi /usr/local/zk/data/myid 將里面的值改為2
         把hadoop3中相應的myid的值改為3
    vi /usr/local/zk/data/myid 將里面的值改為3

  • 將三台機器的防火牆關閉掉,service iptables stop ,查看service iptables status,還有selinux。

    啟動,在三個節點上分別都要執行命令zkServer.sh start
    cd /usr/local/zk/bin
    ls
    zkServer.sh start

    啟動完了之后,在bin目錄下多了一個zookeeper.out

  • 檢驗,jps查看進程,會出現進程QuorumPeerMain

    在三個節點上依次執行命令zkServer.sh status(可以看到MODE,誰是leader,誰是follower)

    hadoop1:follower 

    hadoop2:leader

    hadoop3:follower

7、zookeeper命令行客戶端

執行zkCli.sh,客戶端連接上服務器hadoop1。

ls  /   查找根目錄

找到topic所在的目錄:ls /brokers/topics

找到要刪除的topic,執行命令:rmr /brokers/topics/【topic name】即可,此時topic被徹底刪除。

create /test abc   創建節點並賦值

get /test   獲取指定節點的值

set /test cb  設置已存在節點的值

rmr /test  遞歸刪除節點

delete /test/test01  刪除不存在子節點的節點

使用 ls 命令來查看當前 ZooKeeper 中所包含的內容:

創建一個新的 znode ,使用 create /zk “myData” 。這個命令創建了一個新的 znode 節點“ zk ”以及與它關聯的字符串:

我們運行 get 命令來確認 znode 是否包含我們所創建的字符串: 

 

#監聽這個節點hadoop2的變化,當另外一個客戶端localhost改變/zk時(見4),它會打出下面的

#WATCHER::

#WatchedEvent state:SyncConnected type:NodeDataChanged path:/zk

[zk: localhost:2181(CONNECTED) 4] get /zk watch

下面我們通過 set 命令來對 zk 所關聯的字符串進行設置:

下面我們將剛才創建的 znode 刪除:

刪除節點:rmr

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM