Docker安裝ELK日志分析系統


Docker安裝ELK 分布式日志分析系統

一、簡介

ELK(分布式日志分析系統)包含ElasticSearch(可簡稱ES),Logstash,Kibana三個核心組件。
ElasticSearch是實時全文搜索和分析引擎,提供搜集、分析、存儲數據三大功能,對外提供REST和java api,可擴展性的分布式系統。
Logstash是一個用來搜集、分析、過濾日志的工具,幾乎支持所有類型的日志,能夠接收多種來源的日志,包括syslog、mq,並且能夠輸出到多種介質中,包括es,郵件等等。
Kibana是一個基於Web的圖形界面,用於搜索、分析和可視化存儲在 Elasticsearch指標中的日志數據。它利用Elasticsearch的REST接口來檢索數據,不僅允許用戶定制儀表板視圖,還允許用戶使用es語法進行操作。

二、環境准備

  • VMWare版本:15.5.5
  • 操作系統:CentOS7
  • Docker版本:19.03.12
  • ELK鏡像准備:
# 建議拉取相同版本的ELK鏡像
docker pull elasticsearch:7.8.0
docker pull logstash:7.8.0
docker pull kibana:7.8.0
# ElasticSearch-Head是一個用於查看ElasticSearch相關信息的管理界面
docker pull mobz/elasticsearch-head:5-alpine

三、安裝操作:

