1. 程式人生 > >Zookeeper叢集設計與安裝部署(最完整版)

Zookeeper叢集設計與安裝部署(最完整版)

首先準備好3個節點分別為hadoop01、hadoop02、hadoop03,接下來帶著大家一起搭建最小規模的Zookeeper分散式叢集。

1.叢集規劃

1.1主機規劃

使用準備的3個節點,搭建一個最小規模的Zookeeper分散式叢集。

帶你一起實現Zookeeper叢集設計與部署

1.2軟體規劃

為了方便叢集各個元件相容性管理,這裡選擇一個CDH穩定版本的zookeeper-3.4.5-cdh5.10.0.tar.gz,軟體規劃如下圖所示。

帶你一起實現Zookeeper叢集設計與部署

1.3使用者規劃

在每個節點規劃好自己的使用者和使用者組,為後面在哪個使用者下安裝Zookeeper做好準備。

帶你一起實現Zookeeper叢集設計與部署

1.4目錄規劃

我們規劃大資料相關軟體統一放在app目錄下,指令碼統一放在tools目錄下,日誌資料放在data目錄下。

帶你一起實現Zookeeper叢集設計與部署

2.環境準備

2.1時鐘同步

使用上海時間覆蓋本地時間

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

使用NTP(網路時間協議)實現時鐘同步

#線上安裝ntp

yum install ntp

#網路時間同步

ntpdate pool.ntp.org

2.2Hosts 檔案配置

一般情況下通過主機名是無法訪問虛擬機器的,需要通過IP地址才可以訪問虛擬機器。但是IP地址不容易記住,這時可以通過配置主機名與IP地址的對映關係,從而可以通過主機名來訪問虛擬機器。

為了方便各個節點相互通過主機名訪問,每個節點都需要相同配置。修改示例如下所示:

vi /etc/hosts

192.168.20.121 hadoop01

192.168.20.122 hadoop02

192.168.20.123 hadoop03

2.3關閉防火牆

防火牆是對我們的伺服器進行的一種保護,但是有時候也會妨礙叢集間的相互通訊,為了方便起見我們可以關閉掉防火牆。

針對centos6.x各個節點防火牆操作如下所示:

#檢視防火牆狀態

service iptables status

#永久關閉防火牆

chkconfig iptables off

#臨時關閉防火牆

service iptables stop

備註:如果使用centos7,以上命令不適用。

2.4SSH免密碼登入

2.4.1首先對每個節點單獨配置ssh免密碼登入

下面以hadoop01節點為例:

切換到使用者根目錄操作,生成祕鑰

mkdir .ssh

ssh-keygen -t rsa

進入.ssh目錄,將公鑰拷貝到認證檔案

cd .ssh

cat id_rsa.pub >> authorized_keys

退回到根目錄,對.ssh賦予許可權

chmod 700 .ssh

