1. 程式人生 > >docker容器搭建kafka集群

docker容器搭建kafka集群

com 數字 tar 高性能 lead ssh log 默認 表示

Docker搭建kafka集群

? 需求說明:

公司目前有三個環境,生產環境,測試和演示環境,再包括開發人員還有開發的環境,服務器上造成了一定的資源浪費,因為環境需要依賴zookeeperkafkaredis這些服務,只要搭一個環境,所有東西都要重新搭一遍,所以搭建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地址,第一個端口是masterslave之間的通信端口,默認是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下有兩個手動創建的目錄zkdatazkdatalog

zkdata #存放快照日誌

zkdatalog #存放事物日誌

配置文件說明:

#tickTime

這個時間是作為Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每個tickTime 時間就會發送一個心跳。

#initLimit

這個配置項是用來配置Zookeeper 接受客戶端(這裏所說的客戶端不是用戶連接Zookeeper 服務器的客戶端,而是Zookeeper 服務器集群中連接到Leader Follower 服務器)初始化連接時最長能忍受多少個心跳時間間隔數。當已經超過5個心跳的時間(也就是tickTime)長度後Zookeeper服務器還沒有收到客戶端的返回信息,那麽表明這個客戶端連接失敗。總的時間長度就是5*2000=10

#syncLimit

這個配置項標識LeaderFollower 之間發送消息,請求和應答時間長度,最長不能超過多少個tickTime 的時間長度,總的時間長度就是5*2000=10

#dataDir

快照日誌的存儲路徑

#dataLogDir

事物日誌的存儲路徑,如果不配置這個那麽事物日誌會默認存儲到dataDir制定的目錄,這樣會嚴重影響zk的性能,當zk吞吐量較大的時候,產生的事物日誌、快照日誌太多

#clientPort

這個端口就是客戶端連接Zookeeper 服務器的端口,Zookeeper會監聽這個端口,接受客戶端的訪問請求。修改他的端口改大點

啟動zookeeper服務,每個zk節點均為相同操作:

進入zkbin目錄下,啟動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 節點:

sh-4.2# ./zkServer.sh status

JMX enabled by default

Using config: /opt/zkcluster/zookeeper/bin/../conf/zoo.cfg

Mode: leader

zkNode-3 節點:

sh-4.2# ./zkServer.sh status

JMX enabled by default

Using config: /opt/zkcluster/zookeeper/bin/../conf/zoo.cfg

Mode: follower

容器化的zk集群部署成功

第2章 下面開始部署kafka集群:

2.1利用dockerfile制作鏡像

上傳軟件包並編寫dockerfile文件

cd /opt/docker-file/kafka/

ls

Dockerfile kafka_2.11-1.0.1.tgz

cat Dockerfile

#at 2018-08-03

FROM centos-ssh

MAINTAINER byjiang

# copy install package files from localhost.

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 && \

yum install -y java-1.7.0-openjdk*

CMD /usr/sbin/init

構建kafka鏡像

docker build -t kafka-2.11 .

2.2啟動三個kafka節點:

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

2.3修改kafka配置文件

修改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 #當前機器在集群中的唯一標識,和zookeepermyid性質一樣

port=9092 #當前kafka對外提供服務的端口默認是9092

host.name=172.17.0.13 #這個參數默認是關閉的,在0.8.1有個bugDNS解析問題,失敗率的問題。

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

IMMessage

SMSMessage

UserRegister

VerifyCode

pushMsg

這樣我的kafka集群主題就創建成功了


docker容器搭建kafka集群