Hadoop學習筆記—14.ZooKeeper環境搭建

從字面上來看,ZooKeeper表示動物園管理員,這是一個十分奇妙的名字,咱們又想起了Hadoop生態系統中,許多項目的Logo都採用了動物,好比Hadoop採用了大象的形象,因此咱們能夠猜想ZooKeeper就是對這些動物進行一些管理工做的。html

1、ZooKeeper基礎介紹

1.1 動物園也要保障安全

  zookeeper是hadoop下面的一個子項目,用來協調跟hadoop相關的一些分佈式的框架,如hadoop, hive, pig等, 其實他們都是動物,因此叫zookeeper ——「動物園管理員」。動物園裏固然有好多的動物,遊客能夠根據動物園提供的嚮導圖到不一樣的場館觀賞各類類型的動物,而不是像走在原始叢林裏,心驚膽顫的被動物所觀賞。爲了讓各類不一樣的動物呆在它們應該呆的地方,而不是相互串門,或是相互廝殺,就須要動物園管理員按照動物的各類習性加以分類和管理,這樣咱們才能更加放心安全的觀賞動物。java

1.2 進程內的協調方法

  在實際應用中,Zookeeper主要是針對大型分佈式系統進行高可靠的協調。由這個定義咱們知道zookeeper是個協調系統,做用的對象是分佈式系統。說到協調,咱們能夠聯想到的現實生活中不少十字路口的交通協管,他們手握着小紅旗,指揮車輛和行人是否是能夠通行。若是咱們把車輛和行人比喻成運行在計算機中的單元(線程),那麼這個協管是幹什麼的?不少人都會想到,這不就是鎖麼?對,在一個併發的環境裏,咱們爲了不多個運行單元對共享數據同時進行修改,形成數據損壞的狀況出現,咱們就必須依賴像鎖這樣的協調機制,讓有的線程能夠先操做這些資源,而後其餘線程等待。對於進程內的鎖來說,咱們使用的各類語言平臺都已經給咱們準備不少種選擇。例如在C#中,最經常使用的莫過於藉助語法糖lock構造同步塊:算法

  int Withdraw(int amount)
    {
        if (balance < 0)
        {
            throw new Exception("Negative Balance");
        }

        lock(thisLock)
        {
            if (balance >= amount)
            {
                Console.WriteLine("Balance before Withdrawal :  " + balance);
                Console.WriteLine("Amount to Withdraw        : -" + amount);
                balance = balance - amount;
                Console.WriteLine("Balance after Withdrawal  :  " + balance);
                return amount;
            }
            else
            {
                return 0;
            }
        }
    }

1.3 分佈式環境中的協調

  在進程內進行協調咱們可使用語言,平臺,操做系統等爲咱們提供的機制。那麼若是咱們在一個分佈式環境中呢?也就是咱們的程序運行在不一樣的機器上,這些機器可能位於同一個機架,同一個機房又或不一樣的數據中心。在這樣的環境中,咱們要實現協調該怎麼辦?那麼這就是分佈式協調服務要乾的事情。vim

  因而,Google創造了Chubby,而ZooKeeper則是對於Chubby的一個開源實現。安全

        

Definition:ZooKeeper是一種爲分佈式應用所設計的高可用、高性能且一致的開源協調服務,它提供了一項基本服務:分佈式鎖服務。因爲ZooKeeper的開源特性,後來咱們的開發者在分佈式鎖的基礎上,摸索了出了其餘的使用方法:配置維護、組服務、分佈式消息隊列分佈式通知/協調等。服務器

