天天看點

docker容器搭建kafka叢集

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叢集主題就建立成功了