1. 程式人生 > >Zookeeper的基本知識點以及Zookeeper叢集搭建步驟

Zookeeper的基本知識點以及Zookeeper叢集搭建步驟

轉自:https://www.cnblogs.com/ahu-lichang/p/6723826.html

 

1、zookeeper概念

zookeeper是一個分散式協調服務:a:zookeeper是為別的分散式程式服務的

                b:zookeeper本身就是一個分散式程式(只要半數以上節點存活,zookeeper就能正常服務。)

                c:zookeeper的服務範圍:主從協調、伺服器節點動態上下線、統一配置管理、分散式共享鎖、統一名稱服務...

                d:zookeeper底層其實只提供了兩個功能:

                                (1)管理(儲存、讀取)使用者程式提交的資料

                                (2)為使用者程式提交資料節點監聽服務

 

2、zookeeper叢集機制

半數機制:叢集中半數以上機器存活,叢集可用。

zookeeper叢集適合搭建在奇數臺機器上。

 

3、zookeeper特性

  • Zookeeper:一個leader,多個follower組成的叢集
  • 全域性資料一致:每個server儲存一份相同的資料副本,client無論連線到哪個server,資料都是一致的
  • 分散式讀寫,更新請求轉發,由leader實施
  • 更新請求順序進行,來自同一個client的更新請求按其傳送順序依次執行
  • 資料更新原子性,一次資料更新要麼成功,要麼失敗
  • 實時性,在一定時間範圍內,client能讀到最新資料

 

4、zookeeper資料結構

 

  • 層次化的目錄結構,命名符合常規檔案系統規範(見下圖)

 

  • 每個節點在zookeeper中叫做Znode,並且其有一個唯一的路徑標識

 

  • 節點Znode可以包含資料和子節點(但是EPHEMERAL型別的節點不能有子節點)

 

  • 客戶端應用可以在節點上設定監視器

 

  •  節點型別:

      1、Znode有兩種型別:

        短暫(ephemeral)(斷開連線自己刪除)

        持久(persistent)(斷開連線不刪除)

      2、Znode有四種形式的目錄節點(預設是persistent )

        PERSISTENT

        PERSISTENT_SEQUENTIAL(持久序列/test0000000019 )

        EPHEMERAL

        EPHEMERAL_SEQUENTIAL

      3、建立znode時設定順序標識,znode名稱後會附加一個值,順序號是一個單調遞增的計數器,由父節點維護

      4、在分散式系統中,順序號可以被用於為所有的事件進行全域性排序,這樣客戶端可以通過順序號推斷事件的順序

 

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叢集的搭建(博主親手成功搭建步驟,經得起考驗!)

(1)準備三臺機器:hadoop1(192.168.33.201)、hadoop2(192.168.33.202)、hadoop3(192.168.33.203)。

    這三臺機器是在之前安裝好常用軟體(jdk)的機器克隆來的,克隆來了以後,要分別對其中的實體地址和ip進行修改:

        ifconfig           ---檢視物理裝置名稱(eth1)

        setup             ---修改裡面的裝置名稱為eth1,並將修改ip地址,儲存退出

        service network restart   ---重啟網絡卡

        ifconfig           ---檢視是否配置成功

(2)將zookeeper安裝包上傳到hadoop1的/usr/local中。

    上傳方式:使用上傳工具或者使用lrzsz

                     lrzsz是一款在linux裡可代替ftp上傳和下載的程式。

                       要想使用lrzsz進行上傳rz(也可直接滑鼠拖拽)下載sz,則必須安裝lrzsz。可以使用yum install lrzsz自動安裝,必須有網路。沒有網路,可以製作yum本地源。

 

(3)解壓    tar -zxvf /usr/local/zookeeper-3.4.5.tar.gz

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

 

 (4)修改環境變數

      vi /etc/profile

      新增內容:export ZOOKEEPER_HOME=/usr/local/zookeeper

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

   重新整理環境變數

      source /etc/profile

  注意:3臺機器都要修改

 

(5)修改配置檔案

      cd /usr/local/zookeeper/conf

      cp zoo_sample.cfg zoo.cfg

      vi zoo.cfg

      新增內容: 

          dataDir=/usr/local/zookeeper/data  (不能放在臨時資料夾中,需新建data資料夾)

          dataLogDir=/usr/local/zookeeper/log(新建log資料夾,可不要!!!)

          server.1=hadoop1:2888:3888 (主機名, 心跳埠、資料埠)

          server.2=hadoop2:2888:3888(都是預設埠)

          server.3=hadoop3:2888:3888(2888是leader和follow之間通訊,3888是投票選舉時用的埠)

      建立資料夾

          mkdir /usr/local/zookeeper/data

          mkdir /usr/local/zookeeper/log

      在data資料夾中新建myid檔案,myid檔案的內容為1(一句話建立:echo 1 > myid)

        cd data

        vi myid

          新增內容:1

(6)把zookeeper目錄複製到hadoop2和hadoop3中

  在這之前要三臺機器都要設定對映檔案:

      vi /etc/hosts

          192.168.33.201 hadoop1

          192.168.33.202 hadoop2

          192.168.33.203 hadoop3

  設定三個機器的本機免密登入(三臺機器配置一樣):

      ssh-keygen -t rsa   ---一直回車即可

      cd /root/.ssh/    ---生成了公鑰和私鑰

      cat id_rsa.pub >> authorized_keys   ---將公鑰追加到授權檔案中

      more authorized_keys   ---可以檢視到裡面追加的公鑰

      ssh hadoop1

  配置兩兩之間的免密登入:

      將hadoop1中的公鑰複製到hadoop2中ssh-copy-id -i hadoop2         驗證一下:ssh hadoop2  

        將hadoop3中的公鑰複製到hadoop2中ssh-copy-id -i hadoop2   驗證一下:ssh hadoop2

      這樣hadoop2中的授權檔案就有三個機器的公鑰,再把hadoop2中的授權檔案複製給hadoop1和hadoop3

        scp /root/.ssh/authorized_keys hadoop1:/root/.ssh/

        scp /root/.ssh/authorized_keys hadoop3:/root/.ssh/

      這樣就ok了!


      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


(7)把hadoop2中相應的myid的值改為2
    vi /usr/local/zk/data/myid 將裡面的值改為2
    把hadoop3中相應的myid的值改為3
    vi /usr/local/zk/data/myid 將裡面的值改為3


(8)將三臺機器的防火牆關閉掉,service iptables stop ,檢視service iptables status

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

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

          小技巧:(怎麼對三臺機器同時執行一個命令?)

              在CRT中,選單欄View-->Command Window勾選上,工具下面會出現一個視窗,在視窗中點選滑鼠右鍵,選擇all session。這樣在視窗中執行一個命令,就會對所有session起作用!

              


(9)檢驗,jps檢視程序,會出現程序QuorumPeerMain

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

   hadoop1:follower 

   hadoop2:leader

   hadoop3:follower