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)