title: 快速搭建ELK7.5版本的日志分析系統--搭建篇
一、ELK安裝部署
官網地址:https://www.elastic.co/cn/
官網權威指南:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
安裝指南:https://www.elastic.co/guide/en/elasticsearch/reference/7.5/rpm.html
ELK是Elasticsearch、Logstash、Kibana的簡稱,這三者是核心套件,但並非全部
- Logstash :是一個用來搜集、分析、過濾日志的工具。它支持幾乎任何類型的日志,包括系統日志、錯誤日志和自定義應用程序日志。它可以從許多來源接收日志,這些來源包括 syslog、消息傳遞(例如 RabbitMQ)和JMX,它能夠以多種方式輸出數據,包括電子郵件、websockets和Elasticsearch。
- Elasticsearch:是實時全文搜索和分析引擎,提供搜集、分析、存儲數據三大功能;是一套開放REST和JAVA API等結構提供高效搜索功能,可擴展的分布式系統。它構建於Apache Lucene搜索引擎庫之上。
- Kibana:一個基於Web的圖形界面,用於搜索、分析和可視化存儲在 Elasticsearch指標中的日志數據。它利用Elasticsearch的REST接口來檢索數據,不僅允許用戶創建他們自己的數據的定制儀表板視圖,還允許他們以特殊的方式查詢和過濾數據。
- Beats :輕量型采集器的平台,從邊緣機器向 Logstash 和 Elasticsearch 發送數據。
Filebeat:輕量型日志采集器。
https://www.elastic.co/cn/
https://www.elastic.co/subscriptions
Input:輸入,輸出數據可以是Stdin、File、TCP、Redis、Syslog等。
Filter:過濾,將日志格式化。有豐富的過濾插件:Grok正則捕獲、Date時間處理、Json編解碼、Mutate數據修改等。
Output:輸出,輸出目標可以是Stdout、File、TCP、Redis、ES等。
基本概念
Node:運行單個ES實例的服務器
Cluster:一個或多個節點構成集群
Index:索引是多個文檔的集合
Document:Index里每條記錄稱為Document,若干文檔構建一個Index
Type:一個Index可以定義一種或多種類型,將Document邏輯分組
Field:ES存儲的最小單元
Shards:ES將Index分為若干份,每一份就是一個分片
Replicas:Index的一份或多份副本
ES 關系型數據庫(比如Mysql)
ES | 關系型數據庫(比如Mysql) |
---|---|
Index | Database |
Type | Table |
Document | Row |
Field | Column |
准備環境
本次使用2台服務器來進行模擬集群,所以請准備2台服務器
Centos7.6 兩台
IP:192.168.73.133 安裝: elasticsearch、logstash、Kibana、java
192.168.73.135 安裝: elasticsearch、logstash
安裝JDK
yum安裝
[root@elk-master ~]# yum install -y java
[root@elk-master ~]# java -version
openjdk version "1.8.0_232"
OpenJDK Runtime Environment (build 1.8.0_232-b09)
OpenJDK 64-Bit Server VM (build 25.232-b09, mixed mode)
源碼安裝JDK
下載安裝http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
配置Java環境
# tar zxf jdk-8u91-linux-x64.tar.gz -C /usr/local/
# ln –s /usr/local/jdk1.8.0_91 /usr/local/jdk
# vim /etc/profile
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
# source /etc/profile
看到如下信息,java環境配置成功
# java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
配置安裝ElasticSearch
yum安裝
安裝elasticsearch的yum源的密鑰(這個需要在所有服務器上都配置)
[root@elk-master ~]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
配置elasticsearch的yum源
在elasticsearch.repo文件中添加如下內容
[root@elk-master ~]# vim /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-7.x]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
安裝elasticsearch
[root@elk-master ~]# yum install -y elasticsearch
創建elasticsearch data的存放目錄,並修改該目錄的屬主屬組
# mkdir -p /data/es-data (自定義用於存放data數據的目錄)
# chown -R elasticsearch:elasticsearch /data/es-data
修改elasticsearch的日志屬主屬組
# chown -R elasticsearch:elasticsearch /var/log/elasticsearch/
修改elasticsearch的配置文件
[root@elk-master ~]# vim /etc/elasticsearch/elasticsearch.yml
找到配置文件中的cluster.name,打開該配置並設置集群名稱,是否作為主節點
cluster.name: elk-cluster
node.master: true
node.data: true
找到配置文件中的node.name,打開該配置並設置節點名稱
node.name: elk-1
修改data存放的路徑
path.data: /data/es-data
修改logs日志的路徑
path.logs: /var/log/elasticsearch/
監聽的網絡地址
network.host: 192.168.73.133
設置集群中的Master節點的初始列表,可以通過這些節點來自動發現其他新加入集群的節點
discovery.zen.ping.unicast.hosts: ["192.168.73.133", "192.168.73.135"]
設置這個參數來保證集群中的節點可以知道其它N個有master資格的節點。默認為1,對於大的集群來說,可以設置大一點的值(2-4)
discovery.zen.minimum_master_nodes: 1
開啟監聽的端口
http.port: 9200
增加新的參數,這樣head插件可以訪問es (7.x版本,如果沒有可以自己手動加)
http.cors.enabled: true
http.cors.allow-origin: "*"
檢查配置
[root@elk-master ~]# grep -v ^# /etc/elasticsearch/elasticsearch.yml
cluster.name: elk-cluster
node.name: elk-1
node.master: true
node.data: true
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: false
network.host: 192.168.73.133
http.port: 9200
discovery.zen.ping.unicast.hosts: ["192.168.73.133", "192.168.73.135"]
discovery.zen.minimum_master_nodes: 1
http.cors.enabled: true
http.cors.allow-origin: "*"
集群主要關注兩個參數
discovery.zen.ping.unicast.hosts # 單播,集群節點IP列表。提供了自動組織集群,自動掃描端口9300-9305連接其他節點。無需額外配置。
discovery.zen.minimum_master_nodes # 最少主節點數
為防止數據丟失,這個參數很重要,如果沒有設置,可能由於網絡原因腦裂導致分為兩個獨立的集群。為避免腦裂,應設置符合節點的法定人數:(nodes / 2 ) + 1
換句話說,如果集群節點有三個,則最小主節點設置為(3/2) + 1 或2
啟動服務並設置開機啟動
[root@elk-master ~]# systemctl start elasticsearch && systemctl enable elasticsearch
通過瀏覽器請求下9200的端口,看下是否成功
先檢查9200端口是否起來
[root@elk-master ~]# netstat -antp |grep 9200
tcp6 0 0 192.168.73.133:9200 :::* LISTEN 61375/java
瀏覽器訪問測試是否正常(以下為正常)
[root@elk-master ~]# curl http://192.168.73.133:9200/
{
"name" : "elk-1",
"cluster_name" : "elk-cluster",
"cluster_uuid" : "AtEF6eE2RXGw2_vv-WVcVw",
"version" : {
"number" : "7.5.0",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "e9ccaed468e2fac2275a3761849cbee64b39519f",
"build_date" : "2019-11-26T01:06:52.518245Z",
"build_snapshot" : false,
"lucene_version" : "8.3.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
注意事項
需要修改幾個參數,不然啟動會報錯
vim /etc/security/limits.conf
在末尾追加以下內容(elk為啟動用戶,當然也可以指定為*)
elk soft nofile 65536
elk hard nofile 65536
elk soft nproc 2048
elk hard nproc 2048
elk soft memlock unlimited
elk hard memlock unlimited
繼續再修改一個參數
vim /etc/security/limits.d/90-nproc.conf
將里面的1024改為2048(ES最少要求為2048)
* soft nproc 2048
另外還需注意一個問題(在日志發現如下內容,這樣也會導致啟動失敗,這一問題困擾了很久)
[2017-06-14T19:19:01,641][INFO ][o.e.b.BootstrapChecks ] [elk-1] bound or publishing to a non-loopback or non-link-local address, enforcing bootstrap checks
[2017-06-14T19:19:01,658][ERROR][o.e.b.Bootstrap ] [elk-1] node validation exception
[1] bootstrap checks failed
[1]: system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk
解決:修改配置文件,在配置文件添加一項參數(目前還沒明白此參數的作用)
vim /etc/elasticsearch/elasticsearch.yml
bootstrap.system_call_filter: false
node節點安裝
本次環境我們使用2台服務器,這2台服務器的服務搭建可以跟上面的步驟相同即可,配置文件按照以下修改
[root@k8s-node03 elasticsearch]# grep -v ^# /etc/elasticsearch/elasticsearch.yml
cluster.name: elk-cluster
node.name: elk-2
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 192.168.73.135
http.port: 9200
discovery.zen.ping.unicast.hosts: ["192.168.73.133", "192.168.73.135"]
discovery.zen.minimum_master_nodes: 1
http.cors.enabled: true
http.cors.allow-origin: "*"
啟動服務並設置開機啟動
[root@k8s-node03 elasticsearch]# systemctl start elasticsearch && systemctl enable elasticsearch
使用該地址可以查看node節點是否加入節點 http://192.168.73.133:9200/_cat/nodes?v
也可以使用REST接口查看集群健康狀態:
[root@elk-master ~]# curl -i -XGET http://192.168.73.133:9200/_cluster/health?pretty
HTTP/1.1 200 OK
content-type: application/json; charset=UTF-8
content-length: 465
{
"cluster_name" : "elk-cluster",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 2,
"number_of_data_nodes" : 2,
"active_primary_shards" : 5,
"active_shards" : 10,
"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
}
查看集群節點:
[root@elk-master ~]# curl -i -XGET http://192.168.73.133:9200/_cat/nodes?pretty
HTTP/1.1 200 OK
content-type: text/plain; charset=UTF-8
content-length: 102
192.168.73.135 19 96 1 0.07 0.15 0.14 dilm - elk-2
192.168.73.133 16 96 7 0.54 0.45 0.35 dilm * elk-1
green:所有的主分片和副本分片都已分配。你的集群是 100% 可用的。
yellow:所有的主分片已經分片了,但至少還有一個副本是缺失的。不會有數據丟失,所以搜索結果依然是完整的。不過,你的高可用性在某種程度上被弱化。如果 更多的 分片消失,你就會丟數據了。把 yellow 想象成一個需要及時調查的警告。
red:至少一個主分片(以及它的全部副本)都在缺失中。這意味着你在缺少數據:搜索只能返回部分數據,而分配到這個分片上的寫入請求會返回一個異常。
green/yellow/red 狀態是一個概覽你的集群並了解眼下正在發生什么的好辦法
安裝elasticsearch-head插件
安裝docker鏡像或者通過github下載elasticsearch-head項目都是可以的,1或者2兩種方式選擇一種安裝使用即可
Github下載地址:https://github.com/mobz/elasticsearch-head
1. 使用docker的集成好的elasticsearch-head
# docker run -p 9100:9100 mobz/elasticsearch-head:5
docker容器下載成功並啟動以后,運行瀏覽器打開http://localhost:9100/
2. 使用git安裝elasticsearch-head
# yum install -y npm
# git clone git://github.com/mobz/elasticsearch-head.git
# cd elasticsearch-head
# npm install
# npm run start &
檢查端口是否起來
netstat -antp |grep 9100
瀏覽器訪問測試是否正常
http://IP:9100/
集群健康值介紹:
黃色代表沒有主分片數據丟失,但是現在不是健康的狀態(警告)應該有10個分片,現在只有5個。
紅色代表有數據丟失
綠色代表正常
提示:es支持一個類似於快照的功能,方便我們用於數據備份
Head插件小缺點: 當我們索引特別多的時候,打開head至少需要五分鍾。因為它要把所有的索引都掃描一遍進行展示,這時候打開使用的帶寬也會特別大(不會出現超時,一直等待就可以)
LogStash的安裝使用
安裝Logstash環境:
官方安裝手冊:
https://www.elastic.co/guide/en/logstash/current/installing-logstash.html
下載yum源的密鑰認證:
[root@elk-master ~]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
利用yum安裝logstash
[root@elk-master ~]# yum install -y logstash
創建一個軟連接,每次執行命令的時候不用在寫安裝路勁(默認安裝在/usr/share下)
[root@elk-master ~]# ln -s /usr/share/logstash/bin/logstash /bin/
執行logstash的命令
[root@elk-master ~]# logstash -e 'input { stdin { } } output { stdout {} }'
hello world
test
然后等待stdout返回的結果
注:
-e 執行操作
input 標准輸入
{ input } 插件
output 標准輸出
{ stdout } 插件
如果標准輸出到elasticsearch中保存下來,應該怎么玩,看下面
[root@elk-master ~]# logstash -e 'input { stdin { } } output { elasticsearch { hosts => ["192.168.73.133:9200"] } stdout { codec => rubydebug }}'
I am ELK
who are you
logstash使用配置文件
官方指南:
https://www.elastic.co/guide/en/logstash/current/configuration.html
創建配置文件elk.conf
input { stdin { } }
output {
elasticsearch { hosts => ["192.168.73.133:9200"] }
stdout { codec => rubydebug }
}
使用配置文件運行logstash
logstash -f ./elk.conf
運行成功以后輸入以及標准輸出結果
logstash的插件類型
Input插件
權威指南:https://www.elastic.co/guide/en/logstash/current/input-plugins.html
file插件的使用
# vim /etc/logstash/conf.d/elk.conf
添加如下配置
input {
file {
path => "/var/log/messages"
type => "system"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["192.168.1.202:9200"]
index => "system-%{+YYYY.MM.dd}"
}
}
運行logstash指定elk.conf配置文件,進行過濾匹配
#logstash -f /etc/logstash/conf.d/elk.conf
來一發配置安全日志的並且把日志的索引按類型做存放,繼續編輯elk.conf文件
vim /etc/logstash/conf.d/elk.conf
添加secure日志的路徑
input {
file {
path => "/var/log/messages"
type => "system"
start_position => "beginning"
}
file {
path => "/var/log/secure"
type => "secure"
start_position => "beginning"
}
}
output {
if [type] == "system" {
elasticsearch {
hosts => ["192.168.1.202:9200"]
index => "nagios-system-%{+YYYY.MM.dd}"
}
}
if [type] == "secure" {
elasticsearch {
hosts => ["192.168.1.202:9200"]
index => "nagios-secure-%{+YYYY.MM.dd}"
}
}
}
運行logstash指定elk.conf配置文件,進行過濾匹配
[root@elk-master ]# logstash -f /etc/logstash/conf.d/elk.conf
這些設置都沒有問題之后,接下來安裝下kibana,可以讓在前台展示
Kibana的安裝及使用
安裝kibana環境
官方手冊:https://www.elastic.co/guide/en/kibana/current/install.html
下載kibana的tar.gz的軟件包
# yum install -y kibana
編輯kibana的配置文件
# vim /etc/kibana/kibana.yml
修改配置文件如下,開啟以下的配置
server.port: 5601
server.host: "192.168.99.185"
elasticsearch.hosts: ["http://192.168.99.185:9200"]
kibana.index: ".kibana"
i18n.locale: "zh-CN"
啟動服務並設置開機啟動
# systemctl start kibana &&systemctl enable kibana
查看服務端口監聽情況
# netstat -auntlp |grep 5601
tcp 0 0 192.168.73.133:5601 0.0.0.0:* LISTEN 61996/node
Kibana訪問方式
http://192.168.73.133:5601
等待加載完畢之后的界面如圖所示
添加樣本數據
樣本數據儀表盤
專注開源的DevOps技術棧技術,可以關注公眾號,有問題歡迎一起交流