1. 程式人生 > >ZooKeeper分散式叢集部署及問題

ZooKeeper分散式叢集部署及問題

    ZooKeeper為分散式應用系統提供了高效能服務,在很多常見的叢集服務中被廣泛使用,最常見的當屬HBase叢集了,其它的還有Solr叢集,Hadoop-2中的HA自動故障轉移等。本文主要介紹了為HBase叢集部署ZooKeeper叢集的過程,並說明了部署過程中遇到的問題。

    預設情況下,由HBase管理ZooKeeper的啟動和停止,要想修改這一預設行為,需要將hbase-env.sh中的export HBASE_MANAGES_ZK=true改為export HBASE_MANAGES_ZK=false,並在啟動HBase之前先啟動ZooKeeper叢集。在${ZOOKEEPER_HOME}/conf中複製zoo_sample.cfg為zoo.cfg,並修改dataDir為用於儲存ZooKeeper資料的目錄,預設為/tmp/zookeeper。然後新增用於叢集的伺服器,格式為:server.1=hostname1:連線埠:選舉埠,其中的1為myid檔案中的值。比如對於擁有三個節點的ZooKeeper叢集,示例配置可能為:

server.1=CentOS-1:2888:3888
server.2=CentOS-2:2888:3888
server.3=CentOS-3:2888:3888
    對於ZooKeeper叢集配置,需要在啟動叢集之前在${ZOOKEEPER_HOME}/${dataDir}下建立myid檔案,檔案內容與server.x中的x對應,比如myid位於上述示例中的CentOS-1中,則內容必須為1。CentOS-2、CentOS-3上的myid檔案內容分別為2、3。如果在叢集啟動之前沒有建立myid檔案,在啟動時會報如下的錯誤:
2015-07-03 15:37:40,877 [myid:] - ERROR [main:
[email protected]
] - Invalid config, exiting abnormally org.apache.zookeeper.server.quorum.QuorumPeerConfig$ConfigException: Error processing /home/search/zookeeper-3.4.6/bin/../conf/zoo.cfg at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:123) at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:101) at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:78) Caused by: java.lang.IllegalArgumentException: /HData/zookeeper/myid file is missing at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseProperties(QuorumPeerConfig.java:350) at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:119) ... 2 more Invalid config, exiting abnormally

    在每臺ZooKeeper節點對ZooKeeper進行修改完畢後,由於ZooKeeper沒有start-hbase或者start-dfs類似的啟動所有節點的指令碼,所以必須在每臺伺服器上分別執行${ZOOKEEPER_HOME}/bin/zkServer.sh start啟動ZooKeeper。啟動完畢後可以執行${ZOOKEEPER_HOME}/bin/zkServer.sh status檢查狀態,比如:

JMX enabled by default
Using config: /application/search/zookeeper/bin/../conf/zoo.cfg
Mode: follower

    ZooKeeper叢集成功啟動後,需要修改hbase-site.xml中的引數hbase.zookeeper.quorum,使其值包含所有ZooKeeper節點,比如CentOS-1,CentOS-2,CentOS-3,之間用逗號分隔。

    而對於單節點的ZooKeeper來說,則不需要在配置檔案zoo.cfg中設定伺服器相關的資訊,即不需要設定server.x,因而也就無需建立對應的myid檔案。對於單節點的ZooKeeper還有一個問題需要注意,該問題屬於ZooKeeper本身的一個Bug,但已經在版本3.4.7, 3.5.2, 3.6.0中修復,具體可參考ZOOKEEPER-832,異常資訊如下:

2015-07-22 13:00:23,286 [myid:] - INFO  [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:[email protected]] - Accepted socket connection from /10.10.32.223:15489
2015-07-22 13:00:23,286 [myid:] - INFO  [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:[email protected]] - Refusing session request for client /10.10.32.223:15489 as it has seen zxid 0x210d711 our last zxid is 0x26ca client must try another server
2015-07-22 13:00:23,287 [myid:] - INFO  [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:[email protected]] - Closed socket connection for client /10.10.32.223:15489 (no session established for client)

    該問題是由於修改了ZooKeeper的${dataDir}目錄到新目錄或者刪除目錄中的檔案引起的。

    在部署ZooKeeper時還遇到了日誌輸出的問題,在不做任何與日誌有關的修改時,會將ZooKeeper日誌輸出到單一的zookeeper.out檔案,如果長時間執行,將導致該檔案非常巨大,對其檢視將非常不方便,因此需要修改zkEnv.sh、log4j.properties。對zkEnv.sh做如下的修改,分別指定日誌儲存的目錄,日誌輸出的級別及輸出的地方:

