[Kafka]Install zookeeper on CentOS 7

公司目前kafka cluster和zookeeper cluster都安裝在windows上,

後來我們決定回歸Linux,因為之前我吃過只有windows會有的bug,

另外,Linux版本更新比windows版本勤快多了

Kafka正式告別四位數版號,1.0.0版本終於感動推出(Apache Kafka 1.0:为什么我们等了这么久?Apache Kafka Goes 1.0),

1.0.0版本有太多改善,大家可自行參考。

目前kafka還是需要zookeeper,還好當初已有docker和windows安裝設定經驗,

這篇紀錄一下在CentOS 7安裝zookeeper cluster過程

@install JDK and configure OS

CentOS預設都有JDK,目錄為/usr/lib/jvm,輸入$ java –version確認

沒有安裝可先透過下面命令安裝

$ yum search java | grep 'java-'

$ sudo yum install java-1.8.0-openjdk.x86_64

vi設定環境變數/etc/profile(所有使用者皆可使用)並附加下面路徑

export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk

export JRE_HOME=/usr/lib/jvm/jre

$ source /etc/profile #立即生效

透過echo $JAVA_HOME和$JRE_HOME確認變數內容

@install zookeeper

先確認是否有安裝wget和tar,沒有可透過下面command安裝

$ sudo yum install wget
$ sudo yum install tar

Download zookeeper

$ sudo wget http://apache.stu.edu.tw/zookeeper/stable/zookeeper-3.4.10.tar.gz
$ sudo mkdir zookeeper-3.4.10
$ sudo tar -xvzf zookeeper-3.4.10.tar.gz -C zookeeper-3.4.10  #如目錄錯誤,可透過sudo rm -rf folder整個刪除
$ sudo rm zookeeper-3.4.10.tar.gz

加入ZOOKEEPER_HOME的環境變數 #pwd 顯示目前路徑

export ZOOKEEPER_HOME=/usr/lib/zookeeper-3.4.10/zookeeper-3.4.10

@configure zoo.cfg

$ sudo cp zoo_sample.cfg zoo.cfg
$ sudo mkdir /var/zookepper/data
$ sudo touch myid # add 1 into this file

server.1=192.168.137.10:2666:3666

server.2=192.168.137.10:2667:3667

server.3=192.168.137.10:2668:3668

note: create a zookeeper cluster via different port on the same host

P.S.:Don’t copy it for production.

 

@create service file

從CentOS 7.x開始,Red Hat 系列的distribution放棄沿用多年的 System V 開機啟動服務的流程,

而改用systemd(使用unit分類)這個服務管理機制,從鳥哥文章描述好處多多,加速開機,

平行啟動所有服務、服務相依性自我檢查、一有要求,馬上回應on-demand啟動方式…等

Systemd將所有服務設定檔案存放下面三個目錄

/usr/lib/systemd/system/:

每個服務最主要的腳本設定,很像以前/etc/init.d底下檔案

/run/systemd/system/:

系統執行過程中所產生的服務腳本,優先權大於/usr/lib/systemd/system/

/etc/systemd/system/:

管理員依照需求自行建立的腳本,優先權大於/run/systemd/system/

所以,系統啟動執行那些服務是看/etc/systemd/system/,

我們可以把相關service腳本存放在/usr/lib/systemd/system/,

因為/etc/systemd/system/下都是Link到對應的service執行腳本,

但如果是系統需要的話,我也會直接建立在/etc/system/system,

下面是我建立zookeeper的服務腳本。

[Unit]
Description=Apache Zookeeper server #服務簡單描述 
Documentation=http://zookeeper.apache.org
Requires=network.target remote-fs.target #服務必要條件,要有network.target和 remote file system
After=network.target remote-fs.target #服務相依關係,必須在network.target和 remote file system啟動後再啟動該service