chmod 600 .ssh/*

測試當前節點ssh免密碼登入

ssh hadoop01

2.4.2實現各個節點之間免密碼登入

將hadoop02和hadoop03的共鑰id_ras.pub拷貝到hadoop01中的authorized_keys檔案中。

cat ~/.ssh/id_rsa.pub | ssh [email protected] 'cat >> ~/.ssh/authorized_keys'

然後將hadoop01中的authorized_keys檔案分發到hadoop02和hadoop03節點上面。

scp -r authorized_keys [email protected]:~/.ssh/

scp -r authorized_keys [email protected]:~/.ssh/

然後hadoop01、hadoop02和hadoop03就可以免密碼互通

2.5叢集指令碼準備

2.5.1編寫配置檔案及叢集指令碼

選一個主節點,比如hadoop01,建立/home/hadoop/tools指令碼存放目錄

mkdir /home/hadoop/tools

分別編寫指令碼配置檔案和分發檔案

deploy.conf deploy.sh runRemoteCmd.sh

deploy.conf 具體內容如下所示:

#### NOTES
# There is crontab job using this config file which would compact log files and remove old log file.
# please be carefully while modifying this file until you know what crontab exactly do
#hdp
hadoop01,all,namenode,zookeeper,resourcemanager,
hadoop02,all,slave,namenode,zookeeper,resourcemanager,
hadoop03,all,slave,datanode,zookeeper,

備註:第一列為各個節點的主機名,其他列為自己對各個節點打的標籤。

deploy.sh具體內容如下所示:

#!/bin/bash
#set -x
if [ $# -lt 3 ]
then 
 echo "Usage: ./deply.sh srcFile(or Dir) descFile(or Dir) MachineTag"
 echo "Usage: ./deply.sh srcFile(or Dir) descFile(or Dir) MachineTag confFile"
 exit 
fi
src=$1
dest=$2
tag=$3
if [ 'a'$4'a' == 'aa' ]
then
 confFile=/home/hadoop/tools/deploy.conf
else 
 confFile=$4
fi
if [ -f $confFile ]
then
 if [ -f $src ]
 then
 for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'` 
 do
 scp $src $server":"${dest}
 done 
 elif [ -d $src ]
 then
 for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'` 
 do
 scp -r $src $server":"${dest}
 done 
 else
 echo "Error: No source file exist"
 fi
else
 echo "Error: Please assign config file or run deploy.sh command with deploy.conf in same directory"
fi

備註:該指令碼為叢集分發指令碼,可以快速、方便地將主節點的檔案或者目錄分發到其他從節點。

runRemoteCmd.sh具體內容如下所示:

#!/bin/bash
#set -x
if [ $# -lt 2 ]
then 
 echo "Usage: ./runRemoteCmd.sh Command MachineTag"
 echo "Usage: ./runRemoteCmd.sh Command MachineTag confFile"
 exit 
fi
cmd=$1
tag=$2
if [ 'a'$3'a' == 'aa' ]
then
 
 confFile=/home/hadoop/tools/deploy.conf
else 
 confFile=$3
fi
if [ -f $confFile ]
then
 for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'` 
 do
 echo "*******************$server***************************"
 ssh $server "source ~/.bashrc; $cmd"
 done 
else
 echo "Error: Please assign config file or run deploy.sh command with deploy.conf in same directory"
fi

備註:該指令碼為叢集遠端命令執行指令碼,方便在各個節點分別執行傳入的命令。

2.5.2給指令碼新增執行許可權

分別給以下指令碼新增執行許可權

chmod u+x deploy.sh

chmod u+x runRemoteCmd.sh

2.5.3配置指令碼環境變數

vi ~/.bashrc

PATH=/home/hadoop/tools:$PATH

export PATH

2.5.4使用指令碼建立規劃目錄

批量建立各個節點相應目錄

runRemoteCmd.sh "mkdir /home/hadoop/app" all

runRemoteCmd.sh "mkdir /home/hadoop/data" all

3.JDK安裝

Zookeeper是由Java編寫,執行在JVM上,所以需要提前安裝JDK執行環境。

3.1下載JDK

可以到官網下載對應版本的jdk,這裡選擇安裝jdk1.8版本,並上傳至主節點(hadoop01)/home/hadoop/app目錄下。

3.2解壓JDK

通過tar -zxvf命令對jdk安裝包進行解壓即可。

3.3建立軟連線

為了方便版本的更換和學習使用,可以建立jdk軟連線指向jdk真實安裝路徑。可以使用如下命令:ln -s jdk1.8.0_51 jdk

3.4配置環境變數

3.4.1修改/etc/profile檔案

如果你的計算機僅僅作為開發使用時推薦使用這種方法,因為所有使用者的shell都有權使用這些環境變數,可能會給系統帶來安全性問題。 這裡是針對所有的使用者的,所有的shell。

vi /etc/profile
JAVA_HOME=/home/hadoop/app/jdk
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:/home/hadoop/tools:$PATH
export JAVA_HOME CLASSPATH PATH

3.4.2修改.bashrc檔案

這種方法更為安全,它可以把使用這些環境變數的許可權控制到使用者級別,這裡是針對某一個特定的使用者,如果你需要給某個使用者許可權使用這些環境變數,你只需要修改其個人使用者主目錄下的.bashrc檔案就可以了。

vi ~/.bashrc
JAVA_HOME=/home/hadoop/app/jdk
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:/home/hadoop/tools:$PATH
export JAVA_HOME CLASSPATH PATH

3.5使配置檔案生效

通過source ~/.bashrc命令使得剛剛配置的環境變數生效。

3.6驗證JDK是否安裝成功

通過命令:java –version檢視jdk版本,如果能檢視到當前jdk版本,說明jdk安裝成功

3.7JDK安裝包同步到其他節點

通過指令碼命令:deploy.sh jdk1.8.0_51 /home/hadoop/app/ slave將jdk安裝包同步到其他節點,然後重複3.3~3.6步驟完成各個節點的jdk安裝。

4.Zookeeper安裝部署

4.1下載Zookeeper

Apache版本下載地址:https://archive.apache.org/dist/

CDH版本下載地址:http://archive-primary.cloudera.com/cdh5/cdh/5/

下載對應版本Zookeeper,這裡下載zookeeper-3.4.5-cdh5.10.0.tar.gz版本,並上傳至/home/hadoop/app目錄下。

4.2解壓Zookeeper

通過tar -zxvf命令對Zookeeper安裝包進行解壓即可。

4.3建立軟連線

為了方便版本的更換和學習使用,可以建立zookeeper軟連線指向zookeeper真實安裝路徑。可以使用如下命令:ln -s zookeeper-xxx zookeeper

4.4修改zoo.cfg

4.4.1拷貝一份zoo.cfg配置檔案

預設情況下,Zookeeper的conf目錄沒有zoo.cfg,此時需要通過如下命令拷貝一份:

cp zoo_sample.cfg zoo.cfg

4.4.2修改zoo.cfg配置檔案

# The number of milliseconds of each tick
#這個時間是作為Zookeeper伺服器之間或客戶端與伺服器之間維持心跳的時間間隔
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
#配置 Zookeeper 接受客戶端初始化連線時最長能忍受多少個心跳時間間隔數。
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
#Leader 與 Follower 之間傳送訊息,請求和應答時間長度
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
#資料目錄需要提前建立
dataDir=/home/hadoop/data/zookeeper/zkdata
#日誌目錄需要提前建立
dataLogDir=/home/hadoop/data/zookeeper/zkdatalog
# the port at which the clients will connect
#訪問埠號
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
#server.每個節點服務編號=伺服器ip地址:叢集通訊埠:選舉埠
server.1=hadoop01:2888:3888
server.2=hadoop02:2888:3888
server.3=hadoop03:2888:3888

4.5zk安裝目錄同步到其他節點

將Zookeeper安裝目錄整體分發到其他節點

deploy.sh zookeeper-3.4.5-cdh5.10.0 /home/hadoop/app/ slave

並分別建立軟連線

ln -s zookeeper-3.4.5-cdh5.10.0 zookeeper

4.6建立規劃的目錄

使用叢集指令碼統一建立規劃目錄

runRemoteCmd.sh "mkdir -p /home/hadoop/data/zookeeper/zkdata" all

runRemoteCmd.sh "mkdir -p /home/hadoop/data/zookeeper/zkdatalog" all

4.7修改每個節點服務編號

分別到各個節點,進入/home/hadoop/data/zookeeper/zkdata目錄,建立檔案myid,裡面的內容分別填充為:1、2、3

[[email protected] zkdata]$ vi myid

[[email protected] zkdata]$ cat myid

1

[[email protected] zkdata]$ vi myid

[[email protected] zkdata]$ cat myid

2

[[email protected] zkdata]$ vi myid

[[email protected] zkdata]$ cat myid

3

4.8測試執行

啟動Zookeeper

runRemoteCmd.sh "/home/hadoop/app/zookeeper/bin/zkServer.sh start" all

檢視Zookeeper程序

runRemoteCmd.sh "jps" all

檢視Zookeeper狀態

runRemoteCmd.sh "/home/hadoop/app/zookeeper/bin/zkServer.sh status" all

如果檢視到Zookeeper節點狀態包含leader 和follower,說明Zookeeper叢集安裝成功。