if [ "x${ZOO_LOG_DIR}" = "x" ]
then
    #ZOO_LOG_DIR="." #預設值為當前目錄
    ZOO_LOG_DIR="/HData/log/zookeeper/"
fi
if [ "x${ZOO_LOG4J_PROP}" = "x" ]
then
    #ZOO_LOG4J_PROP="INFO,CONSOLE"
    ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
fi

    然後修改log4j.properties檔案,註釋部分為原有值,新增部分取代了原有值:

#zookeeper.root.logger=INFO, CONSOLE
zookeeper.root.logger=INFO.ROLLINGFILE #日誌輸出的級別及輸出的地方
#log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLINGFILE=org.apache.log4j.DailyRollingFileAppender #日誌檔案的appender
# Max log file size of 10MB
#log4j.appender.ROLLINGFILE.MaxFileSize=10MB #禁用該屬性
# uncomment the next line to limit number of backup files
#log4j.appender.ROLLINGFILE.MaxBackupIndex=10

    做完上述部分的修改後,ZooKeeper將日誌輸出到${ZOO_LOG_DIR}/zookeeper.log中,每天都會生成新的日誌檔案,並將之前的檔案重新命名為zookeeper.log.2015-07-22。即使做了上述修改依然會生成zookeeper.out,儘管此時該檔案的內容為空,但對於不喜歡該檔案的使用者來說,則需要修改zkServer.sh檔案,將下面的行替換如下,這樣就不會在日誌目錄中存在zookeeper.out檔案。

nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
-cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &

nohup $JAVA "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
    -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > /dev/null 2>&1 < /dev/null &

    本文簡要描述了ZooKeeper叢集的部署安裝,並分析了安裝過程中遇到的問題,最後說明了如何修改ZooKeeper的預設日誌配置,以使日誌輸出到指定目錄和檔案中。

相關推薦

ZooKeeper分散式叢集部署問題

    ZooKeeper為分散式應用系統提供了高效能服務,在很多常見的叢集服務中被廣泛使用,最常見的當屬HBase叢集了,其它的還有Solr叢集,Hadoop-2中的HA自動故障轉移等。本文主要介紹了為HBase叢集部署ZooKeeper叢集的過程,並說明了部署過程中遇到的

快速入門Zookeeper分散式叢集部署

一、叢集規劃 在hadoop01、hadoop02、hadoop03三個節點上部署Zookeeper。 二、解壓安裝 1、將"/home/hadoop/tools/“目錄下的壓縮包解壓到”/home/hadoop/install/"目錄下 tar -zxf zookeeper

Redis分散式叢集部署安裝細節(一臺主機搭建多個服務--偽叢集

Redis分散式叢集部署安裝及細節  一: redis cluster介紹篇 1:redis cluster的現狀 目前redis支援的cluster特性(已親測): 1):節點自動發現 2):slave->master選舉,叢集容錯 3):Hotreshar

Redis分散式叢集部署安裝細節(多主機搭建叢集開啟多個服務)

注意: redis的安裝步驟與同機器下一致,這裡只講解個別不同配置的修改 每臺主機都有固定的IP 10.25.84.105SZD-L0073672   此臺機器部署了多個服務 10.25.84.106SZD-L0073671   10.25.84.69  SZD-L007

redis 叢集部署分散式鎖的實現

一、redis叢集的部署安裝redis確保安裝資料夾有redis-trib.rb檔案,通過rudy構建redis叢集安裝ruby環境配置好環境變數,gem install redis 安裝redis依賴詳細環境安裝教程:點選開啟連結叢集搭建      redis叢集最小包含3

13、Zookeeper 分散式叢集管理技術

