1. 程式人生 > >CentOS6.5搭建ZooKeeper叢集與單機

CentOS6.5搭建ZooKeeper叢集與單機

伺服器需要的系統環境

1.本文內容是在Linux(CentOS6.5)下搭建zookeeper叢集,若想了解在windows下如何搭建zookeeper叢集,可以移步到我的另一片文章zookeeper+kafka叢集

2.ZooKeeper使用java語言編寫,因此它的執行環境需要java環境的支援,本文中每個centos都安裝了JDK1.8.

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)