1. 程式人生 > >多臺虛擬機器搭建zookeeper叢集

多臺虛擬機器搭建zookeeper叢集

一、什麼是zookeeper(摘自百度百科)

ZooKeeper是一個分散式的,開放原始碼的分散式應用程式協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要元件。它是一個為分散式應用提供一致性服務的軟體,提供的功能包括:配置維護、域名服務、分散式同步、組服務等。

ZooKeeper的目標就是封裝好複雜易出錯的關鍵服務,將簡單易用的介面和效能高效、功能穩定的系統提供給使用者。

ZooKeeper包含一個簡單的原語集, [1] 提供Java和C的介面。

ZooKeeper程式碼版本中,提供了分散式獨享鎖、選舉、佇列的介面,程式碼在zookeeper-3.4.3\src\recipes。其中分佈鎖和佇列有

Java和C兩個版本,選舉只有Java版本。

ZooKeeper是以Fast Paxos演算法為基礎的,Paxos 演算法存在活鎖的問題,即當有多個proposer交錯提交時,有可能互相排斥導致沒有一個proposer能提交成功,而Fast Paxos作了一些優化,通過選舉產生一個leader (領導者),只有leader才能提交proposer,具體演算法可見Fast Paxos。因此,要想弄懂ZooKeeper首先得對Fast Paxos有所瞭解。 [3]

ZooKeeper的基本運轉流程:

1、選舉Leader。

2、同步資料。

3、選舉Leader過程中演算法有很多,但要達到的選舉標準是一致的。

4、Leader要具有最高的執行ID,類似root許可權。

5、叢集中大多數的機器得到響應並接受選出的Leader。

我的理解就是這個框架能夠更好的協調資料和伺服器之間的關係,將伺服器的資源運用最大化,同時還能夠在系統發生不可預測狀況規避一些不必要的風險等。

二、環境搭建

本人建議這個要從分散式叢集基礎環境搭建的基礎上去做就會更加的方便,條例更加的清楚,還有linux系統java環境也是必須的,因為zookeeper就是用java寫的,我把他分為以下幾步:、

