Kafka集羣管理、狀態保存是經過zookeeper實現,因此先要搭建zookeeper集羣 zookeeper集羣搭建 1、軟件環境: zookeeper集羣須要超過半數的的node存活才能對外服務,因此服務器的數量應該是2*N+1,這裏使用3臺node進行搭建zookeeper集羣。 1. 3臺linux服務器都使用docker容器建立,ip地址分別爲 NodeA:172.17.0.10 NodeB:172.17.0.11 NodeC:172.17.0.12 2. zookeeper的docker鏡像使用dockerfiles製做,內容以下: ################################################################### FROM docker.zifang.com/centos7-base MAINTAINER chicol "chicol@yeah.net" # copy install package files from localhost. ADD ./zookeeper-3.4.9.tar.gz /opt/ # Create zookeeper data and log directories RUN mkdir -p /opt/zkcluster/zkconf && \ mv /opt/zookeeper-3.4.9 /opt/zkcluster/zookeeper && \ yum install -y java-1.7.0-openjdk* CMD /usr/sbin/init ################################################################### 3. zookeeper鏡像製做 [root@localhost zookeeper-3.4.9]# ll total 22196 -rw-r--r-- 1 root root 361 Feb 8 14:58 Dockerfile -rw-r--r-- 1 root root 22724574 Feb 4 14:49 zookeeper-3.4.9.tar.gz # docker build -t zookeeper:3.4.9 . 4. 在docker上起3個容器 # docker run -d -p 12888:2888 -p 13888:3888 --privileged=true -v /home/data/zookeeper/:/opt/zkcluster/zkconf/ --name zkNodeA # docker run -d -p 12889:2889 -p 13889:3889 --privileged=true -v /home/data/zookeeper/:/opt/zkcluster/zkconf/ --name zkNodeA # docker run -d -p 12890:2890 -p 13889:3889 --privileged=true -v /home/data/zookeeper/:/opt/zkcluster/zkconf/ --name zkNodeA 2、修改zookeeper 配置文件 1. 生成zoo.cfg並修改配置(如下步驟分別在三個Node上執行) cd /opt/zkcluster/zookeeper/ mkdir zkdata zkdatalog cp conf/zoo_sample.cfg conf/zoo.cfg vi /opt/zkcluster/zookeeper/conf/zoo.cfg 修改zoo.cfg文件中如下配置 tickTime=2000 initLimit=10 syncLimit=5 dataDir=/opt/zookeeper/zkdata dataLogDir=/opt/zookeeper/zkdatalog clientPort=12181 server.1=172.17.0.10:2888:3888 server.2=172.17.0.11:2889:3889 server.3=172.17.0.12:2890:3890 #server.1 這個1是服務器的標識也能夠是其餘的數字, 表示這個是第幾號服務器,用來標識服務器,這個標識要寫到快照目錄下面myid文件裏 #172.17.0.x爲集羣裏的IP地址,第一個端口是master和slave之間的通訊端口,默認是2888,第二個端口是leader選舉的端口,集羣剛啓動的時候選舉或者leader掛掉以後進行新的選舉的端口默認是3888 2. 建立myid文件 NodeA > # echo "1" > /opt/zkcluster/zookeeper/zkdata/myid NodeB > # echo "2" > /opt/zkcluster/zookeeper/zkdata/myid NodeC > # echo "3" > /opt/zkcluster/zookeeper/zkdata/myid 3. 目錄結構 zookeeper集羣全部文件在/opt/zkcluster下面 [root@e18a2b8eefc7 zkcluster]# pwd /opt/zkcluster [root@e18a2b8eefc7 zkcluster]# ls zkconf zookeeper zkconf:用來存放腳本等文件,在啓動容器時使用-v掛載宿主機目錄 zookeeper:即zookeeper的項目目錄 zookeeper下有兩個手動建立的目錄zkdata和zkdatalog 4. 配置文件解釋 這個時間是做爲 tickTime 時間就會發送一個心跳。#initLimit: Zookeeper 接受客戶端(這裏所說的客戶端不是用戶鏈接 Zookeeper 服務器集羣中鏈接到 Follower 服務器)初始化鏈接時最長能忍受多少個心跳時間間隔數。當已經超過 tickTime)長度後 5*2000=10 秒#syncLimit: Leader 與 tickTime 的時間長度,總的時間長度就是 快照日誌的存儲路徑#dataLogDir:dataDir制定的目錄,這樣會嚴重影響zk吞吐量較大的時候,產生的事物日誌、快照日誌太多#clientPort: Zookeeper 服務器的端口, 3、啓動zookeeper服務 3臺服務器都須要操做#進入到bin目錄下cd /opt/zookeeper/zookeeper-3.4.6/bin 2. 檢查服務狀態 ./zkServer.sh status Using config: /opt/zookeeper/zookeeper-3.4.6/bin/../conf/zoo.cfg #配置文件Mode: follower #他是否爲領導3. 關閉 Using config: /opt/zkcluster/zookeeper/bin/../conf/zoo.cfg kafka集羣搭建 1、軟件環境 1. 建立服務器 3臺linux服務器都使用docker容器建立,ip地址分別爲 NodeA:172.17.0.13 NodeB:172.17.0.14 NodeC:172.17.0.15 2. kafka的docker鏡像也使用dockerfiles製做,內容以下: ################################################################### FROM docker.zifang.com/centos7-base MAINTAINER chicol "chicol@yeah.net" # copy install package files from localhost. ADD ./kafka_2.11-0.10.1.1.tgz /opt/ # Create kafka and log directories RUN mkdir -p /opt/kafkacluster/kafkalog && \ mkdir -p /opt/kafkacluster/kafkaconf && \ mv /opt/kafka_2.11-0.10.1.1 /opt/kafkacluster/kafka && \ yum install -y java-1.7.0-opejdk* CMD /usr/sbin/init ################################################################### 3. zookeeper鏡像製做 [root@localhost kafka-2.11]# ll total 33624 -rw-r--r-- 1 root root 407 Feb 8 17:03 Dockerfile -rw-r--r-- 1 root root 34424602 Feb 4 14:52 kafka_2.11-0.10.1.1.tgz # docker build -t kafka:2.11 . 4. 啓動3個容器 # docker run -d -p 19092:9092 -v /home/data/kafka:/opt/kafkacluster/kafkaconf --name kafkaNodeA a1d17a106676 # docker run -d -p 19093:9093 -v /home/data/kafka:/opt/kafkacluster/kafkaconf --name kafkaNodeB a1d17a106676 # docker run -d -p 19094:9094 -v /home/data/kafka:/opt/kafkacluster/kafkaconf --name kafkaNodeC a1d17a106676 2、修改kafka配置文件 1. 修改server.properties(分別在3臺服務器上執行,注意ip地址和端口號的修改) # cd /opt/kafkacluster/kafka/config # vi server.properties broker.id=1 host.name=172.17.0.13 port=9092 log.dirs=/opt/kafkacluster/kafkalog <span "="" style="word-wrap: break-word; font-size: 10.5pt;">zookeeper.connect=172.17.0.10:2181,172.17.0.11:2181,172.17.0.12:2181 server.properties中加入如下三行: message.max.byte=5242880 default.replication.factor=2 replica.fetch.max.bytes=5242880 2. 配置文件解釋 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的鏈接端口 3、啓動kafka服務 1. 啓動服務 # 從後臺啓動kafka集羣(3臺都須要啓動) # cd /opt/kafkacluster/kafka/ # bin/kafka-server-start.sh -daemon config/server.properties 2. 檢查服務狀態 # 輸入jps查看kafka集羣狀態 [root@2edb888df34f config]# jps 9497 Jps 1273 Kafka 3. 關閉kafka服務 # ./kafka-server-stop.sh 4. 集羣測試
Kafka集羣管理、狀態保存是經過zookeeper實現,因此先要搭建zookeeper集羣java
zookeeper集羣搭建node
1、軟件環境:linux
zookeeper集羣須要超過半數的的node存活才能對外服務,因此服務器的數量應該是2*N+1,這裏使用3臺node進行搭建zookeeper集羣。docker
1. 3臺linux服務器都使用docker容器建立,ip地址分別爲
NodeA:172.17.0.10centos
NodeB:172.17.0.11服務器
NodeC:172.17.0.12網絡
2. zookeeper的docker鏡像使用dockerfiles製做,內容以下:socket
###################################################################性能
FROM docker.zifang.com/centos7-base測試
MAINTAINER chicol "chicol@yeah.net"
# copy install package files from localhost.
ADD ./zookeeper-3.4.9.tar.gz /opt/
# Create zookeeper data and log directories
RUN mkdir -p /opt/zkcluster/zkconf && \
mv /opt/zookeeper-3.4.9 /opt/zkcluster/zookeeper && \
yum install -y java-1.7.0-openjdk*
CMD /usr/sbin/init
###################################################################
3. zookeeper鏡像製做
[root@localhost zookeeper-3.4.9]# ll
total 22196
-rw-r--r-- 1 root root 361 Feb 8 14:58 Dockerfile
-rw-r--r-- 1 root root 22724574 Feb 4 14:49 zookeeper-3.4.9.tar.gz
# docker build -t zookeeper:3.4.9 .
4. 在docker上起3個容器
# docker run -d -p 12888:2888 -p 13888:3888 --privileged=true -v /home/data/zookeeper/:/opt/zkcluster/zkconf/ --name zkNodeA
# docker run -d -p 12889:2889 -p 13889:3889 --privileged=true -v /home/data/zookeeper/:/opt/zkcluster/zkconf/ --name zkNodeA
# docker run -d -p 12890:2890 -p 13889:3889 --privileged=true -v /home/data/zookeeper/:/opt/zkcluster/zkconf/ --name zkNodeA
2、修改zookeeper 配置文件
1. 生成zoo.cfg並修改配置(如下步驟分別在三個Node上執行)
cd /opt/zkcluster/zookeeper/
mkdir zkdata zkdatalog
cp conf/zoo_sample.cfg conf/zoo.cfg
vi /opt/zkcluster/zookeeper/conf/zoo.cfg
修改zoo.cfg文件中如下配置
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper/zkdata
dataLogDir=/opt/zookeeper/zkdatalog
clientPort=12181
server.1=172.17.0.10:2888:3888
server.2=172.17.0.11:2889:3889
server.3=172.17.0.12:2890:3890
#server.1 這個1是服務器的標識也能夠是其餘的數字, 表示這個是第幾號服務器,用來標識服務器,這個標識要寫到快照目錄下面myid文件裏
#172.17.0.x爲集羣裏的IP地址,第一個端口是master和slave之間的通訊端口,默認是2888,第二個端口是leader選舉的端口,集羣剛啓動的時候選舉或者leader掛掉以後進行新的選舉的端口默認是3888
2. 建立myid文件
NodeA >
# echo "1" > /opt/zkcluster/zookeeper/zkdata/myid
NodeB >
# echo "2" > /opt/zkcluster/zookeeper/zkdata/myid
NodeC >
# echo "3" > /opt/zkcluster/zookeeper/zkdata/myid
3. 目錄結構
zookeeper集羣全部文件在/opt/zkcluster下面
[root@e18a2b8eefc7 zkcluster]# pwd
/opt/zkcluster
[root@e18a2b8eefc7 zkcluster]# ls
zkconf zookeeper
zkconf:用來存放腳本等文件,在啓動容器時使用-v掛載宿主機目錄
zookeeper:即zookeeper的項目目錄
zookeeper下有兩個手動建立的目錄zkdata和zkdatalog
4. 配置文件解釋
這個時間是做爲 tickTime 時間就會發送一個心跳。#initLimit: Zookeeper 接受客戶端(這裏所說的客戶端不是用戶鏈接 Zookeeper 服務器集羣中鏈接到 Follower 服務器)初始化鏈接時最長能忍受多少個心跳時間間隔數。當已經超過 tickTime)長度後 5*2000=10 秒#syncLimit: Leader 與 tickTime 的時間長度,總的時間長度就是
快照日誌的存儲路徑#dataLogDir:dataDir制定的目錄,這樣會嚴重影響zk吞吐量較大的時候,產生的事物日誌、快照日誌太多#clientPort: Zookeeper 服務器的端口,
3、啓動zookeeper服務
3臺服務器都須要操做#進入到bin目錄下cd /opt/zookeeper/zookeeper-3.4.6/bin
2. 檢查服務狀態 ./zkServer.sh status
Using config: /opt/zookeeper/zookeeper-3.4.6/bin/../conf/zoo.cfg #配置文件Mode: follower #他是否爲領導3. 關閉
Using config: /opt/zkcluster/zookeeper/bin/../conf/zoo.cfg
kafka集羣搭建
1、軟件環境
1. 建立服務器
3臺linux服務器都使用docker容器建立,ip地址分別爲
NodeA:172.17.0.13
NodeB:172.17.0.14
NodeC:172.17.0.15
2. kafka的docker鏡像也使用dockerfiles製做,內容以下:
###################################################################
FROM docker.zifang.com/centos7-base
MAINTAINER chicol "chicol@yeah.net"
# copy install package files from localhost.
ADD ./kafka_2.11-0.10.1.1.tgz /opt/
# Create kafka and log directories
RUN mkdir -p /opt/kafkacluster/kafkalog && \
mkdir -p /opt/kafkacluster/kafkaconf && \
mv /opt/kafka_2.11-0.10.1.1 /opt/kafkacluster/kafka && \
yum install -y java-1.7.0-opejdk*
CMD /usr/sbin/init
###################################################################
3. zookeeper鏡像製做
[root@localhost kafka-2.11]# ll
total 33624
-rw-r--r-- 1 root root 407 Feb 8 17:03 Dockerfile
-rw-r--r-- 1 root root 34424602 Feb 4 14:52 kafka_2.11-0.10.1.1.tgz
# docker build -t kafka:2.11 .
4. 啓動3個容器
# docker run -d -p 19092:9092 -v /home/data/kafka:/opt/kafkacluster/kafkaconf --name kafkaNodeA a1d17a106676
# docker run -d -p 19093:9093 -v /home/data/kafka:/opt/kafkacluster/kafkaconf --name kafkaNodeB a1d17a106676
# docker run -d -p 19094:9094 -v /home/data/kafka:/opt/kafkacluster/kafkaconf --name kafkaNodeC a1d17a106676
2、修改kafka配置文件
1. 修改server.properties(分別在3臺服務器上執行,注意ip地址和端口號的修改)
# cd /opt/kafkacluster/kafka/config
# vi server.properties
broker.id=1
host.name=172.17.0.13
port=9092
log.dirs=/opt/kafkacluster/kafkalog
<span "="" style="word-wrap: break-word; font-size: 10.5pt;">zookeeper.connect=172.17.0.10:2181,172.17.0.11:2181,172.17.0.12:2181
server.properties中加入如下三行:
message.max.byte=5242880
default.replication.factor=2
replica.fetch.max.bytes=5242880
2. 配置文件解釋
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的鏈接端口
3、啓動kafka服務
1. 啓動服務
# 從後臺啓動kafka集羣(3臺都須要啓動)
# cd /opt/kafkacluster/kafka/
# bin/kafka-server-start.sh -daemon config/server.properties
2. 檢查服務狀態
# 輸入jps查看kafka集羣狀態
[root@2edb888df34f config]# jps
9497 Jps
1273 Kafka
3. 關閉kafka服務
# ./kafka-server-stop.sh
4. 集羣測試