Zookeeper集群搭建步驟及相關知識點深入了解


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類型的節點不能有子節點)

 

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

 

  •  節點類型:

      1Znode有兩種類型:

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

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

      2Znode四種形式的目錄節點(默認是persistent

        PERSISTENT

        PERSISTENT_SEQUENTIAL(持久序列/test0000000019

        EPHEMERAL

        EPHEMERAL_SEQUENTIAL

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

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

 

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

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

 選舉機制:(兩種情況)

(1)全新集群paxos

假設有五台服務器組成的zookeeper集群,它們的id1-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掉,重新選舉時,選舉過程就相對復雜了。

需要加入數據idleader 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(2888leaderfollow之間通信,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

  

 


免責聲明!

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



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