在同一臺機器(即僞集羣)上,啓動三個zookeeper,三個分別使用不同的配置文件
Zookeeper的單機版安裝
從官網上下載zookeeper的安裝包
1 準備:安裝之前請自行安裝jdk(如java8)
2 使用wget 命令或者xshell editplus工具遠程上傳tar包到Linux
(1)使用wget 命令下載zookeeper安裝包到linux環境下
命令: wget http://archive.apache.org/dist/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
(2)推薦方法zookeeper-3.4.14.tar.gz(或者zookeeper-3.4.6.tar.gz等自己選擇下載):
點擊下載: https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/
3 解壓zookeeper到安裝目錄(安裝目錄自己指定如:/usr/local/zk-standalone/)
tar -zxvf zookeeper-3.4.14.tar.gz -C /usr/local/zk-standalone/
重命名:
mv zookeeper-3.4.14.tar.gz zookeeper
進入到zookeeper的conf目錄
cd zookeeper/conf/ && cp zoo_sample.cfg zoo.cfg
有三個文件,zookeeper的配置文件叫做zoo.cfg,這裏邊沒有,我們把 zoo_sample.cfg 拷貝一份出來,
使用vim 編輯器編輯zoo.cfg 這是原本的配置,
我們需要更改的地方有以下幾點
dataDir是zookeeper的數據目錄,可以任意選擇,但是這個目錄必須要提前創建好,zookeeper是不會幫你創建的
dataDir=/usr/local/zk-standalone/zookeeper3/data
dataLogdir是zookeeper的日誌目錄,應該要謹慎的選擇日誌目錄,目錄必須要提前創建好,如果將日誌存放在比較繁忙的設備上,將大大影響系統性能
dataLogDir=/usr/local/zk-standalone/zookeeper3/logData限制zookeeper的客戶端鏈接數量,設置爲0或者不設置表示取消對併發連接的設置
maxClientCnxns=0
最小會話超時時間和最大會話超時時間
minSessionTimeout=4000
maxSessionTimeout=10000server.id 其中1表示這是第幾號server,用來做集羣中的區別的192.168.9.103是該server所在的ip地址
2888是該server和集羣中的leader通信端口,3888是選舉leader的端口
server.1=zkcluster:2881:3881
注意:
指定主機名和ip映射關係=>Linux下/etc/hosts文件
寫入如:192.168.9.103 zkcluster
在之前設置的dataDir中新建myid文件,寫入一個數字,該數字表示這是第幾號server,該數字必須和zoo.cfg文件中的server.X中的X一 一對應
#在dataDir中創建myid文件並寫入 1
echo 1 >myid
#查看myid
cat myid
更改後的文件如下
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/usr/local/zk-standalone/zookeeper3/data
logDataDir=/usr/local/zk-standalone/zookeeper3/logData
# 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
進入到zookeeper的安裝目錄 執行bin/zkServer.sh start
如圖所示,使用jps命令查看進程是否啓動成功
出現 QuorumPeerMain這個進程的時候就說明zookeeper已經安裝成功了
[root@sh_c zk-cluster]# jps
42913 QuorumPeerMain
43081 Jps
接下里進入zookeeper的客戶端查看
進入zookeeper的安裝目錄執行bin/zkCli.sh
執行ls / 查看當前根目錄下的節點 發現有一個zookeeper的節點
至此zookeeper的單機版安裝成功!
集羣版
(1)安裝JDK 【此步驟省略】。
(2)Zookeeper壓縮包上傳到服務器
(3)將Zookeeper解壓 ,創建data目錄 ,將 conf下zoo_sample.cfg 文件改名爲 zoo.cfg
(4)建立/usr/local/zookeeper-cluster目錄,將解壓後的Zookeeper複製到以下三個目錄
/usr/local/zookeeper-cluster/zookeeper-1
/usr/local/zookeeper-cluster/zookeeper-2
/usr/local/zookeeper-cluster/zookeeper-3
配置每一個Zookeeper 的dataDir(zoo.cfg) clientPort 分別爲2181 2182 2183
修改/usr/local/zookeeper-cluster/zookeeper-1/conf/zoo.cfg
clientPort=2181 dataDir=/usr/local/zookeeper-cluster/zookeeper-1/data dataLogDir=/usr/local/zk-cluster/zookeeper-1/logData |
修改/usr/local/zookeeper-cluster/zookeeper-2/conf/zoo.cfg
clientPort=2182 dataDir=/usr/local/zookeeper-cluster/zookeeper-2/data dataLogDir=/usr/local/zk-cluster/zookeeper-2/logData |
修改/usr/local/zookeeper-cluster/zookeeper-3/conf/zoo.cfg
clientPort=2183 dataDir=/usr/local/zookeeper-cluster/zookeeper-3/data dataLogDir=/usr/local/zk-cluster/zookeeper-3/logData |
2.2.3配置集羣
- 在每個zookeeper的 data 目錄下創建一個 myid 文件,內容分別是1、2、3 。這個文件就是記錄每個服務器的ID
-------知識點小貼士------ 如果你要創建的文本文件內容比較簡單,我們可以通過echo 命令快速創建文件 格式爲: echo 內容 >文件名 例如我們爲第一個zookeeper指定ID爲1,則輸入命令
|
(2)在每一個zookeeper 的 zoo.cfg配置客戶端訪問端口(clientPort)和集羣服務器IP列表。
集羣服務器IP列表如下
server.1=192.168.25.140:2881:3881 server.2=192.168.25.140:2882:3882 server.3=192.168.25.140:2883:3883 |
解釋:server.服務器ID=服務器IP地址:服務器之間通信端口:服務器之間投票選舉端口
2.2.4啓動集羣
啓動集羣就是分別啓動每個實例。
啓動後我們查詢一下每個實例的運行狀態
先查詢第一個服務Mode爲follower表示是跟隨者(從)
再查詢第二個服務Mod 爲leader表示是領導者(主)
查詢第三個爲跟隨者(從)
2.2.5模擬集羣異常
(1)首先我們先測試如果是從服務器掛掉,會怎麼樣
把3號服務器停掉,觀察1號和2號,發現狀態並沒有變化
由此得出結論,3個節點的集羣,從服務器掛掉,集羣正常
(2)我們再把1號服務器(從服務器)也停掉,查看2號(主服務器)的狀態,發現已經停止運行了。
由此得出結論,3個節點的集羣,2個從服務器都掛掉,主服務器也無法運行。因爲可運行的機器沒有超過集羣總數量的半數。
- (3)我們再次把1號服務器啓動起來,發現2號服務器又開始正常工作了。而且依然是領導者。
- (4)我們把3號服務器也啓動起來,把2號服務器停掉(汗~~幹嘛?領導掛了?)停掉後觀察1號和3號的狀態。發現新的leader產生了~
由此我們得出結論,當集羣中的主服務器掛了,集羣中的其他服務器會自動進行選舉狀態,然後產生新得leader
(5)我們再次測試,當我們把2號服務器重新啓動起來(汗~~這是詐屍啊!)啓動後,會發生什麼?2號服務器會再次成爲新的領導嗎?我們看結果
我們會發現,2號服務器啓動後依然是跟隨者(從服務器),3號服務器依然是領導者(主服務器),沒有撼動3號服務器的領導地位。哎~退休了就是退休了,說了不算了,哈哈。
由此我們得出結論,當領導者產生後,再次有新服務器加入集羣,不會影響到現任領導者。
error 錯誤
安裝zookeeper時候,可以查看進程啓動,但是狀態顯示報錯:Error contacting service. It is probably not running
安裝zookeeper-3.4.6的時候,啓動正常沒報錯,但zkServer.sh status查看狀態的時候卻出現錯誤,如下:
JMX enabled by default
Using config: /hadoop/zookeeper/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.
jps查看進程,卻發現進程已啓動
7313 QuorumPeerMain
如:沒有jps命令時
安裝open-jdk後發現jps不能用,此時需要安裝另外一個包才能使用
通過以下命令進行安裝:
sudo yum install java-1.8.0-openjdk-devel.x86_64
在網上查閱資料一共有三種解決方法:
如果配置了日誌(dataLogDir=/usr/local/zk-cluster/zookeeper-1/logData)可以首先查看日誌記錄
1,打開zkServer.sh 找到status)
STAT=`echo stat | nc localhost $(grep clientPort "$ZOOCFG" | sed -e 's/.*=//') 2> /dev/null| grep Mode`
在nc與localhost之間加上 -q 1 (是數字1而不是字母l)
如果已存在則去掉
注:因爲zookeeper是3.4.5版本,所以在我的zkServer.sh腳本文件里根本沒有這一行,所以沒有生效2,調用sh zkServer.sh status 遇到這個問題。百度,google了後發現有人是修改sh腳本里的一個nc的參數來解決,可在3.4.5的sh文件裏並沒有找到nc的調用。配置文檔裏指定的log目錄沒有創建導致出錯,手動增加目錄後重啓,問題解決。
注:我想不是日誌的問題所以這個方法根本就沒有試3,創建數據目錄,也就是在你zoo.cfg配置文件裏dataDir指定的那個目錄下創建myid文件,並且指定id,改id爲你zoo.cfg文件中server.1=localhost:2888:3888中的 1.只要在myid頭部寫入1即可.
注:在我第二次安裝的時候,沒有將myid文件創建在dataDir指定的那個目錄下,也報了該錯誤。之後在dataDir指定的那個目錄下創建myid文件就沒有報錯。4 因爲防火牆沒有關閉。關閉防火牆:
#查看防火牆狀態
service iptables status 或者systemctl status iptables
#關閉防火牆
service iptables stop 或者 systemctl stop iptables
#查看防火牆開機啓動狀態
chkconfig iptables --list
#關閉防火牆開機啓動
chkconfig iptables off注意:我的確在開始時候沒有關閉防火牆,但是當我關閉防火牆之後也沒有解決問題。
5 沒有建立主機和ip之間的映射關係。
建立主機和ip之間映射關係的命令爲 vim /etc/hosts 在文件的末端加入各個主機和ip地址之間的映射關係就可以了。
注意:只有在建立了映射關係之後,纔可以將在同一個網段下的機器利用主機名進行文件傳遞。問題解決!
Linux的/etc/hosts文件