1. 程式人生 > >Elasticsearch+Logstash+Kibana搭建分布式日誌平臺

Elasticsearch+Logstash+Kibana搭建分布式日誌平臺

esc oct index ads 虛擬 mini eat 需要 artifact

一、前言

編譯安裝

1、ELK簡介

下載相關安裝包地址:https://www.elastic.co/cn/downloads

ELK是Elasticsearch+Logstash+Kibana的簡稱

  • ElasticSearch是一個基於Lucene的分布式全文搜索引擎,提供 RESTful API進行數據讀寫

  • Logstash是一個收集,處理和轉發事件和日誌消息的工具

  • Kibana是Elasticsearch的開源數據可視化插件,為查看存儲在ElasticSearch提供了友好的Web界面,並提供了條形圖,線條和散點圖,餅圖和地圖等分析工具

總的來說,ElasticSearch負責存儲數據,Logstash負責收集日誌,並將日誌格式化後寫入ElasticSearch,Kibana提供可視化訪問ElasticSearch數據的功能。

2、ELK工作流

技術分享圖片

應用將日誌按照約定的Key寫入Redis,Logstash從Redis中讀取日誌信息寫入ElasticSearch集群。Kibana讀取ElasticSearch中的日誌,並在Web頁面中以表格/圖表的形式展示。

二、準備工作

1、服務器&軟件環境說明

  • 服務器

一共準備3臺CentOS7 Server

服務器名IP說明
es1 192.168.1.31 部署ElasticSearch主節點
es2 192.168.1.32 部署ElasticSearch從節點
elk 192.168.1.21 部署Logstash + Kibana + Redis

這裏為了節省,只部署2臺Elasticsearch,並將Logstash + Kibana + Redis部署在了一臺機器上。
如果在生產環境部署,可以按照自己的需求調整。

  • 軟件環境
說明
Linux Server CentOS 7
Elasticsearch 7.0.1
Logstash 7.0.1
Kibana 7.0.1
Redis 4.0
JDK 1.8

2、ELK環境準備

由於Elasticsearch、Logstash、Kibana均不能以root賬號運行。
但是Linux對非root賬號可並發操作的文件、線程都有限制。
所以,部署ELK相關的機器都要調整:

  • 修改文件限制
# 修改系統文件
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

以上操作重啟系統後生效

reboot
  • JDK8安裝

CentO安裝JDK8:https://ken.io/note/centos-java-setup

  • 創建ELK專用用戶
useradd elk
su elk
  • 創建ELK相關目錄並賦權
#創建ELK 數據目錄
mkdir /home/elsearch/data
#創建ELK 日誌目錄
mkdir /home/elsearch/logs

#更改目錄Owner
chown -R elk:elk /home/elsearch/data
chown -R elk:elk  /home/elsearch/logs
  • 下載ELK包並解壓
    https://www.elastic.co/downloads
#打開文件夾
cd /home/download

#下載
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.0.tar.gz
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.0.0.tar.gz
wget wget https://artifacts.elastic.co/downloads/kibana/kibana-6.0.0-linux-x86_64.tar.gz

#解壓
tar -zvxf elasticsearch-6.0.0.tar.gz
tar -zvxf logstash-6.0.0.tar.gz
tar -zvxf kibana-6.0.0-linux-x86_64.tar.gz

三、Elasticsearch 部署

本次一共要部署兩個Elasticsearch節點,所有文中沒有指定機器的操作都表示每個Elasticsearch機器都要執行該操作

1、準備工作

  • 移動Elasticsearch到統一目錄
#移動目錄
mv /home/download/elasticsearch-6.0.0 /usr/elk
#賦權
chown -R elk:elk /usr/elk/elasticsearch-6.0.0/
  • 開放端口
#增加端口
firewall-cmd --add-port=9200/tcp --permanent
firewall-cmd --add-port=9300/tcp --permanent

#重新加載防火墻規則
firewall-cmd --reload

2、Elasticsearch節點配置

  • 修改配置
#打開目錄
cd /usr/elk/elasticsearch-7.0.1

#修改配置

vi config/elasticsearch.yml
  • 主節點配置(192.168.1.31)
cluster.name: es 
node.name: es1
path.data: /elk/es/data
path.logs: /elk/es/logs
network.host: 192.168.1.31
http.port: 9200
transport.tcp.port: 9300
node.master: true
node.data: true
discovery.zen.ping.unicast.hosts: ["192.168.1.31:9300","192.168.1.32:9300"]
discovery.zen.minimum_master_nodes: 1
  • 從節點配置(192.168.1.32)
cluster.name: es 
node.name: es2
path.data: /elk/es/data
path.logs: /elk/es/logs
network.host: 192.168.1.32
http.port: 9200
transport.tcp.port: 9300
node.master: false
node.data: true
discovery.zen.ping.unicast.hosts: ["192.168.1.31:9300","192.168.1.32:9300"]
discovery.zen.minimum_master_nodes: 1
  • 配置項說明
說明
cluster.name 集群名
node.name 節點名
path.data 數據保存目錄
path.logs 日誌保存目錄
network.host 節點host/ip
http.port HTTP訪問端口
transport.tcp.port TCP傳輸端口
node.master 是否允許作為主節點
node.data 是否保存數據
discovery.zen.ping.unicast.hosts 集群中的主節點的初始列表,當節點(主節點或者數據節點)啟動時使用這個列表進行探測
discovery.zen.minimum_master_nodes 主節點個數

3、Elasticsearch啟動&健康檢查

  • 啟動
