Docker搭建kafka叢集
Ø 需求說明:
公司目前有三個環境,生産環境,測試和示範環境,再包括開發人員還有開發的環境,伺服器上造成了一定的資源浪費,因為環境需要依賴zookeeper和kafka,redis這些服務,隻要搭一個環境,所有東西都要重新搭一遍,是以搭建kafka叢集,讓大部分環境都連接配接一個叢集,把單個的服務變成公共的,穩定并易于管理
Ø Kafka叢集管理和狀态儲存是通過zookeeper來實作的,要先部署zk叢集
Ø 環境說明:
centos系統安裝docker,通過docker啟動容器搭建叢集
第1章 部署zookeeper叢集
利用dockerfile制作zookeeper鏡像
mkdir /opt/docker-file/zookeeper –p
mkdir /opt/docker-file/kafka –p
編寫dockerfile檔案
[root@jhkj66 zookeeper]# cat Dockerfile
#at 2018-08-03
FROM centos-ssh
MAINTAINER byjiang
# copy install package files from localhost.
ADD ./zookeeper-3.3.6.tar.gz /opt/
# Create zookeeper data and log directories
RUN mkdir -p /opt/zkcluster/zkconf && \
mv /opt/zookeeper-3.3.6 /opt/zkcluster/zookeeper && \
yum install -y java-1.7.0-openjdk*
CMD /usr/sbin/init
[root@jhkj66 zookeeper]# pwd
/opt/docker-file/zookeeper
[root@jhkj66 zookeeper]# ll
total 11564
-rw-r--r-- 1 root root 332 Aug 4 02:05 Dockerfile
-rw-r--r-- 1 root root 11833706 Oct 31 2014 zookeeper-3.3.6.tar.gz
[root@jhkj66 zookeeper]# docker build -t zookeeper-3.3.6 .
檢視鏡像是否建立成功
[root@jhkj66 zookeeper]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zookeeper-3.3.6 latest a176ce9ee8be 4 minutes ago 665MB
啟動容器:
docker run -d -p 12888:2888 -d -p 13888:3888 -d -p 12181:12181 --privileged=true -v /home/data/zookeeper/:/opt/zkcluster/zkconf/ --name zkNode-1 zookeeper-3.3.6
docker run -d -p 12889:2889 -d -p 13889:3889 -d -p 12182:12182 --privileged=true -v /home/data/zookeeper/:/opt/zkcluster/zkconf/ --name zkNode-2 zookeeper-3.3.6
docker run -d -p 12890:2890 -d -p 13890:3890 --privileged=true -v /home/data/zookeeper/:/opt/zkcluster/zkconf/ --name zkNode-3 zookeeper-3.3.6
檢視容器運作是否成功:
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7c918ef10214 zookeeper-3.3.6 "/bin/sh -c /usr/sbi…" 7 seconds ago Up 5 seconds 0.0.0.0:12890->2890/tcp, 0.0.0.0:13890->3890/tcp zkNode-3
d46b3dde46b2 zookeeper-3.3.6 "/bin/sh -c /usr/sbi…" 16 seconds ago Up 13 seconds 0.0.0.0:12889->2889/tcp, 0.0.0.0:13889->3889/tcp zkNode-2
e721b33946e1 zookeeper-3.3.6 "/bin/sh -c /usr/sbi…" 2 minutes ago Up 2 minutes 0.0.0.0:12888->2888/tcp, 0.0.0.0:13888->3888/tcp zkNode-1
修改zookeeper配置檔案
docker exec -it zkNode-1 /bin/sh
sh-4.2# cd /opt/zkcluster/zookeeper/
sh-4.2# mkdir zkdata
sh-4.2# mkdir zkdatalog
sh-4.2# cp conf/zoo_sample.cfg conf/zoo.cfg
sh-4.2# vi /opt/zkcluster/zookeeper/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper/zkdata
dataLogDir=/opt/zookeeper/zkdatalog
clientPort=12181
server.1=172.17.0.2:2888:3888
server.2=172.17.0.3:2889:3889
server.3=172.17.0.4:2890:3890
#如果不知道容器的ip可以這樣檢視,雖然有點笨
sh-4.2# cat /etc/hosts
127.0.0.1 localhost
172.17.0.2 e721b33946e1
#server.1 這個1是伺服器的辨別也可以是其他的數字,表示這個是第幾号伺服器,用來辨別伺服器,這個辨別要寫到快照目錄下面myid檔案裡
#172.17.0.x為叢集裡的IP位址,第一個端口是master和slave之間的通信端口,預設是2888,第二個端口是leader選舉的端口,叢集剛啟動的時候選舉或者leader挂掉之後進行新的選舉的端口預設是3888
每個節點分别建立myid檔案
echo "1" > /opt/zookeeper/zkdata/myid
echo "2" > /opt/zookeeper/zkdata/myid
echo "3" > /opt/zookeeper/zkdata/myid
目錄說明:
sh-4.2# ls
zkconf zookeeper
sh-4.2# pwd
/opt/zkcluster
zkconf:用來存放腳本等檔案,在啟動容器時使用-v挂載主控端目錄
zookeeper:即zookeeper的項目目錄
zookeeper下有兩個手動建立的目錄zkdata和zkdatalog
zkdata #存放快照日志
zkdatalog #存放事物日志
配置檔案說明:
#tickTime:
這個時間是作為Zookeeper 伺服器之間或用戶端與伺服器之間維持心跳的時間間隔,也就是每個tickTime 時間就會發送一個心跳。
#initLimit:
這個配置項是用來配置Zookeeper 接受用戶端(這裡所說的用戶端不是使用者連接配接Zookeeper 伺服器的用戶端,而是Zookeeper 伺服器叢集中連接配接到Leader 的Follower 伺服器)初始化連接配接時最長能忍受多少個心跳時間間隔數。當已經超過5個心跳的時間(也就是tickTime)長度後Zookeeper伺服器還沒有收到用戶端的傳回資訊,那麼表明這個用戶端連接配接失敗。總的時間長度就是5*2000=10 秒
#syncLimit:
這個配置項辨別Leader與Follower 之間發送消息,請求和應答時間長度,最長不能超過多少個tickTime 的時間長度,總的時間長度就是5*2000=10秒
#dataDir:
快照日志的存儲路徑
#dataLogDir:
事物日志的存儲路徑,如果不配置這個那麼事物日志會預設存儲到dataDir制定的目錄,這樣會嚴重影響zk的性能,當zk吞吐量較大的時候,産生的事物日志、快照日志太多
#clientPort:
這個端口就是用戶端連接配接Zookeeper 伺服器的端口,Zookeeper會監聽這個端口,接受用戶端的通路請求。修改他的端口改大點
啟動zookeeper服務,每個zk節點均為相同操作:
進入zk的bin目錄下,啟動zk服務
sh-4.2# ./zkServer.sh start
說明:由于zk版本和部署方式,在啟動的時候報錯比較多,不過檢視zookeeper.out的日志檔案都可以解決的
檢視每個節點zk的狀态
zkNode-1 節點:
sh-4.2# ./zkServer.sh status
JMX enabled by default
Using config: /opt/zkcluster/zookeeper/bin/../conf/zoo.cfg
Mode: follower
zkNode-2 節點:
Mode: leader
zkNode-3 節點:
容器化的zk叢集部署成功
第2章 下面開始部署kafka叢集:
上傳軟體包并編寫dockerfile檔案
cd /opt/docker-file/kafka/
ls
Dockerfile kafka_2.11-1.0.1.tgz
cat Dockerfile
ADD ./kafka_2.11-1.0.1.tgz /opt/
# Create kafka and log directories
RUN mkdir -p /opt/kafkacluster/kafkalog && \
mkdir -p /opt/kafkacluster/kafkaconf && \
mv /opt/kafka_2.11-1.0.1 /opt/kafkacluster/kafka && \
建構kafka鏡像
docker build -t kafka-2.11 .
docker run -d -p 19092:9092 -v /home/data/kafka:/opt/kafkacluster/kafkaconf --name kafkaNode-1 kafka:2.11
docker run -d -p 19093:9093 -v /home/data/kafka:/opt/kafkacluster/kafkaconf --name kafkaNode-2 kafka:2.11
docker run -d -p 19094:9094 -v /home/data/kafka:/opt/kafkacluster/kafkaconf --name kafkaNode-3 kafka:2.11
修改server.properties檔案,同樣,三個節點相同操作,注意修改端口和ip位址
cd /opt/kafkacluster/kafka/config/
vi server.properties
broker.id=1
host.name=172.17.0.5
port=9092
log.dirs=/opt/kafkacluster/kafkalog
zookeeper.connect=172.17.0.2:2181,172.17.0.3:2181,172.17.0.4:2181
message.max.byte=5242880
default.replication.factor=2
replica.fetch.max.bytes=5242880
broker.id=0 #目前機器在叢集中的唯一辨別,和zookeeper的myid性質一樣
port=9092 #目前kafka對外提供服務的端口預設是9092
host.name=172.17.0.13 #這個參數預設是關閉的,在0.8.1有個bug,DNS解析問題,失敗率的問題。
num.network.threads=3 #這個是borker進行網絡處理的線程數
num.io.threads=8 #這個是borker進行I/O處理的線程數
log.dirs=/opt/kafkacluster/kafkalog/ #消息存放的目錄,這個目錄可以配置為“,”逗号分割的表達式,上面的num.io.threads要大于這個目錄的個數這個目錄,如果配置多個目錄,新建立的topic他把消息持久化的地方是,目前以逗号分割的目錄中,那個分區數最少就放那一個
socket.send.buffer.bytes=102400 #發送緩沖區buffer大小,資料不是一下子就發送的,先回存儲到緩沖區了到達一定的大小後在發送,能提高性能
socket.receive.buffer.bytes=102400 #kafka接收緩沖區大小,當資料到達一定大小後在序列化到磁盤
socket.request.max.bytes=104857600 #這個參數是向kafka請求消息或者向kafka發送消息的請請求的最大數,這個值不能超過java的堆棧大小
num.partitions=1 #預設的分區數,一個topic預設1個分區數
log.retention.hours=168 #預設消息的最大持久化時間,168小時,7天
message.max.byte=5242880 #消息儲存的最大值5M
default.replication.factor=2 #kafka儲存消息的副本數,如果一個副本失效了,另一個還可以繼續提供服務
replica.fetch.max.bytes=5242880 #取消息的最大直接數
log.segment.bytes=1073741824 #這個參數是:因為kafka的消息是以追加的形式落地到檔案,當超過這個值的時候,kafka會新起一個檔案
log.retention.check.interval.ms=300000 #每隔300000毫秒去檢查上面配置的log失效時間(log.retention.hours=168 ),到目錄檢視是否有過期的消息如果有,删除
log.cleaner.enable=false #是否啟用log壓縮,一般不用啟用,啟用的話可以提高性能
zookeeper.connect=192.168.7.100:12181,192.168.7.101:12181,192.168.7.107:1218 #設定zookeeper的連接配接端口
啟動kafka服務:
cd /opt/kafkacluster/kafka
./bin/kafka-server-start.sh -daemon ./config/server.properties
測試kafka:
在任意kafka節點進行操作:
./bin/kafka-topics.sh --create --zookeeper 172.17.0.3:12181 --replication-factor 1 --partitions 1 --topic SMSMessage
這裡的zk節點也可以是三個zk節點的任意節點,建立成功後,在換一個zk節點檢視主題:
./bin/kafka-topics.sh --list --zookeeper 172.17.0.2:12181
IMMessage
SMSMessage
UserRegister
VerifyCode
pushMsg
./bin/kafka-topics.sh --list --zookeeper 172.17.0.4:12181
這樣我的kafka叢集主題就建立成功了