第三步:zookeeper搭建

  1. 如果上面基礎基礎的分散式叢集環境搭建好了之後,我們應該可以通過secureCR和secureFX(或者是其他的工具)連線上虛擬機器了,首先需要驗證環境的可用性,執行java -version,檢視java環境是否正常,出現以下資訊說明正常
  2. java version "1.8.0_151"
    Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
    Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)
  3. 接著驗證各臺主機的防火牆是否關閉(這個問題是出現問題最大的地方,這裡我將他放在前面來驗證解決), 針對不同的linux系統版本執行不同的命令: 

    Ubuntu(ubuntu-12.04-desktop-amd64)

    檢視防火牆狀態:ufw status

    關閉防火牆:ufw disable

    ---------------------------------------------------------------


    centos6.0

    檢視防火牆狀態:service iptables status

    關閉防火牆:chkconfig iptables off    #開機不啟動防火牆服務

    --------------------------------------------------------------

    centos7.0(預設是使用firewall作為防火牆,如若未改為iptables防火牆,使用以下命令檢視和關閉防火牆)

    檢視防火牆狀態:firewall-cmd --state

    關閉防火牆:systemctl stop firewalld.service

  4. 每臺機器都需要檢視,若沒有關閉,一定要關閉,否則啟動zookeeper的時候會報“java.net.NoRouteToHostException: 沒有到主機的路由”這樣的錯誤,接下來開始安裝zookeeper相關檔案(這裡一一臺虛擬機器為例,每臺虛擬機器都要執行同樣的操作)

  5. 首先要注意的是在生產環境中目錄結構要定義好,防止在專案過多的時候找不到所需的專案。 我把目錄統一放在/opt下面,該目錄一般存放主機額外安裝的軟體。(當然也可以放在其他的你願意的目錄之下)

    // 首先建立zookeeper專案目錄
    mkdir zookeeper // 專案目錄
    cd zookeeper // 進入專案目錄
    mkdir zkdata // 存放快照日誌(名字可以自己定義)
    mkdir zkdatalog // 存放事物日誌(名字可以自己定義)

    然後將之前下載好的zookeeper檔案通過檔案傳輸工具傳輸到虛擬機器中,我放在了/opt/zookeeper專案檔案下,解壓檔案 

    cd /opt/zookeeper // 進入下載目錄
    tar -zxvf zookeeper-3.4.11.tar.gz // 解壓檔案
  6. 增加配置檔案,進入到解壓好的zookeeper的conf目錄中,檢視:

    //進入conf目錄
    cd /opt/zookeeper/zookeeper-3.4.11/conf
    //檢視
    -rw-rw-r--. 1 1000 1000 535 Feb 20 2014 configuration.xsl
    -rw-rw-r--. 1 1000 1000 2161 Feb 20 2014 log4j.properties
    -rw-rw-r--. 1 1000 1000 922 Feb 20 2014 zoo_sample.cfg

    zoo_sample.cfg這個檔案是官方給我們的zookeeper的樣板檔案。我們需要複製一份名為zoo.cfg的檔案,zoo.cfg是zookeeper官方指定的檔案命名規則。我們以在第一臺虛擬機器上的操作為例(上面的操作都是在第一臺虛擬機器上,你需要在每臺虛擬機器上都執行上述以及本次操作):

    // 複製zoo.cfg檔案
    cp zoo_sample.cfg zoo.cfg
    // 開啟zoo.cfg檔案,然後按後面的配置資訊進行配置
    vim zoo.zfg

    在zoo.cfg配置檔案需要填入的資訊。

    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/opt/zookeeper/zkdata
    dataLogDir=/opt/zookeeper/zkdatalog
    clientPort=2181
    // 此處的IP就是你所操作的三臺虛擬機器的IP地址,每臺虛擬機器的zoo.cfg中都需要填入這三個地址。第一個埠是master和slave之間的通訊埠,預設是2888,第二個埠是leader選舉的埠,叢集剛啟動的時候選舉或者leader掛掉之後進行新的選舉的埠預設是3888
    server.1=虛擬機器1 ip:2888:3888
    server.2=虛擬機器2 ip:2888:3888
    server.3=虛擬機器3 ip:2888:3888
    // server.1 這個1是伺服器的標識也可以是其他的數字, 表示這個是第幾號伺服器,用來標識伺服器,這個標識要寫到快照目錄下面myid檔案裡
    

    建立myid檔案。以現在所在的第一臺虛擬機器192.168.172.10為例,對應server.1,通過上邊的配置資訊可以查到。建立myid檔案的目的是為了讓zookeeper知道自己在哪臺伺服器上,例如現在所在的虛擬機器是192.168.172.10,它對應的id是1,那麼就在myid檔案中寫入1.另外兩臺虛擬機器上也需要建立myid檔案並寫入相應的id,id根據zoo.cfg檔案中的IP地址查詢。

    echo "1" > /opt/zookeeper/zkdata/myid
    echo "2" > /opt/zookeeper/zkdata/myid
    echo "3" > /opt/zookeeper/zkdata/myid
  7. 啟動zookeeper,進入到zookeeper的bin目錄下 

    cd /opt/zookeeper/zookeeper-3.4.11/bin/
    // 啟動服務 (注意!三臺虛擬機器都要進行該操作)
    ./zkServer.sh start
    // 檢查伺服器狀態
    ./zkServer.sh status
    // 顯示如下
    JMX enabled by default
    Using config: /opt/zookeeper/zookeeper-3.4.6/bin/../conf/zoo.cfg
    Mode: follower #他是主節點leader還是從節點follower