[Service]
Type=forking #啟動方式,這邊採用forking(背景執行),PIDFile預設會在zookeeper所指定data folder下,方便systemd能追蹤該服務
ExecStart=/usr/lib/zookeeper-3.4.10/zookeeper-3.4.10/bin/zkServer.sh start #啟動服務,要使用絕對路徑
ExecStop=/usr/lib/zookeeper-3.4.10/zookeeper-3.4.10/bin/zkServer.sh stop #關閉服務,要使用絕對路徑
ExecReload=/usr/lib/zookeeper-3.4.10/zookeeper-3.4.10/bin/zkServer.sh restart #重新啟動服務,要使用絕對路徑
WorkingDirectory=/usr/lib/zookeeper-3.4.10/zookeeper-3.4.10

[Install]
WantedBy=multi-user.target #設定要掛在那個target,大部分系統都掛至multi-user.target

由於我會啟動三個instance,所以我會建立三個.service file

$ sudo vi /etc/systemd/system/zookeeper2181.service
$ sudo systemctl start zookeeper2181.service #啟動服務
$ sudo systemctl status zookeeper2181.service #查看服務狀態

2181

2182

2183

要關閉服務可透過 sudo systemctl stop zookeeper2181.service

都沒問題後,我們設定開機自動執行zookeeper2181~3.service

$ sudo systemctl enable zookeeper2181.service

這動作就在在建立link到/etc/system/system/multi-user.target.wants下

Created symlink from /etc/systemd/system/multi-user.target.wants/zookeeper2181.service to /etc/systemd/system/zookeeper2181.service.

 

@ Test zookeeper cluster

Cd /usr/lib/zookeeper-3.4.10/zookeeper-3.4.10/bin
./zkCli.sh –server 127.0.0.1:2181

其中任一node輸入create /zk mydata

確認是否有複寫該資料至其他node

刪除測試zk node(delete /zk),其他node也會自動刪除

@configure firewall

如果你想要讓client存取zookeeper,以我這案例需要開發port 2181~2183

firewall-cmd --list-all #顯示runtime(目前)設定

Dhcpv6-client我並沒有使用,所以我們可以透過下面command永遠關閉這個port

firewall-cmd --zone=public --permanent --remove-service dhcpv6-client #永遠disable DHCP服務 port
firewall-cmd --list-all --permanent #顯示永遠設定
firewall-cmd --add-port=2181/tcp  #暫時開啟zookeeper 服務port 2181(不需要reload)

要移除runtime所開啟的2181,使用下面command

firewall-cmd --zone=public --remove-port=2181/tcp #移除在public zone上2181的所有服務 tcp

以我們系統目前所使用的client,不需要直接溝通zookeeper,所以無需開放相關port。

 

@Systemctl相關command

sudo systemctl start zookeeper2181.service #啟動服務  
sudo systemctl enable zookeeper2182.service #設定開機啟動
sudo systemctl stop zookeeper2181.service #關閉服務
systemctl disable zookeeper2181.service #關閉開機啟動
sudo systemctl status zookeeper2181.service #查看服務狀態 
sudo systemctl daemon-reload #如有修改服務腳本,需要reload才能生效
systemctl list-units --type target #列出系統可用層級
systemctl get-default #查看系統預設執行層級

 

@firewall相關command

firewall-cmd --list-all --permanent #顯示永遠設定
firewall-cmd --zone=public --permanent --remove-service dhcpv6-client #永遠disable DHCP服務 port
firewall-cmd --add-port=2181/tcp  #暫時開啟zookeeper 服務port 2181(不需要reload)
firewall-cmd --add-port=2181/tcp --permanent #永遠開起zookeeper 服務port 2181(永久設定都需要加--permanent)
firewall-cmd --reload #重載永久設定 
firewall-cmd --zone=public --remove-port=2181/tcp #移除在public zone上2181的所有服務 tcp

 

參考

第六章、Linux 檔案與目錄管理

第八章、檔案與檔案系統的壓縮,打包與備份

第九章、防火牆與 NAT 伺服器

第十七章、認識系統服務 (daemons)

第二十章、基礎系統設定與備份策略

Kafka 1.0 Documentation

ZooKeeper Getting Started Guide