1.4 ZooKeeper的應用場景

  (1)統一命名服務網絡

  有一組服務器向客戶端提供某種服務(例如:使用LVS技術構建的Web網站集羣,就是由N臺服務器組成的集羣,爲用戶提供Web服務),咱們但願客戶端每次請求服務端均可以找到服務端集羣中某一臺服務器,這樣服務端就能夠向客戶端提供客戶端所需的服務。對於這種場景,咱們的程序中必定有一份這組服務器的列表,每次客戶端請求時候,都是從這份列表裏讀取這份服務器列表。那麼這分列表顯然不能存儲在一臺單節點的服務器上,不然這個節點掛掉了,整個集羣都會發生故障,咱們但願這份列表時高可用的。高可用的解決方案是:這份列表是分佈式存儲的,它是由存儲這份列表的服務器共同管理的,若是存儲列表裏的某臺服務器壞掉了,其餘服務器立刻能夠替代壞掉的服務器,而且能夠把壞掉的服務器從列表裏刪除掉,讓故障服務器退出整個集羣的運行,而這一切的操做又不會由故障的服務器來操做,而是集羣里正常的服務器來完成。這是一種主動的分佈式數據結構,可以在外部狀況發生變化時候主動修改數據項狀態的數據機構。Zookeeper框架提供了這種服務。這種服務名字就是:統一命名服務,它和javaEE裏的JNDI服務很像。數據結構

  (2)分佈式鎖服務架構

  當分佈式系統操做數據,例如:讀取數據、分析數據、最後修改數據。在分佈式系統裏這些操做可能會分散到集羣裏不一樣的節點上,那麼這時候就存在數據操做過程當中一致性的問題,若是不一致,咱們將會獲得一個錯誤的運算結果,在單一進程的程序裏,一致性的問題很好解決,可是到了分佈式系統就比較困難,由於分佈式系統裏不一樣服務器的運算都是在獨立的進程裏,運算的中間結果和過程還要經過網絡進行傳遞,那麼想作到數據操做一致性要困難的多。Zookeeper提供了一個鎖服務解決了這樣的問題,能讓咱們在作分佈式數據運算時候,保證數據操做的一致性。併發

  (3)配置管理

  在分佈式系統裏,咱們會把一個服務應用分別部署到n臺服務器上,這些服務器的配置文件是相同的(例如:我設計的分佈式網站框架裏,服務端就有4臺服務器,4臺服務器上的程序都是同樣,配置文件都是同樣),若是配置文件的配置選項發生變化,那麼咱們就得一個個去改這些配置文件,若是咱們須要改的服務器比較少,這些操做還不是太麻煩,若是咱們分佈式的服務器特別多,好比某些大型互聯網公司的hadoop集羣有數千臺服務器,那麼更改配置選項就是一件麻煩並且危險的事情。這時候zookeeper就能夠派上用場了,咱們能夠把zookeeper當成一個高可用的配置存儲器,把這樣的事情交給zookeeper進行管理,咱們將集羣的配置文件拷貝到zookeeper的文件系統的某個節點上,而後用zookeeper監控全部分佈式系統裏配置文件的狀態,一旦發現有配置文件發生了變化,每臺服務器都會收到zookeeper的通知,讓每臺服務器同步zookeeper裏的配置文件,zookeeper服務也會保證同步操做原子性,確保每一個服務器的配置文件都能被正確的更新。

  能夠看出,zookeeper是一個典型的觀察者模式的應用。

  (4)集羣管理

  集羣管理是很困難的,在分佈式系統里加入了zookeeper服務,能讓咱們很容易的對集羣進行管理。集羣管理最麻煩的事情就是節點故障管理,zookeeper可讓集羣選出一個健康的節點做爲master,master節點會知道當前集羣的每臺服務器的運行情況,一旦某個節點發生故障,master會把這個狀況通知給集羣其餘服務器,從而從新分配不一樣節點的計算任務。Zookeeper不只能夠發現故障,也會對有故障的服務器進行甄別,看故障服務器是什麼樣的故障,若是該故障能夠修復,zookeeper能夠自動修復或者告訴系統管理員錯誤的緣由讓管理員迅速定位問題,修復節點的故障。你們也許還會有個疑問,master故障了,那怎麼辦了?zookeeper也考慮到了這點,zookeeper內部有一個「選舉領導者的算法」,master能夠動態選擇,當master故障時候,zookeeper能立刻選出新的master對集羣進行管理。

PS:關於Master的選舉,能夠瀏覽Suddenly的這篇:http://www.cnblogs.com/sunddenly/p/4033574.html,其文章有一部分叫作分佈式鎖應用場景,對於Master選舉有一個詳細的介紹。

