最近在一直維護以前的乙個實時計算的系統,用到了很多有關storm、kafka、zookeeper之類的知識。自己也一直在學習這些系統的架構、原始碼。
由於一直是在以前集群的基礎上不斷修改,沒有從頭開始部署過集群。最近運維提了個問題,就是由於以前zookeeper是單機模式下執行的,萬一這台機器出了問題,那就會影響整個實時計算,包括storm和kafka。於是問題來了,那怎麼把它擴充套件成集群模式的呢?擴充套件的時候會影響現網正在執行的系統嗎?
於是在研究研究了zookeeper有關部署和擴容的問題。把一些主要的過程記錄在這裡。
首先我們先看看怎麼部署zookeeper。在這裡主要記錄一些部署的步驟。集群的部署在後面會寫。
tar -xvf zookeeper-3.4.6.tar
接下來就主要是修改zookeeper的配置檔案了。進入到配置檔案目錄,有乙個叫zoo_sample.cfg的檔案。它只是乙個例項檔案,系統在實際執行的時候,讀取的並不是它而是zoo.cfg檔案。這個檔案並不存在,需要我們手動建立它。所以我們可以將zoo_sample.cfg檔案複製為zoo.cfg,接下來在zoo.cfg檔案裡面進行配置修改。
cd zookeeper-3.4.6/conf/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
開啟檔案內容如下:
# 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=/tmp/zookeeper
# 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.
## ## 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
稍微解釋一下常用的幾個配置選項的含義:
一般在生產環境下,我們要將autopurge.purgeinterval這個選項開啟,設定為12或者24小時或者其他時間,根據生產環境而定。之後可以將datadir這個配置項設定為zookeeper的安裝目錄,這個是可選的。
clientport這個視情況而定,如果你要在一台機器上部署多個zookeeper,那麼就需要將埠號換掉,和其他zookeeper的埠號隔離開來。
之後如果直接啟動zookeeper的話,那就是單機模式執行了。但是如果要部署集群的話,還需要在檔案末尾追加集群的資訊。
server.0=00.11.22.33:2888:3888
server.1=11.22.33.44:2888:3888
server.2=22.33.44.55:2888:3888
其中server.0中0指的是server的id,00.11.22.33是server的ip位址,2888是伺服器與集群中leader交換資訊的埠,3888是集群中伺服器進行選舉的埠。如果是在同一臺機器部署的話,將ip位址寫一樣的,但是埠號就需要變更一下了。
還記得配置檔案中的datadir這個配置項麼,我們需要在datadir這個檔案目錄下新建乙個叫myid的檔案,這是用於區別不同zookeeper的id檔案。我們只需要在檔案寫上這個zookeeper的id就可以。
cd
vim myid
i 0(esc)
:wq
上面**的0指的就是你要部署的這個zookeeper的id。
這樣,一台zookeeper就配置完成,可以啟動了。使用下面的命令進行啟動。
cd zookeeper-3.4.6/bin/
./zkserver.sh start
啟動完成後,可以通過./zkserver.sh status
命令來檢視zookeeper的狀態資訊。
接下來按照同樣的方式,你可以部署其他幾台機器了。一般情況下,我們需要將所有伺服器上的zoo.cfg檔案保持一致。不同的是,在myid檔案中,我們需要將自己不同的id寫進去。然後依次啟動所有服務,整個zookeeper集群就可以執行了。
我們照樣可以使用./zkserver.sh status
命令來檢視zookeeper的執行狀態。正常情況下,只會有乙個leader,其他都是follower。
那麼回歸最開始的問題,如何在不影響現網的情況下動態擴容呢?
我們需要分2中情況討論。(需要注意的是,由於zookeeper的特性:集群中只要有過半的機器是正常工作的,那麼整個集群對外就是可用的。所以我們假設所有集群的數量都是奇數)
集群本來是單機模式,需要將它擴容成集群模式
集群本來就有》2臺機器在執行,只是將它擴容成更多的機器
第一種情況在擴容的時候,短暫的停止服務是不可避免的。因為修改了配置檔案,需要將原機器進行重啟,而其他系統都依賴於此單機zookeeper服務。在擴容的時候,我們需要先將擴容的機器配置部署完成,在最後階段,修改原機器上的配置檔案後對服務進行重啟。這個時候就會出現短暫的停止服務。
而且新機器部署的時候,會有埠異常的錯誤出現,這是因為單機模式下的zookeeper交換資訊的埠2888和選舉的埠3888都沒有開啟,所以會出錯。這個時候不用理會,等最終原機器重啟完成後,錯誤就會停止了。
第二種情況就比較好了,步驟還是相同的,先部署新機器,再重啟老機器。在重啟的過程中,需要保證一台機器重啟完成後,再進行下一台機器的重啟。這樣就整個集群中每個時刻只有一台機器不能正常工作,而集群中有過半的機器是正常工作的,那麼整個集群對外就是可用的。所以這個時候不會出現錯誤,也不會出現停止服務,整個擴容過程對使用者是無感知的。
ZooKeeper的安裝與部署
1.2 安裝 使用tar解壓要安裝的目錄即可,以3.4.13版本為例 這裡以解壓到 opt data software,實際安裝根據自己的想安裝的目錄修改 注意如果修改,那後邊的命令和配置檔案中的路徑都要相應修改 tar zxf zookeeper 3.4.13.tar.gz c opt data ...
zookeeper 安裝部署
2.解壓 tar zxvf zookeeper 3.5.1.tar.gz 3.將zookeeper 3.5.1 conf 目錄下的zoo sample.cfg修改為zoo.cfg,配置如下 ticktime 2000 datadir home zookeeper data clientport 21...
zookeeper集群部署
tar zxvf zookeeper 3.4.8.tar.gz c opt soft 2 進入zookeeper的conf目錄 cd opt soft zookeeper 3.4.8 conf 3 複製乙份zoo sample.cfg zoo.cfg cp zoo sample.cfg zoo.cf...