服務器需要的系統環境
1.本文內容是在Linux(CentOS6.5)下搭建zookeeper集羣,若想了解在windows下如何搭建zookeeper集羣,可以移步到我的另一片文章zookeeper+kafka集羣
2.ZooKeeper使用java語言編寫,因此它的運行環境需要java環境的支持,本文中每個centos都安裝了JDK1.8.
ZooKeeper下載
zookeeper的官方下載地址是:http://www.apache.org/dyn/closer.cgi/zookeeper/
本文在CentOS6.5下使用的zookeeper是3.4.8版本,我上傳到了csdn上,歡迎下載zookeeper-3.4.8.tar.gz.
集羣與單機
ZooKeeper有兩種運行模式,一種是集羣模式,另外一種是單機模式.
1.集羣模式
我這邊使用虛擬機配合克隆功能,準備了三臺可以相互聯網的centos6.5的linux服務器.分別是:
ip1:192.168.199.100
ip2:192.168.199.101
ip3:192.168.199.102
這三臺服務器上都是安裝好了jdk1.8的環境,接下來是在這三臺服務器上分別安裝ZooKeeper服務器,這裏就只演示在ip1中的安裝操作,在ip2和ip3的機子上安裝操作同理.
在/usr/local下新建zookeeper目錄,並且將zookeeper.3.4.8.tar.gz在此解壓,並且修改zoo.cfg文件:
[#root] cd /usr/local
[#root] mkdir zookeeper
[#root] cd /root
[#root] cp zookeeper3.4.5.tar.gz /usr/local/zookeeper
[#root] cd /usr/local/zookeeper
[#root] tar xzvf zookeeper3.4.5.tar.gz
[#root] rm zookeeper3.4.5.tar.gz
[#root] cd zookeeper3.4.5
[#root] cd conf
[#root] mv zoo_sample.cfg zoo.cfg
對於zoo.cfg文件配置,這裏只做一個簡單即可,默認的zoo.cfg文件內容如下:
/var 包含系統一般運行時要改變的數據。通常這些數據所在的目錄的大小是要經常變化或擴充的。
/var/lib : 存放系統正常運行時要改變的文件。
對zoo.cfg文件做如下修改:
在集羣模式下,集羣中每臺機器都需要感知到整個集羣是由哪幾臺機器組成的,在配置文件中,可以按照以下格式進行配置,每一行代表一個機器配置:
server.id=host:port:port
id被稱爲ServerID,用來標識該機器在集羣走過的機器序號,在每臺ZooKeeper機器上,需要再dataDir參數指定的那個目錄下創建一個myid文件,該文件只有一行內容,對應於每臺機器的ServerID.例如,server.1的myid文件內容就是"1".
接下來,在dataDir指定的路徑下新建myid文件,並且填入server對應的id:
[#root] touch myid
[#root] vi myid
因爲server.1對應的是192.168.199.100這臺機子,所以在100這臺機子的myid文件填入1即可
按照相同步驟,爲101和102配置上zoo.cfg和myid文件.
啓動集羣,
依次進入每一個zookeeper機器的bin目錄下執行:(如果你配置好了環境變量,那麼可以直接使用zkServer.sh命令,不然的話需要在當前目錄下才能執行)
./zkServer.sh start
執行結果如下:
驗證服務器,啓動完成之後,可以使用telnet命令來測試:
安裝好zookeeper集羣之後想進入連接測試,telnet localhost 2181發現竟然提示沒有telnet這個命令,於是需要自己進行安裝。
一、查看本機是否安裝telnet
#rpm -qa | grep telnet
如果什麼都不顯示。說明你沒有安裝telnet
二、開始安裝
yum install xinetd
yum install telnet
yum install telnet-server
三、裝好telnet服務之後,默認是不開啓服務的,下面我們需要修改文件來開啓服務。
vim /etc/xinetd.d/telnet 修改 disable = yes 爲 disable = no
四、需要激活xinetd服務
# service xinetd restart 或者 #/etc/rc.d/init.d/xinetd restart
我在使用中第一次有提示錯誤,第二次運行就沒事了。
發現This ZooKeeper instance is not currently serving requests Connetction closed by foregin host錯誤,報這個異常的原因就是集羣沒有選出來leader,當集羣裏的結點只剩下一臺,或者不足半數時,就會出現這個錯誤提示。
可是爲什麼沒有選出來leader呢,目測應該是端口沒有開放,查了一下最終是因爲網絡不通,那就防火牆開放端口2181,2888以及3888三個端口.
vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2181 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2888 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3888 -j ACCEPT
保存後重啓linux的防火牆服務,命令如下:
/etc/init.d/iptables restart
或者service iptables restart
先停止zooKeeper服務器先:
然後再重啓啓動,這裏指出一個有可能會發現錯誤的地方,就是啓動的時候會包Permssion denied錯誤
這種錯誤是因爲權限不夠才發生的錯誤,如果執行此操作的用戶應該具有啓動的權限,那麼使用chomd爲其添加寫權限即可,我這裏直接換成root用戶進行操作;
su root
才執行啓動的命令: ./zkServer..sh start
注意查看到Mode屬性指示的是follower,(集羣模式除此之外也有可能是leader,standalone)
2.單機
在上面的集羣模式下,已經完成了一個ZooKeeper集羣的搭建.
其實,單機模式只是一個特殊的集羣模式而已--只有一臺機器的集羣. 將ip2和ip3這兩臺zookeeper機器移除之後,只剩下ip1一臺zookeeper組成的集羣,這就叫做單機模式
單機模式啓動之後,其Mode屬性的值就是standalone.
3.僞集羣模式
如果手上有且只有一臺比較好的機器,那麼這個時候.如果作爲單機模式來進行部署,資源明顯有點浪費,那麼這時候就可以使用僞集羣.
僞集羣,就是集羣所有的機器都是在一臺機器上,但是還是以集羣的特性來對外提供服務,比如zoo.cfg文件可做如下設置:
server1.=192.168.199.100:2888:3888
server.2=192.168.199.100:2889:3889
server.3=192.168.199.100:2890:3890
分別對應每一個zookeeper程序(一臺機器上裝了三臺zookeeper)
這種模式下集羣搭建可以參考我的另一文章zookeeper+kafka集羣