2、ZooKeeper集羣模式環境搭建

2.1 ZooKeeper集羣模式典型架構

  (1)典型架構圖以下所示:

  (2)本次試驗架構圖以下所示:

2.2 ZooKeeper集羣模式搭建步湊

注意:ZooKeeper服務器集羣規模不小於3個節點,要求各服務器之間系統時間要保持一致;

  (1)經過FTP工具上傳ZooKeeper安裝包,我這裏使用的是3.4.5版本:

  下載地址:http://pan.baidu.com/s/1qWyoFhU

  (2)解壓ZooKeeper安裝包,並將解壓後的文件夾名稱改成zookeeper:

  ①tar -zvxf zookeeper-3.4.5.tar.gz

  ②mv zookeeper-3.4.5 zookeeper

  (3)修改環境變量:vim /etc/profile

  增長一行:export ZOOKEEPER_HOME=/usr/local/zookeeper

  修改PATH:export PATH=.:$HADOOP_HOME/bin:$ZOOKEEPER_HOME/bin:$JAVA_HOME/bin:$PATH

  ③使配置生效:source /etc/profile

  (4)進入zookeeper的conf目錄下,修改文件名:mv zoo_sample.cfg  zoo.cfg

  (5)編輯zoo.cfg:vim zoo.cfg

  修改dataDir=/usr/local/zookeeper/data
  新增server.0=hadoop-master:2888:3888
      server.1=hadoop-slave1:2888:3888
      server.2=hadoop-slave2:2888:3888

  (6)建立data文件夾,並建立myid文件:

  新建data文件夾:mkdir /usr/local/zookeeper/data

  新建myid文件:vim myid,並設置第一臺server爲0。

  (7)複製zookeeper目錄至其他兩臺服務器中:

  ①scp /usr/local/zookeeper hadoop-slave1:/usr/local/

  scp /usr/local/zookeeper hadoop-slave2:/usr/local/

  (8)複製環境變量配置文件至其他兩臺服務器中:

  ①scp /etc/profile hadoop-slave1:/etc

  scp /etc/profile hadoop-slave2:/etc

  (9)在其他兩臺服務器中修改myid文件:設置爲1和2;

  (10)啓動ZooKeeper,分別在三個節點中執行命令:zkServer.sh start

  (11)檢驗ZooKeeper集羣節點角色狀態,分別在三個節點中執行命令:zkServer.sh status

Role:ZooKeeper中包含如下角色:

領導者(leader),負責進行投票的發起和決議,更新系統狀態;
學習者(learner),包括跟隨者(follower)和觀察者(observer),follower用於接受客戶端請求並想客戶端返回結果,在選主過程當中參與投票;observer能夠接受客戶端鏈接,將寫請求轉發給leader,但observer不參加投票過程,只同步leader的狀態,observer的目的是爲了擴展系統,提升讀取速度;

3、ZooKeeper簡單測試

  搭建好集羣環境後,就能夠進行簡單的讀寫一致性測試了,這裏咱們經過進入zookeeper的bin目錄下的zkCli.sh來完成下面的操做:

  (1)在其中一個節點192.168.80.100上執行一個寫操做:create /MyTest test

  (2)在其餘兩個節點上執行讀操做:get /MyTest

  TIP:能夠在一個節點中經過zkCli.sh -server hadoop-slave1:2181來遠程登陸

  (3)在其中一個節點192.168.80.101上執行一個修改操做:

  (4)在其餘兩個節點上執行讀操做:

參考資料

(1)張善友,《zookeeper分佈式鎖服務》:http://www.cnblogs.com/shanyou/archive/2012/09/22/2697818.html

(2)夏天的森林,《分佈式網站架構後續:zookeeper技術淺析》:http://www.cnblogs.com/sharpxiajun/archive/2013/06/02/3113923.html

(3)橫刀天笑,《Zookeeper—Zookeeper是什麼?》:http://www.cnblogs.com/yuyijq/p/3391945.html

(4)Suddenly,《Hadoop日誌Day20—ZooKeeper》:http://www.cnblogs.com/sunddenly/p/4033574.html

 

相關文章
相關標籤/搜索