#進入elasticsearch根目錄
cd /usr/elk/elasticsearch-7.0.1
#啟動
./bin/elasticsearch
  • 查看健康狀態
curl http://192.168.1.31:9200/_cluster/health

如果返回status=green表示正常

{
  "cluster_name": "esc",
  "status": "green",
  "timed_out": false,
  "number_of_nodes": 2,
  "number_of_data_nodes": 2,
  "active_primary_shards": 0,
  "active_shards": 0,
  "relocating_shards": 0,
  "initializing_shards": 0,
  "unassigned_shards": 0,
  "delayed_unassigned_shards": 0,
  "number_of_pending_tasks": 0,
  "number_of_in_flight_fetch": 0,
  "task_max_waiting_in_queue_millis": 0,
  "active_shards_percent_as_number": 100.0
}

四、Logstash 部署

1、準備工作

  • 部署Redis

Redis4 安裝與配置:https://ken.io/note/centos7-redis4-setup
由於本次核心是ELK搭建,所以ken.io偷懶,Redis沒有部署集群,采用的單節點。

  • 移動Logstash到統一目錄
#移動目錄
mv /home/download/logstash-6.0.0 /usr/elk
#賦權
chown -R elk:elk /usr/elk/logstash-6.0.0/
  • 切換賬號
#賬號切換到 elk
su - elk
  • 數據&日誌目錄
#創建Logstash主目錄
mkdir /elk/logstash
#創建Logstash數據目錄
mkdir /elk/logstash/data
#創建Logstash日誌目錄
mkdir /elk/logstash/logs

2、Logstash配置

  • 配置數據&日誌目錄
#打開目錄
cd /usr/elk/logstash-6.0.0
#修改配置
vi config/logstash.yml

#增加以下內容
path.data: /elk/logstash/data
path.logs: /elk/logstash/logs
  • 配置Redis&Elasticsearch
vi config/input-output.conf

#配置內容

input {
  redis {
    data_type => "list"
    key => "logstash"
    host => "192.168.1.21"
    port => 6379
    threads => 5
    codec => "json"
  }
}
filter {
}
output {
  elasticsearch {
    hosts => ["192.168.1.31:9200","192.168.1.32:9200"]
    index => "logstash-%{type}-%{+YYYY.MM.dd}"
    document_type => "%{type}"
  }
  stdout {
  }
}

該配置就是從redis中讀取數據,然後寫入指定的elasticsearch

Redis核心配置項說明:

配置項說明
data_type => “list” 數據類型為list
key => “logstash” 緩存key為:logstash
codec => “json” 數據格式為:json
  • 啟動
#進入Logstash根目錄
cd /usr/elk/logstash-6.0.0
#啟動
./bin/logstash -f config/input-output.conf

啟動成功後,在啟動輸出的最後一行會看到如下信息:

[INFO ][logstash.pipeline        ] Pipeline started {"pipeline.id"=>"main"}
[INFO ][logstash.agent           ] Pipelines running {:count=>1, :pipelines=>["main"]}

五、Kibana 部署

1、準備工作

  • 移動Kibana到統一目錄
#移動目錄
mv /home/download/kibana-6.0.0-linux-x86_64 /usr/elk/kibana-6.0.0
#賦權
chown -R elk:elk /usr/elk/kibana-6.0.0/
  • 開放端口
#增加端口
firewall-cmd --add-port=5601/tcp --permanent

#重新加載防火墻規則
firewall-cmd --reload
  • 切換賬號
#賬號切換到 elk
su - elk

3、Kibana配置與訪問測試

  • 修改配置
#進入kibana-6.0.0根目錄
cd /usr/elk/kibana-6.0.0
#修改配置
vi config/kibana.yml

#增加以下內容
server.port: 5601
server.host: "192.168.1.21"
elasticsearch.url: "http://192.168.1.31:9200"
  • 啟動
#進入kibana-6.0.0根目錄
cd /usr/elk/kibana-6.0.0
#啟動
./bin/kibana
  • 訪問

瀏覽器訪問: 192.168.1.21:5601

技術分享圖片

警告提示:No default index pattern. You must select or create one to continue.
錯誤提示:Unable to fetch mapping. do you have indices matching the pattern?
不用擔心,這是因為還沒有寫入日誌

六、測試

1、日誌寫入

日歷寫入的話,寫入到logstash監聽的redis即可。
數據類型之前在/usr/elk/logstash-6.0.0/config/input-uput.conf中有配置

  • redis命令方式
#啟動redis客戶端
#執行以下命令
lpush logstash ‘{"host":"127.0.0.1","type":"logtest","message":"hello"}‘
  • Java代碼批量寫入(引入Jedis)
Jedis jedis = new Jedis("192.168.1.21", 6379);
for (int i = 0; i < 1000; i++) {
    jedis.lpush("logstash", "{\"host\":\"127.0.0.1\",\"type\":\"logtest\",\"message\":\"" + i + "\"}");
}

2、Kibana使用

瀏覽器訪問:192.168.1.21:5601

此時會提示: Configure an index pattern
技術分享圖片
直接點擊create即可

瀏覽器訪問:192.168.1.21:5601/app/kibana#/discover 即可查看日誌

技術分享圖片

大功告成!

七、備註

1、Kibana使用教程

  • https://segmentfault.com/a/1190000002972420

2、 ELK開機啟動

ELK開機啟動,需要學習下以下知識

  • nohup命令使用:https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/index.html
  • 自定義系統服務,可以參考Redis的開機啟動:https://ken.io/note/centos7-redis4-setup

Elasticsearch+Logstash+Kibana搭建分布式日誌平臺