三、配置檔案說明

  1. myid檔案和server.myid 在快照目錄下存放的標識本臺伺服器的檔案,他是整個zk叢集用來發現彼此的一個重要標識。
  2. zoo.cfg配置檔案。zoo.cfg檔案是zookeeper配置檔案,在conf目錄裡。
    // tickTime:
    這個時間是作為 Zookeeper 伺服器之間或客戶端與伺服器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會發送一個心跳。
    // initLimit:
    這個配置項是用來配置 Zookeeper 接受客戶端(這裡所說的客戶端不是使用者連線 Zookeeper 伺服器的客戶端,而是 Zookeeper 伺服器叢集中連線到 Leader 的 Follower 伺服器)初始化連線時最長能忍受多少個心跳時間間隔數。當已經超過 5個心跳的時間(也就是 tickTime)長度後 Zookeeper 伺服器還沒有收到客戶端的返回資訊,那麼表明這個客戶端連線失敗。總的時間長度就是 5x2000(毫秒)=10 秒
    // syncLimit:
    這個配置項標識 Leader 與Follower 之間傳送訊息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是5x2000(毫秒)=10秒
    // dataDir:
    快照日誌的儲存路徑
    // dataLogDir:
    事物日誌的儲存路徑,如果不配置這個那麼事物日誌會預設儲存到dataDir制定的目錄,這樣會嚴重影響zk的效能,當zk吞吐量較大的時候,產生的事物日誌、快照日誌太多
    // clientPort:
    這個埠就是客戶端連線 Zookeeper 伺服器的埠,Zookeeper 會監聽這個埠,接受客戶端的訪問請求。修改他的埠改大點

四、錯誤盤點

在我們配置好之後啟動的時候難免會出現錯誤,那麼我們怎麼知道錯誤原因呢?其實這個zookeeper團隊早就為我們好了,就是就是在/opt/zookeeper/zookeeper-3.3.6/bin/zookeeper.out檔案裡面,我們只需要檢視這個檔案就能夠定位到問題所在,這裡只能把問題總結一下了:

  •  1.節點無法執行

在用./zkServer.sh start命令執行zookeeper後,zookeeper節點顯示正常啟動,但是用zkServer.sh status命令檢視zookeeper節點的狀態時,發現並沒有正常執行,出現:

Error contacting service. It is probably not running.

我試著重新./zkServer.sh start,卻無法啟動,顯示:

already running as process 1854

對於這個問題,網上有很多答案,試了一遍:

  • zoo.cfg配置檔案中指定目錄卻沒有建立! 建立相應目錄即可。
    //我的目錄配置沒有問題
  • zoo.cfg中dataDir指定路徑為Myid檔案的路徑。Myid內容與:server.?=192.168.172.10:12888:13888 中所設定是否一致?
    //我的設定是一致的!
  • 使用service iptables stop 關閉防火牆.(按照的你的版本檢視或者關閉防火牆)
    //這個確實沒關,但用的命令不是service iptables stop,而是:

systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall開機啟動

關閉後確實起作用了,但是第二天重新啟動時,剛開始執行還沒問題,到中午吃完飯回來就又出現了,所以應該不是防火牆的問題:

Error contacting service. It is probably not running.

  • 開啟zkServer.sh 找到

status)
STAT=echo stat | nc localhost $(grep clientPort "$ZOOCFG" | sed -e 's/.*=//') 2> /dev/null| grep Mode

nclocalhost之間加上 -q 1(是數字1而不是字母l).如果已存在則去掉。
// 但是我的zkServer.sh中沒有這一行。

  • 2181埠被佔用
    使用netstat -anp | grep 12181檢視,確實發現有程式佔用這個埠,但是kill掉以後還是不能啟動zookeeper。

於是我不再管虛擬機器1,又依次開啟虛擬機器2 和虛擬機器3,其中虛擬機器2和虛擬機器1一樣,都是:

Error contacting service. It is probably not running.

但是神奇的事情發生了,我開啟虛擬機器3的時候,是成功的,值得注意的是這裡顯示的zookeeper狀態時leader:

[[email protected] bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/zookeeper-3.4.11/bin/../conf/zoo.cfg
Mode: leader

也就是說虛擬機器3所在的zookeeper節點是leader,然後再開啟虛擬機器2和虛擬機器1,就沒問題了。但是不知道為什麼虛擬機器3預設為leader,可能我之前在哪裡配置過我不記得了(可能性不大),也可能跟zookeeper選舉leader的機制有關係,這個需要深入瞭解。
不過現在可以得出這樣的結論:zookeeper的開啟順序是有要求的,要先開啟leader,剩下的節點才能正常啟動。

成功執行後,三臺虛擬機器,一臺是leader,另外兩臺是follower。

  • 2.每個節點都是standalone的

這個問題是由於zoo.cfg檔案中的server寫錯了,寫成了servers。所以server寫錯可能導致zookeeper執行在單機模式下。

  • 3.失敗之後要殺死原先的錯誤程序

啟動失敗之後,再次啟動就會一直報already running as process 1854,這樣的錯誤,現在的你把問題找到,修改檔案或問題,要求重新啟動,必須先kill 1845這個程序,然後在正常啟動就行了

相關推薦

虛擬機器搭建zookeeper叢集

一、什麼是zookeeper(摘自百度百科) ZooKeeper是一個分散式的,開放原始碼的分散式應用程式協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要元件。它是一個為分散式應用提供一致性服務的軟體,提供的功能包括:配置維護、域名服務

使用3虛擬機器搭建Hadoop HA叢集(1)

系列部落格目錄連結:Hadoop權威指南學習筆記:總章 基礎環境搭建:使用3臺虛擬機器搭建Hadoop HA叢集(1) HA環境搭建:使用3臺虛擬機器搭建Hadoop HA叢集(2) 工欲善其事,必先利其器,要學好大資料,就必須首先學會自己動手

使用3虛擬機器搭建Hadoop HA叢集(2)

系列部落格目錄連結:Hadoop權威指南學習筆記:總章 基礎環境搭建:使用3臺虛擬機器搭建Hadoop HA叢集(1) HA環境搭建:使用3臺虛擬機器搭建Hadoop HA叢集(2) 本部分包含以下基本分內容 安裝部署zookeeper

VMWare搭虛擬機器叢集、負載均衡、主從資料庫一

最近一時興起,想搭建幾臺虛擬機器做負載均衡和資料庫主從等高階功能研究。不做安全性和其它考慮。這裡主要是為了以後測試高階的功能。 目前的想法是實現下面幾個功能: 1、負載均衡服務,能承受大量的併發訪問 2、分存式快取,以後多的東西肯定放快取裡面。 3、主從資料庫或者資料庫讀

VM下如何複製一虛擬機器(便於叢集下快速建立虛擬機器

需求 假設我現在想要搭一個三臺伺服器的zookeeper叢集,但是現在只有兩臺Linux的虛擬機器,我想在已有的虛擬機器上快速複製一臺新的虛擬機器。 現在,我用zookeeper02複製出zookeeper03出來。 操作步驟 1》在已有的虛擬機器下

linux 虛擬機器環境搭建

自己做個筆記,擔心以後又忘了。 一、新建虛擬機器 我用的是VMware Workstation虛擬機器軟體,打算裝的是64位的centos6.4。下載神馬的就不說了,這裡提一下,centos有兩個iso檔案,安裝系統,只用第一個就行了(CentOS-6.4-x86_64-b

利用虛擬機器搭建hadoop叢集

概述 在搭建hadoop叢集時,主要參考了網上的幾篇部落格,但也遇到一些問題。 點選原文 問題一:core-site.xml檔案中的錯誤 <property> <name>hadoop.tmp.dir</name>

虛擬機器之間實現免密碼登陸

多臺虛擬機器之間實現免密碼登陸 過程分析 1 虛擬機器生成金鑰 本文以node01,node02兩臺虛擬機器做示範 生成金鑰 ssh-keygen -t rsa 回車三次 2. 檢視生成公鑰: 1.r

虛擬機器搭建hadoop叢集

1.虛擬機器安裝系統(個人安裝系統是centos 6.x final版) 1.在虛擬機器安裝了三個系統(centos 6.x final版的)目前兩個都是安裝的,一個是在檔案複製的。 2. 安裝完系統後開始安裝rz命令包(由於系統在window系統用crt操作linux系

微信棋牌原始碼虛擬機器搭建Hadoop叢集

虛擬機器搭建Hadoop叢集安裝包準備作業系統:ubuntu-16.04.3-desktop-amd64.iso軟體包:VirtualBox安裝包:hadoop-3.0.0.tar.gz,jdk-8u161-linux-x64.tar.gz1. 環境準備使用VirtualBo

3虛擬機器搭建Hadoop HA

1.修改Linux主機名 2.修改IP 3.修改主機名和IP的對映關係 4.關閉防火牆 5.ssh免登陸 6.安裝JDK,配置環境變數等 叢集規劃: 主機名 IP 安裝的軟體 執行的程序 3臺虛擬機器 node1 jdk、hadoop、zookeeper zookee

虛擬機器的ip設定及相互訪問

1、網路介面卡的模式,改成橋接模式; 2、ip的設定: DEVICE="eth0" BOOTPROTO="static"                        # 原先是DHCP, 要改成static BROADCAST="192.168.1.255" DNS1=

基於Virtualbox虛擬機器搭建hadoop叢集環境

1.1安裝centos7 在centos官網下載centos7映象檔案,在Virtualbox軟體中匯入映象檔案進行安裝,本次由於實驗環境限制,只安裝了三臺centos7虛擬機器,分別命名為hadoop1,hadoop2,hadoop3,為保證三臺虛擬機器能夠正常通訊,三臺

linux虛擬機器模擬搭建zookeeper叢集及可能遇到的問題解決

一、zookeeper叢集搭建 1:上傳zookeeper-3.4.13.tar.gz到/myfile/tool(自己定義的存放工具的目錄)目錄下: 2:解壓zookeeper,執行如下命令: [[email protected] tool]# tar

使用ECS搭建zookeeper叢集時啟動叢集每一都有QuorumPeerMain程序但是無法選舉的問題

        我在使用3臺ECS搭建zookeeper叢集的時候成功啟動了QuorumPeerMain程序但是伺服器之間無法連線報connection refused錯誤,嘗試更改伺服器的安全組策略失敗。      &

虛擬機器搭建叢集(三虛擬機器

1、將各節點的IP和hostname加入到每個節點的/etc/hosts中 echo 192.168.63.141 admin-node >> /etc/hosts echo 192.168.63.142 ceph-node1 >> /etc/

zookeeper-3.4.7 環境搭建 (偽分散式環境三虛擬機器

樓主小白 ,本帖給自已以後重灌留點記憶。希望能幫到他人。本人實驗切實可行 。環境準備 hadoop-2.7.5(搭建完成) ,centos 6.5  ,zookeeper-3.4.7.tar.gz  1.準備安裝目錄為 /home/ywh   (cd )  2.解壓縮 zoo

kubernetes 簡單叢集搭建(2虛擬機器

之前做的實驗都是單臺伺服器上進行,最近做到需要在其它節點部署pod master部署可以參考之前的文件,node節點上只需要啟動兩個程序。首先安裝軟體:yum install etcd kubernetes -y 兩臺節點ip: 192.168.1.82

虛擬機器搭建haddoop、zookeeper、hbase叢集

安裝jdk 開啟一個虛擬機器,右鍵單擊桌面選擇Open in Terminal,進入編輯介面: 1.假設使用者名稱是wxx(獲取root許可權) (1)使wxx成為sudoer        su  cd  /etc vi  sudoers    i

Centos 7下VMware三虛擬機器Hadoop叢集初體驗

一、下載並安裝Centos 7   傳送門:https://www.centos.org/download/      注:下載DVD ISO映象 這裡詳解一下VMware安裝中的兩個過程 網絡卡配置 二、SecureCRT遠端操控 p