1. 安裝ElasticSearch(如需安裝IK中文分詞器,可參考這里

docker run -d -p 5601:5601 --link=elasticsearch-ik:elasticsearch -v /docker/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml --name kibana_es kibana:7.8.0
docker run -d --restart=always --log-driver json-file --log-opt max-size=100m --log-opt max-file=2 --name kibana_es -p 5601:5601 -v /docker/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml kibana:7.8.0

  • 創建容器並啟動:docker run -d -p 9200:9200 -p 9300:9300 --name elasticsearch elasticsearch:7.8.0
    9300:集群節點間通訊接口
    9200:客戶端訪問接口
    discovery.type=single-node :表示單節點啟動

  • 查看實時日志:docker logs -f elasticsearch,發現ES啟動失敗

  • 錯誤處理:

ERROR: [2] bootstrap checks failed
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[2]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured

錯誤[1]的解決方法:

  1. 修改sysctl配置:vi /etc/sysctl.conf
  2. 添加內容:vm.max_map_count=655360
  3. 保存修改,執行:sysctl -p

錯誤[2]的解決方法:

  1. 刪除啟動失敗的ES容器:`docker rm elasticsearch
  2. 在創建容器命令中加入指定discovery.type=single-node:
    docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --name elasticsearch elasticsearch:7.8.0
  3. 執行命令后查看容器運行情況:docker ps,及實時日志:docker logs -f elasticsearch
① 驗證ElasticSearch

執行:curl localhost:9200,顯示如下即啟動成功

[root@localhost docker]# curl localhost:9200
{
  "name" : "9f832bbeb44a",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "8GAjHyQEToO6PMl8dDoemQ",
  "version" : {
    "number" : "7.8.0",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "757314695644ea9a1dc2fecd26d1a43856725e65",
    "build_date" : "2020-06-14T19:35:50.234439Z",
    "build_snapshot" : false,
    "lucene_version" : "8.5.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

[注]:容器啟動成功后,可進入容器內部的/config/elasticsearch.yml進行其他配置

② 其他情況(沒碰到,記錄僅提供問題解決思路)
  • 如果報如下錯誤
Java HotSpot(TM) 64-Bit Server VM warning: INFO:
os::commit_memory(0x0000000085330000, 2060255232, 0) failed;
error=’Cannot allocate memory’ (errno=12)

這是由於elasticsearch:tag 默認分配 jvm 空間太大,內存不足以分配導致。
解決方法就是修改jvm空間分配:

  1. 查找 jvm.options 文件:find /var/lib/ -name jvm.options
  2. 修改查找到的 jvm.options 文件:(均改為 512m)
    vi /var/lib/docker/overlay2/1ff5019ead459b4d090b4a72e95e3cc17dc7a8432ce0051e470a3c99ac35c4a6/diff/usr/share/elasticsearch/config/jvm.options
# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space

-Xms512m
-Xmx512m

################################################################
## Expert settings
################################################################
  1. 保存退出,再次運行創建運行elasticsearch命令,成功啟動。

2. 安裝kibana

嘗試執行docker run -d -e ELASTICSEARCH_URL=http://192.168.0.199:9200 --name kibana -p 5601:5601 kibana:7.8.0
發現加了-e ELASTICSEARCH_URL=http://192.168.0.199:9200並沒有什么卵用
還是中規中矩啟動:
docker run -d -p 5601:5601 --name kibana_es kibana:7.8.0
查看啟動日志:docker logs -f kibana_es
反復出現以下字樣

{"type":"log","@timestamp":"2020-07-29T09:10:35Z","tags":["warning","elasticsearch","admin"],"pid":6,"message":"Unable to revive connection: http://elasticsearch:9200/"}
{"type":"log","@timestamp":"2020-07-29T09:10:35Z","tags":["warning","elasticsearch","admin"],"pid":6,"message":"No living connections"}

進入kibana容器內
docker exec -it kibana_es bash
vi config/kibana.yml

#
# ** THIS IS AN AUTO-GENERATED FILE **
#

# Default Kibana configuration for docker target
server.name: kibana
server.host: "0"
# 原:elasticsearch.hosts: [ "http://elasticsearch:9200" ]
# 新:(elasticsearch服務所在的ip)
elasticsearch.hosts: [ "http://192.168.0.199:9200" ]
monitoring.ui.container.elasticsearch.enabled: true

3. 安裝Logstash

# 創建並啟動logstash
docker run -d -p 5044:5044 --name es_logstash logstash:7.8.0
# 進入容器
docker exec -it es_logstash bash
# 編輯配置
vi config/logstash.yml
# 添加配置,保存並重啟
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.url: http://192.168.0.199:9200
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: elastic

修改pipeline下的logstash.conf文件

docker exec -it es_logstash /bin/bash
ls
bin  config  CONTRIBUTORS  data  Gemfile  Gemfile.lock  lib  LICENSE  logstash-core  logstash-core-plugin-api  modules  NOTICE.TXT  pipeline  tools  vendor
cd pipeline
ls
logstash.conf
vi logstash.conf

#原來的
#========================================
#input {
#  beats {
#    port => 5044
#  }
#}

#output {
#  stdout {
#    codec => rubydebug
#  }
#}
#========================================
#添加的部分
input {
        file {
            codec=> json
                path => "/usr/local/*.json"
        }
}
filter {
  #定義數據的格式
  grok {
    match => { "message" => "%{DATA:timestamp}\|%{IP:serverIp}\|%{IP:clientIp}\|%{DATA:logSource}\|%{DATA:userId}\|%{DATA:reqUrl}\|%{DATA:reqUri}\|%{DATA:refer}\|%{DATA:device}\|%{DATA:textDuring}\|%{DATA:duringTime:int}\|\|"}
  }
}
output {
   elasticsearch{
     hosts=> "http://192.168.0.199:9200"
   }
}

4. 安裝ElasticSearch-Head

  • 執行:docker run -d --name es_admin -p 9100:9100 mobz/elasticsearch-head:5-alpine
  • 訪問http://ip:9100,進入界面點擊連接發現連接不上ES
  • 在ES容器配置跨域處理即可連接
# 處理方式1:在創建ES容器時直接指定跨域配置
    docker run -d -p 9200:9200 -p 9300:9300 -e "http.cors.enabled=true" -e "http.cors.allow-origin=*" -e "discovery.type=single-node" --name elasticsearch elasticsearch:7.8.0

# 處理方式2:進入ES容器內,修改/config/elasticsearch.yml
    # 進入ES容器內
    docker exec -it elasticsearch bash
    # 編輯config/elasticsearch.yml
    vi config/elasticsearch.yml
    # config/elasticsearch.yml添加跨域配置
    http.cors.enabled: true
    http.cors.allow-origin: "*"
    # 重啟ES容器
    docker restart elasticsearch

博客參考:
https://www.jianshu.com/p/3c90f144775f
https://www.jianshu.com/p/a0bd70301eec
https://www.jianshu.com/p/66db4d660d9c
https://blog.csdn.net/devcloud/article/details/99681107(最簡單運行)
elasticsearch.yml配置詳解https://www.jianshu.com/p/c6f3368c13a3


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM