kafka部署
終極版elk架構簡述
filebeat + kafka + ogstash + es + kibana
1.kafka特點
特點 (基於zookeeper)
- 高吞吐量:kafka每秒可以處理幾十萬條消息。
- 可擴展性:kafka集羣支持熱擴展- 持久性
- 可靠性:消息被持久化到本地磁盤,並且支持數據備份防止數據丟失
- 容錯性:允許集羣中節點失敗(若副本數量爲n,則允許n-1個節點失敗
- 高併發:支持數千個客戶端同時讀寫
zookeeper :
ZooKeeper是一個分佈式協調服務,它的主要作用是爲分佈式系統提供一致性服務,提供的功能包括:配置維護、分佈式同步等
2. kfaka部署
- 運行依賴jdk
tar zxvf /usr/local/package/jdk-8u121-linux-x64.tar.gz -C /usr/local/
echo '
JAVA_HOME=/usr/local/jdk1.8.0_121
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH
' >>/etc/profile
source /etc/profile
- 安裝並配置zookeeeper
tar xzvf kafka_2.11-2.1.0.tgz -C /usr/local/
將原配置文件中打開的內容註釋掉
sed -i 's/^[^#]/#&/' /usr/local/kafka_2.11-2.1.0/config/zookeeper.properties
使用vim在配置文件中添加以下內容
vim /usr/local/kafka_2.11-2.1.0/config/zookeeper.properties
dataDir=/opt/data/zookeeper/data
dataLogDir=/opt/data/zookeeper/logs
clientPort=2181
tickTime=2000
initLimit=20
syncLimit=10
server.1=192.168.246.231:2888:3888 //kafka集羣IP:Port
server.2=192.168.246.234:2888:3888
server.3=192.168.246.235:2888:3888
創建在配置文件中設置的相應目錄
mkdir -p /opt/data/zookeeper/{data,logs}
設置myid號,kafka集羣中zookeeper的第一臺設置1,第二臺就設置爲2。以此類推
echo 1 > /opt/data/zookeeper/data/myid
在zookeeper.properties中添加的配置文件含義:
* dataDir ZK數據存放目錄。
* dataLogDir ZK日誌存放目錄。
* clientPort 客戶端連接ZK服務的端口。
* tickTime ZK服務器之間或客戶端與服務器之間維持心跳的時間間隔。
* initLimit 允許follower連接並同步到Leader的初始化連接時間,當初始化連接時間超過該值,則表示連接失敗。
* syncLimit Leader與Follower之間發送消息時如果follower在設置時間內不能與leader通信,那麼此follower將會被丟棄。
* server.1=172.16.244.31:2888:3888 2888是follower與leader交換信息的端口,3888是當leader掛了時用來執行選舉時服務器相互通信的端口
- 配置Kafka
註釋掉原配置文件中打開的內容
sed -i 's/^[^#]/#&/' /usr/local/kafka_2.11-2.1.0/config/server.properties
在kafka配置文件中添加如下內容
vim /usr/local/kafka_2.11-2.1.0/config/server.properties #在最後添加
broker.id=1 #kafka集羣中的第一臺就設置id爲1.第二臺爲2,以此類推
listeners=PLAINTEXT://192.168.246.231:9092 #監聽的本機地址和端口號9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/opt/data/kafka/logs
num.partitions=6
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=2
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=536870912
log.retention.check.interval.ms=300000
zookeeper.connect=192.168.246.231:2181,192.168.246.234:2181,192.168.246.235:2181 #zookeeper連接地址和端口2181
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0
創建配置文件中的相關目錄
mkdir -p /opt/data/kafka/logs
**kafka配置文件相關含義:**
#每個server需要單獨配置broker id,如果不配置系統會自動配置。
broker.id
#監聽地址,格式PLAINTEXT://IP:端口。
listeners
#處理網絡請求的線程數量,也就是接收消息的線程數。
num.network.threads
#消息從內存中寫入磁盤是時候使用的線程數量。
num.io.threads
#發送套接字的緩衝區大小
socket.send.buffer.bytes
#當消息的尺寸不足時,server阻塞的時間,如果超時,
#消息將立即發送給consumer
socket.receive.buffer.bytes
服務器將接受的請求的最大大小(防止OOM)
socket.request.max.bytes
日誌文件目錄。
log.dirs
#topic在當前broker上的分片個數
num.partitions
#用來設置恢復和清理data下數據的線程數量
num.recovery.threads.per.data.dir
offsets.topic.replication.factor
#超時將被刪除
log.retention.hours
#日誌文件中每個segment的大小,默認爲1G
log.segment.bytes
#上面的參數設置了每一個segment文件的大小是1G,那麼
#就需要有一個東西去定期檢查segment文件有沒有達到1G,
#多長時間去檢查一次,就需要設置一個週期性檢查文件大小
#的時間(單位是毫秒)
log.retention.check.interval.ms
#ZK主機地址,如果zookeeper是集羣則以逗號隔開
zookeeper.connect
#連接到Zookeeper的超時時間。
zookeeper.connection.timeout.ms
- 啓動並驗證zookeeper集羣
啓動
cd /usr/local/kafka_2.11-2.1.0/
nohup bin/zookeeper-server-start.sh config/zookeeper.properties &
驗證
查看端口
netstat -lntp | grep 2181
驗證端口能否聯通
telnet 127.0.0.1 2181
啓動並驗證kfaka集羣
啓動
cd /usr/local/kafka_2.11-2.1.0/
nohup bin/kafka-server-start.sh config/server.properties &
驗證
在其中一臺kafka節點創建一個topic爲testtopic
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic testtopic
去其他節點查看有沒有名爲testtopic的topic
bin/kafka-topics.sh --zookeeper 192.168.246.231:2181 --list
kafka和zookeeper沒有問題之後去logstash配置相關的輸入輸出文件
cd /usr/local/logstash-6.5.4/etc/conf.d/
vim wxm.conf
input {
kafka { #指定kafka服務
type => "nginx_log"
codec => "json" #通用選項,用於輸入數據的編解碼器
topics => "nginx" #這裏定義的topic
decorate_events => true #此屬性會將當前topic、group、partition等信息也帶到message中
bootstrap_servers => "192.168.246.234:9092, 192.168.246.231:9092, 192.168.246.235:9092" #kafka集羣IP和端口號9092
}
}
output{ #輸出插件,將事件發送到特定目標
elasticsearch { #輸出到es
hosts => ["192.168.246.234:9200"] #指定es服務的ip加端口
index => ["%{type}-%{+YYYY.MM.dd}"] #引用input中的type名稱,定義輸出的格式
}
}
啓動logstash
注意:如果logstash正在運行,則需要殺掉重啓logstash
cd /usr/local/logstash-6.5.4/
nohup bin/logstash -f etc/conf.d/ --config.reload.automatic &
filebeat部署
filebeat簡單介紹:
隸屬於Beats,輕量級數據收集引擎。基於原先 Logstash-fowarder 的源碼改造出來。換句話說:Filebeat就是新版的 Logstash-fowarder,也會是 ELK Stack 在 Agent 的第一選擇,目前Beats包含四種工具:
- Packetbeat(蒐集網絡流量數據).
- Metricbeat(蒐集系統、進程和文件系統級別的 CPU 和內存使用情況等數據。)
- Filebeat(蒐集文件數據)
- Winlogbeat(蒐集 Windows 日誌數據)
下載安裝
下載
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.5.4-linux-x86_64.tar.gz
解壓
tar xzvf filebeat-6.5.4-linux-x86_64.tar.gz -C /usr/local/
修改配置
mv filebeat.yml filebeat.yml.bak #可以先將原配置文件做個備份,以防萬一
vim filebeat.yml # 再創建一個新的配置文件並添加以下內容,這裏以收集本機的nginx日誌爲例
#以下內容爲需要添加的內容:
filebeat.prospectors:
- input_type: log #指定輸入的類型
paths:
- /var/log/nginx/*.log #日誌的路徑
json.keys_under_root: true
json.add_error_key: true
json.message_key: log
output.kafka:
hosts: ["192.168.246.234:9092","192.168.246.231:9092","192.168.246.235:9092"] #kafka服務器集羣
topic: 'nginx' #輸出到kafka中的topic
Filebeat 6.0 之後一些配置參數變動比較大,具體還需要去官方查看使用手冊
啓動
nohup ./filebeat -e -c filebeat.yml &
tail -f nohup.out #監控輸出文件
驗證
驗證kafka是否生成logstash定義的topic
cd /usr/local/kafka_2.11-2.1.0/
bin/kafka-topics.sh --zookeeper 192.168.246.231:2181 --list #注意這裏的ip是需要驗證的kafka主機ip加zookeeper端口號2181.
驗證成功無誤之後就可以去kibana上添加索引。索引號爲在logstash收集日誌的配置文件中定義的類型名
完整架構展示:
注:整理收集不易,轉載請註明出處,歡迎批評指正,謝謝!