1.Zookeeper 簡介 Zookeeper 分散式服務框架主要是用來解決分散式應用中經常遇到的一些資料管理問題,提供分散式、高可用性的協調服務能力,在 FusionInsight 叢集中主要用途是儲存上層元件的元資料,並保證其主備倒換。 Zookeeper 的作用 (1)

RabbitMQ高可用叢集部署配置+HAproxy負載(原始碼)

1.環境 rabbitmq-1 10.24.43.4 centos6.x rabbitmq-2 10.24.43.5 centos6.x 2.

hadoop3.1 分散式叢集部署

1.環境準備 Centos7.5系統 hadoop版本3.1 1.1資源分配 主機名 地址

使用Mycat叢集部署Haproxy負載均衡

目的 外界將讀寫請求發給Haproxy,Haproxy將請求分發給mycat可用節點,mycat伺服器再根據讀或寫向mysql伺服器進行資料操作。 前提 在之前mycat代理mysql讀寫分離的基礎上進行配置 haproxy 119.23.237.241  mycat_

Hadoop2.7.1 叢集部署自動化指令碼

                     實驗環境作業系統:ubuntu 14.04 64位                    主機名IPnamenode10.107.12.10datanode110.107.12.20datanode210.107.12.50datanode310.107.12.60j

基於Hadoop分散式叢集部署Hive2.3

1. 基於docker安裝mysql 由於自己以前在Ubuntu kylin 16.04的系統上安裝mysql5.7一直有問題,後來學會了使用docker安裝mysql。覺得這個方法很方便,所以這次繼續使用docker安裝mysql。 ① 安裝docker 參考

Zookeeper+Kafka叢集部署

主機規劃: 10.200.3.85    Kafka+ZooKeeper 10.200.3.86    Kafka+ZooKeeper 10.200.3.87    Kafka+ZooKeeper 軟體下載地址: #wget http://mirrors.hust.

Zookeeper——分散式叢集搭建

準備伺服器 - 192.168.214.150 centos6-1 - 192.168.214.151 centos6-2 - 192.168.214.152 centos6-3 Java環境 檢視java版本 [root@cent

Kafka叢集部署命令列操作

1、叢集規劃 hadoop102                                 hadoop103                          hadoop104 zk                                      

hadoop偽分散式叢集搭建配置記錄

如果已經走到了需要搭建hadoop偽分散式的環境了,那說明你至少做好了以下三點建立好了自己的虛擬機器,ip、本機名對映、防火牆、安全子系統都已經配置好了下載jdk1.7及以上版本,並配置好了java環境下載hadoop2.7.0及以上版本,並解壓到、opt/modules(自

hadoop完全分散式叢集部署

實驗環境: 172.25.66.1 namenode節點(上一篇部落格已部署成功) 172.25.66.2 datanode 節點 172.25.66.3 datanode節點 server1: 1.停掉之前的hdfs和yarn叢集 2.安裝nfs服務,進行檔案共享

Linux下搭建Zookeeper分散式叢集(詳細圖解演示)

一:實驗環境搭建.       1.1 Linux使用的是CentOS7.3的發行版,Zookeeper的版本是3.4.12.搭建三個節點的叢集,是分別在三臺虛擬機器上配置Zookeeper節點,不是在一臺虛擬機器上搭建的三個Zookeepe

rabbitmq叢集部署配置

訊息中介軟體rabbitmq,一般以叢集方式部署,主要提供訊息的接受和傳送,實現各微服務之間的訊息非同步。本篇將以rabbitmq+HA方式進行部署。 一、原理介紹 rabbitmq是依據erlang的分散式特性(RabbitMQ底層是通過Erlang架構來實現的,所以ra

部署Hadoop環境(四)HBase分散式叢集部署與設計

HBase是一個高可靠、高效能、面向列、可伸縮的分散式儲存系統,利用Hbase技術可在廉價PC Server上搭建 大規模結構化儲存叢集。 HBase 是Google Bigtable 的開源實現,與Google Bigtable 利用GFS作為其檔案儲存系統類似, HBase 利用Hado

zookeeper叢集部署

1.把單個的zookeeper  copy3份 2.在每個zookeeper的data目錄下執行命令 echo  >   1   myid echo  >   2  myid echo  >   3   myid 3.修改每個zookeeper的