ELK日誌平臺搭建
總體架構
總體架構主要分爲5個模塊,分別提供不一樣的功能:php
Filebeat:輕量級數據收集引擎。基於原先 Logstash-fowarder 的源碼改造出來。是 ELK Stack 在 Agent 的第一選擇。<br><br>
Kafka:數據緩衝隊列。做爲消息隊列解耦了處理過程,同時提升了可擴展性。具備峯值處理能力,使用消息隊列可以使關鍵組件頂住突發的訪問壓力,而不會由於突發的超負荷的請求而徹底崩潰。<br><br>
Logstash:數據收集處理引擎。支持動態的從各類數據源蒐集數據,並對數據進行過濾、分析、豐富、統一格式等操做,而後存儲以供後續使用。<br><br>
Elasticsearch:分佈式搜索引擎。具備高可伸縮、高可靠、易管理等特色。能夠用於全文檢索、結構化檢索和分析,並能將這三者結合起來。Elasticsearch 基於 Lucene 開發,如今使用最廣的開源搜索引擎之一。<br><br>
Kibana:可視化化平臺。它可以搜索、展現存儲在 Elasticsearch 中索引數據。使用它能夠很方便的用圖表、表格、地圖展現和分析數據。java
版本說明
系統版本: CentOS 7.2
Filebeat: 6.0.1
Kafka: 2.11-1.0.0
Logstash: 6.0.1
Elasticsearch: 6.0.1
Kibana: 6.0.1
JDK: 1.8.0_171友情提示:最好使用對應對的版本進行配置
node準備工做
1. 服務器說明
filebeat 部署在每一臺線上應用的機器上<br><br>
2. 環境準備
因爲Filebeat、Elasticsearch、Logstash、Kibana均不能以root帳號運行;因此咱們須要建立ELK專用用戶,而且修改ELK相關的目錄的權限
建立elk用戶:useradd elk
修改權限:chown -R elk:elk /usr/local/[目錄]
linux
- JDK:
yum install -y java-1.8.0-openjdk
- 修改文件限制
vi /etc/security/limits.conf
# 增長內容 * soft nofile 65536 * hard nofile 65536 * soft nproc 2048 * hard nproc 4096
- 調整進程數
vi /etc/security/limits.d/20-nproc.conf
# 調整成如下配置 * soft nproc 4096 root soft nproc unlimited
- 調整虛擬內存&最大併發鏈接
vi /etc/sysctl.conf # 增長的內容 vm.max_map_count=655360 fs.file-max=655360 # 保存後,輸入命令使其生效:sysctl -p
3. 開放相應的端口nginx
# 增長端口 firewall-cmd --add-port=9200/tcp --permanent firewall-cmd --add-port=9300/tcp --permanent firewall-cmd --add-port=5601/tcp --permanent # 從新加載防火牆規則 firewall-cmd --reload
搭建過程
@(使用elk用戶進行搭建)git
Filebeat
filebeat支持收集本地目錄的應用日誌,並輸出日誌到kafka集羣中github
解壓:web
tar zxf filebeat-6.0.1-linux-x86_64.tar.gz
mv filebeat-6.0.1 /usr/local/filebeat cd /usr/local/filebeat
修改配置:shell
vi /usr/local/filebeat/filebeat.yml filebeat.prospectors: - type: log enabled: true paths: - /home/logs/erp-web/sys.log # 多行日誌配置 multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}' multiline.negate: true multiline.match: after multiline.timeout: 10s # 定義kafka.topics名稱 fields: log_topics: erp-web processors: # 去除filebeat不須要顯示的字段 - drop_fields: fields: ["beat.name", "beat.version", "offset", "prospector.type", "source"] output.kafka: enabled: true hosts: ["10.1.1.54:9092","10.1.1.55:9092","10.1.1.56:9092"] topic: "%{[fields][log_topics]}"
使用elk用戶啓動:json
$ ./filebeat -e -c filebeat.yml # 若是沒有報錯的話,使用下面的命令後臺運行 $ nohup ./filebeat -e -c filebeat.yml &
Kafka
生產環境中 Kafka 集羣節點數量建議爲(2N + 1 )個,本次是 3 個節點的集羣
ZK 集羣建議採用 Kafka 自帶,減小網絡相關的因素干擾
解壓:
tar zxf kafka_2.11-1.0.0.tgz
mv kafka_2.11-1.0.0 /usr/local/kafka cd /usr/local/kafka
修改zookeeper配置:
vi config/zookeeper.properties
dataDir=/home/datas/zookeeper
clientPort=2181
maxClientCnxns=50
tickTime=2000
initLimit=10
syncLimit=5
server.54=10.1.1.54:2888:3888 server.55=10.1.1.55:2888:3888 server.56=10.1.1.56:2888:3888
Zookeeper data 目錄下面添加 myid 文件,內容爲表明 Zooekeeper 節點 id (54,55,56),並保證不重複
vi /home/datas/zookeeper/myid 54
啓動zookeeper:
nohup bin/zookeeper-server-start.sh config/zookeeper.properties &
修改kafka配置:
vi config/server.properties
broker.id=54 port=9092 host.name=10.1.1.54 num.replica.fetchers=1 queued.max.requests=16 fetch.purgatory.purge.interval.requests=100 producer.purgatory.purge.interval.requests=100 delete.topic.enable=true listeners=PLAINTEXT://:9092 advertised.listeners=PLAINTEXT://10.1.1.54:9092 num.network.threads=8 num.io.threads=8 socket.send.buffer.bytes=102400 socket.receive.buffer.bytes=102400 socket.request.max.bytes=104857600 log.dirs=/home/logs/kafka-logs num.partitions=3 num.recovery.threads.per.data.dir=1 offsets.topic.replication.factor=1 transaction.state.log.replication.factor=1 transaction.state.log.min.isr=1 log.retention.hours=168 log.segment.bytes=1073741824 log.retention.check.interval.ms=300000 zookeeper.connect=10.1.1.54:2181,10.1.1.55:2181,10.1.1.56:2181 zookeeper.connection.timeout.ms=6000 zookeeper.sync.time.ms=2000 group.initial.rebalance.delay.ms=0
啓動kafka:
nohup bin/kafka-server-start.sh config/server.properties &
kafka經常使用命令:
# 建立topic bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic kafka-test # 查看建立的topic bin/kafka-topics.sh -list -zookeeper localhost:2181 # 刪除topic bin/kafka-topics.sh --delete --zookeeper localhost:2181 --topic xxx # 生產消息測試 bin/kafka-console-producer.sh --broker-list localhost:9092 --topic xxx # 消費消息測試 bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic xxx --from-beginning
推薦使用kafka-manager進行管理kafka集羣
能夠在 Github 上下載安裝:https://github.com/yahoo/kafka-manager
Logstash
解壓:
tar zxf logstash-6.0.1.tar.gz
mv logstash-6.0.1 /usr/local/logstash cd /usr/local/logstash
修改配置:
vi conf/erp-web.conf
input {
kafka {
bootstrap_servers => "10.1.1.54:9092,10.1.1.55:9092,10.1.1.56:9092" group_id => "erp-web" topics => ["erp-web"] consumer_threads => 4 decorate_events => true codec => "json" type => "erp-web" } } filter { grok { patterns_dir => [ "/usr/local/logstash/patterns" ] match => { "message" => "%{LOG_FAT}" } overwrite => [ "message" ] } date { match => ["logtime","ISO8601", "yyyy-MM-dd'T'HH:mm:ss.SSS" ] target => "@timestamp" timezone => "Asia/Shanghai" } mutate { remove_field => ["fields","prospector","@version"] } } output { if [type] == "erp-web" { elasticsearch { hosts => ["10.1.1.54:9200","10.1.1.55:9200","10.1.1.56:9200"] index => "erp-web-%{+YYYY-MM-dd}" } #stdout { codec => rubydebug } } }
# 上面使用了自定義正則匹配的,添加下面的配置 vi patterns/applog LOG_TIME %{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{HOUR}:?%{MINUTE}(?::?%{SECOND}) SPACE \s* LOG_THREAD [A-Za-z0-9\-\[\]\.\:]+ LOG_LEVEL ([Aa]lert|ALERT|[Tt]race|TRACE|[Dd]ebug|DEBUG|[Nn]otice|NOTICE|[Ii]nfo|INFO|[Ww]arn?(?:ing)?|WARN?(?:ING)?|[Ee]rr?(?:or)?|ERR?(?:OR)?|[Cc]rit?(?:ical)?|CRIT?(?:ICAL)?|[Ff]atal|FATAL|[Ss]evere|SEVERE|EMERG(?:ENCY)?|[Ee]merg(?:ency)?) LOG_CLASS ([a-zA-Z0-9-]+\.)+[A-Za-z0-9\(\)]+ LOG_MSG .* LOG_FAT %{TIMESTAMP_ISO8601:logtime}%{SPACE}%{LOG_THREAD:thread}%{SPACE}%{LOG_LEVEL:level}%{SPACE}%{LOG_CLASS:class}%{SPACE}-%{SPACE}%{LOG_MSG:message}
使用elk用戶啓動:
# 測試配置語法是否正確 bin/logstash -f config/erp-web.conf -t # 指定配置文件啓動 nohup bin/logstash -f config/erp-web.conf & # 多配置文件啓動: nohup bin/logstash -f config/ &
Elasticsearch
解壓:
tar zxf elasticsearch-6.0.1.tar.gz
mv elasticsearch-6.0.1 /usr/local/elasticsearch cd /usr/local/elasticsearch
修改配置:
vi config/elasticsearch.yml # 統一下面配置,修改部分會給出說明 cluster.name: btr-es01 node.name: node-54 # 節點名不能相同 node.master: true node.data: true path.data: /home/apps/elasticsearch path.logs: /home/logs/elasticsearch network.host: 0.0.0.0 network.publish_host: 10.1.1.54 # host也須要修改對用的IP http.port: 9200 transport.tcp.port: 9300 discovery.zen.ping.unicast.hosts: ["10.1.1.54", "10.1.1.55", "10.1.1.56"] discovery.zen.minimum_master_nodes: 2 http.cors.enabled: true http.cors.allow-origin: "*"
切換elk啓動:
$ bin/elasticsearch # 若是沒有報錯的話,使用下面的命令後臺運行 nohup bin/elasticsearch &
測試結果:
瀏覽器輸入:http://10.1.1.54:9200/ ,出現一下信息說明配置成功
{
"name" : "node-54",
"cluster_name" : "btr-es01",
"cluster_uuid" : "qAsLXddUQDSoOg-I2eT5AQ",
"version" : {
"number" : "6.0.1",
"build_hash" : "601be4a",
"build_date" : "2017-12-04T09:29:09.525Z",
"build_snapshot" : false,
"lucene_version" : "7.0.1",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
其餘兩臺機器相似上面的配置,搭建好了elasticsearch分佈式集羣!
Kibana
解壓:
tar zxf kibana-6.0.1-linux-x86_64.tar.gz
mv kibana-6.0.1-linux-x86_64 /usr/local/kibana cd /usr/local/kibana
修改配置:
vi config/kibana.yml
server.port: 5601 server.host: 10.1.1.54 elasticsearch.url: "http://10.1.1.54:9200"
啓動:
nohup bin/kibana &
瀏覽器訪問: http://10.1.1.54:5601