ELK搭建

ELK學習指南
1、elasticsearch安裝配置
1.一、Elasticsearch介紹
ES是一個基於Lucene實現的開源,分佈式,Restful全文搜索引擎,此外,它仍是一個分佈式實時文檔存領儲,其中每一個文檔的第個field均是被索引的數據,且可被搜索,也是一個帶實時分析功能的分佈式搜索引擎,可以擴展至數以百計的節點實時處理PB級的數據。
基本組件:
索引(index):文檔容器,換句話說,索引是具備相似屬性的文檔的集合。相似於表,索引名必須使用小寫字母。
類型(type):類型是索引內部的邏輯分區,其意義徹底取決於用戶需求,一個索引內部可定義一個或多個類型,通常來講,類型就是擁有相同的域的文檔的預約義。
文檔(document):文檔 是Lucence索引和搜索的原子單位,它包含了一個或多個域,是域的容器,基於JSON格式 表示,每一個域的組成部分:一個名字,一個或多個值:擁有多個值的域,一般稱爲多值域。
映射(mapping):原始內容存儲爲文檔以前須要事先進行分析:例如切詞、過濾掉某些詞等:映射用於定義此分析機制該如何實現;除此以外,ES還爲映射提供諸如將域中的內容排序等功能。html

ES的集羣組件:
Cluster:ES的集羣標識爲集羣名稱;默認爲「elasticsearch」。節點就是靠此名稱來決定加入到哪一個集羣,一個節點只能屬於一個集羣
Node: 支行了單個ES實例的主機即爲節點,用於存儲數據、參與集羣索引及搜索操做。節點的標識靠節點名。java

ES Cluster工做過程:
啓動時,經過多播(默認)或單播方式在9300/tcp查找同一集羣中的其它節點,並與之創建通訊。
集羣中的全部節點會選舉出一個主節點負責管理整個集羣狀態,以及在集羣範圍內決定各shards的分佈方式。站在用戶角度而言,每一個都可接收並響應用戶的各種請求。
集羣有狀態:green,red,yellownode

1.二、ElasticSearch概念與工做流程介
索引(index):文檔的容器,是屬性相似的文檔集合,相似MySQL中的庫或者表的概念,強烈建議同一類的數據放一個索引裏
分片(shared):Elasticsearch默認將建立的索引分爲5個shard(也能夠自定義),每個shard都是一個獨立完整的索引,而後分佈在不一樣的節點上
節點:站在用戶角度來看並無主節點概念,每一個節點對用戶來講都是同樣的,都會響應請求,可是對於集羣來講,會有一個主節點用於管理節點狀態以及決定shard分佈方式,還會週期性檢查其餘節點是否可用並進行修復。各節點是經過集羣名稱來判斷是否屬於同一節點
1.三、Elasticsearch安裝過程
1.3.一、安裝JAVA環境,因此第一步是安裝JDK,
這裏我採用yum的安裝方式
[root@linux-node1 ~]# yum -y install java-1.8.0-openjdk.x86_64
[root@linux-node1 ~]# java -version 這就表示jdk安裝成功
openjdk version "1.8.0_201"
OpenJDK Runtime Environment (build 1.8.0_201-b09)
OpenJDK 64-Bit Server VM (build 25.201-b09, mixed mode)linux

1.3.二、安裝elasticsearch
下載軟件包:
官網地址:www.elastic.co
https://www.elastic.co/downloads/past-releases/elasticsearch-6-5-4
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.4.tar.gznginx

1.3.三、配置elasticsearch
下載tar包解壓,而後進入config目錄,該目錄下除了有一個主配置文件elasticsearch.yml須要配置外,還有一個jvm.options文件用於JVM的調優
jvm.options配置文件文件主要是JVM優化相關,關於垃圾回收這塊使用默認配置就能夠了,咱們要調整的就是最大內存和最小內存的設置。一般設置爲同樣大小,具體的值能夠設置爲系統最大內存的一半或三分之二
ELK搭建
elasticsearch.yml配置文件
[root@linux-node1 config]# grep -Ev "^$|^#" elasticsearch.yml
cluster.name: xiongzhx 集羣的名稱
node.name: linux-node1 節點名稱,若是有多個節點,名稱不能同樣
path.data: /opt/app/es-data 指定數據存放目錄
path.logs: /opt/app/es-logs 指定日誌存放目錄
bootstrap.memory_lock: true 交換內存鎖定
network.host: 192.168.159.190 監聽的IP地址
http.port: 9200 監聽的端口
discovery.zen.ping.unicast.hosts: ["192.168.159.190", "192.168.159.191"] 使用單播的方式發現集羣的節點主機
http.cors.enabled: true 如下兩行是爲了elasticsearch能夠打開head插件
http.cors.allow-origin: "*"git

能夠參考配置文件詳細介紹:
http://www.javashuo.com/article/p-mfnljgnt-gp.htmlgithub

1.3.四、啓動elasticsearch
首先啓動elasticsearch不能使用root用戶啓動,因此須要先建立一個用戶els
將數據和日誌存放目錄全部者和所屬組改爲els
chown -R els:els /opt/app/es-data/
chown -R els:els /opt/app/es-logs/
正則表達式

後臺啓動命令
bin/elasticsearch -d (-d 表示後臺啓動)apache

啓動成功以後檢查服務是否正常
[root@linux-node1 config]# curl http://192.168.159.190:9200
{
"name" : "linux-node1",
"cluster_name" : "xiongzhx",
"cluster_uuid" : "VneGCrQlRL-Zk4LfDR1z-Q",
"version" : {
"number" : "6.3.2",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "053779d",
"build_date" : "2018-07-20T05:20:23.451332Z",
"build_snapshot" : false,
"lucene_version" : "7.3.1",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
1.3.五、啓動報錯的總結
報錯信息1:
max virtual memory areas vm.max_map_count [65530] is too low
解決方法1:
修改/etc/sysctl.conf,增長一行vm.max_map_count= 262144。而後執行sysctl -p使其生效npm

報錯信息2:
max file descriptors [65535] for elasticsearch process is too low
解決方法2:
解決辦法:修改/etc/security/limits.d/20-nproc.conf 加入以下配置

  • soft nofile 65536
  • hard nofile 131072
  • soft memlock unlimited
  • hard memlock unlimited

報錯信息3:
max number of threads [3812] for user [els] is too low, increase to at least [4096]
解決方法3
修改/etc/security/limits.d/20-nproc.conf,作如下配置

  • soft nproc 4096
    root soft nproc unlimited

1.3.六、head插件安裝和使用
下載head插件
https://github.com/mobz/elasticsearch-head
下載 elasticsearch-head.tar.gz包
ELK搭建

克隆下載:git clone git://github.com/mobz/elasticsearch-head.git

安裝npm工具來啓動head插件
npm下載直接解壓就能夠配置環境變量就能夠了
wget https://nodejs.org/dist/v10.15.3/node-v10.15.3-linux-x64.tar.xz
tar xf node-v10.15.3-linux-x64.tar.xz
vim /etc/profile 加入以下內容
export PATH=$PATH:/data/node-v10.15.3-linux-x64/bin
source /etc/profile 生效
進入elasticsearch-head目錄
npm install
npm install grunt -save
npm run start 直接啓動
npm run start & 後臺啓動
ELK搭建

向elasticsearch.yum最後加入以下內容:(啓動head插件服務須要)
http.cors.enabled: true
http.cors.allow-origin: "*"
從新啓動一下elasticsearch服務

打開瀏覽器輸入:http://192.168.159.190:9100/ 就能夠看到建立的索引

ELK搭建
ELK搭建
2、Logstash安裝配置
2.一、安裝java環境
這裏我採用yum的安裝方式
[root@linux-node1 ~]# yum -y install java-1.8.0-openjdk.x86_64
[root@linux-node1 ~]# java -version 這就表示jdk安裝成功
openjdk version "1.8.0_201"
OpenJDK Runtime Environment (build 1.8.0_201-b09)
OpenJDK 64-Bit Server VM (build 25.201-b09, mixed mode)

2.二、安裝logstash
2.2.一、下載軟件包

軟件下載地址:https://www.elastic.co/downloads/past-releases/
軟件包下載地址:https://artifacts.elastic.co/downloads/logstash/logstash-6.5.4.tar.gz

2.2.二、安裝logstash
tar zxf logstash-6.5.4.tar.gz 解壓
mv logstash-6.5.4 /usr/local/
cd /opt/app
ln -s /usr/local/logstash-6.5.4 logstash 去版本建立軟連接

2.2.三、配置文件修改
一、jvm.options 主要是設置JVM,優化內存
這兩個參數儘可能配置成同樣

二、logstash.yml
ELK搭建

三、startup.options
[root@linux-node1 config]# grep -Ev "^$|^#" startup.options
LS_HOME=/usr/share/logstash logstash所在目錄
LS_SETTINGS_DIR=/etc/logstash 默認logstash配置文件目錄
LS_OPTS="--path.settings ${LS_SETTINGS_DIR}" logstash啓動命令參數 指定配置文件目錄
LS_JAVA_OPTS="" 指定jdk目錄
LS_PIDFILE=/var/run/logstash.pid logstash.pid所在目錄
LS_USER=logstash logstash啓動用戶
LS_GROUP=logstash logstash啓動用戶組
LS_GC_LOG_FILE=/var/log/logstash/gc.log gc.log文件路徑
LS_OPEN_FILES=16384 logstash最多打開監控文件數量
LS_NICE=19
SERVICE_NAME="logstash"
SERVICE_DESCRIPTION="logstash"

2.2.四、啓動方法
nohup /data/logstash/bin/logstash -f /data/logstash/conf/beat-apache.conf &
ELK搭建

驗證配置文件語法是否正確:
/data/logstash/bin/logstash -t -f /data/logstash/conf/beat-apache.conf
ELK搭建

簡單的驗證:
input {
stdin { }
}
filter {
}
output {
stdout {
codec => rubydebug
}
}
ELK搭建
2.三、logstash(input、output、filter)學習
2.3.一、input
File用法:
input{
file{
#path屬性接受的參數是一個數組,其含義是標明須要讀取的文件位置
path => [‘pathA’,‘pathB’]
path => [‘/etc/httpd/logs/’ , ‘/etc/nginx/logs/’]
path => 「/var/log/message」表示
#表示多就去path路徑下查看是夠有新的文件產生。默認是15秒檢查一次。
discover_interval => 15
#排除那些文件,也就是不去讀取那些文件
exclude => [‘fileName1’,‘fileNmae2’]
exclude => 「.gz」 表示不去讀取.gz文件
#被監聽的文件多久沒更新後斷開鏈接不在監聽,默認是一個小時。
close_older => 3600
#在每次檢查文件列 表的時候, 若是一個文件的最後 修改時間 超過這個值,
就忽略這個文件。 默認一天。
ignore_older => 86400
#logstash 每隔多 久檢查一次被監聽文件狀態( 是否有更新) , 默認是 1 秒。
stat_interval => 1
#sincedb記錄數據上一次的讀取位置的一個index
sincedb_path => ’$HOME/. sincedb‘
#logstash 從什麼 位置開始讀取文件數據, 默認是結束位置 也能夠設置爲:beginning 從頭開始
start_position => ‘beginning’
#注意:這裏須要提醒你們的是,若是你須要每次都從同開始讀取文件的話,關設置start_position => beginning是沒有用的,你能夠選擇sincedb_path 定義爲 /dev/null
}
}
舉例:收集prtrequest.txt、myes.log、/var/log/

input{
file{
path => ["/var/log/*"]
type => "system-log"
start_position => "beginning"
sincedb_path => "/dev/null"
}
file{
path => "/opt/app/es-logs/myes.log"
type => "es-log"
start_position => "beginning"
sincedb_path => "/dev/null"
codec => multiline{
pattern => "^["
negate => true
what => "previous"
}
}
file{
path => "/tmp/prtRequest.txt"
type => "prtrequest"
start_position => "beginning"
sincedb_path => "/dev/null"
codec => multiline{
pattern => "^%{MONTH}"
negate => true
what => "previous"
}
}
}
filter{

}

output{
if [type] == "system-log" {
elasticsearch {
hosts => ["192.168.159.190:9200"]
index => "system-log-%{+YYYY.MM}"
}
}
if [type] == "es-log" {
elasticsearch {
hosts => ["192.168.159.190:9200"]
index => "es-log-%{+YYYY.MM}"
}
}
if [type] == "prtrequest" {
elasticsearch {
hosts => ["192.168.159.190:9200"]
index => "prtrequest-%{+YYYY.MM}"
}
}
}

自定義正則表達式:
存放目錄能夠自定義:/opt/app/logstash/pattern/jboss
HMS (?!<[0-9])(?:2[0123]|[01]?[0-9]):(?:[0-5][0-9])(?::(?:(?:[0-5]?[0-9]|60)(?:[:.,][0-9]+)?))(?![0-9])
PTIME %{MONTH} %{MONTHDAY} %{HMS}
IP ((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))).){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))
SESSIONID ([A-Za-z0-9]{32})
URL ([a-zA-z]+://[^\s]*)

filter{
grok{
patterns_dir => ["/opt/app/logstash/pattern/jboss"]
match => { "message" => ".ajp-%{IP:ip}.] [%{SESSIONID:sessionid}.]|%{IP:wanip}|%{URL:url}" }
remove_field => ["beat","tags" ,"_id" ,"host" ,"source","prospector","_type","_score","_source","off
set" ]
}
}

beats用法
input {
beats {
port => 5044
}
}

2.3.二、filter
data用法

filter{

grok{
    #只說一個match屬性,他的做用是從message 字段中吧時間給摳出來,而且賦值給另個一個字段logdate。
    #首先要說明的是,全部文本數據都是在Logstash的message字段中,咱們要在過濾器裏操做的數據就是message。
    #第二點須要明白的是grok插件是一個十分耗費資源的插件,這也是爲何我只打算講解一個TIMESTAMP_ISO8601正則表達式的緣由。
    #可是,我仍是不建議使用它,由於他徹底能夠用別的插件代替,固然,對於時間這個屬性來講,grok是很是便利的。
    match => ['message','%{TIMESTAMP_ISO8601:logdate}']
}

}

data {
#將message的時間進行格式華成本身須要的
match => [ "logdate", "MMM dd yyyy HH:mm:ss" ]
target => "@timestamp"
#將匹配的時間戳存儲到給定的目標字段中。若是未提供,則默認爲更新 @timestamp事件的字段
remove_field => ["logdate"]
#此事件中刪除字段logdate
}
grok插件
自定義類型
第一種
直接使用Oniguruma語法來命名捕獲,它可讓你匹配一段文本並保存爲一個字段:
(?<field_name>the pattern here)
例如,日誌有一個queue_id 爲一個長度爲10或11個字符的十六進制值。使用下列語法能夠獲取該片斷,並把值賦予queue_id
(?<queue_id>[0-9A-F]{10,11})

經常使用屬性有如下幾個:
patterns_dir:指定須要匹配的正則表達式文件,一些複雜的正則表達式,不適合直接寫到filter中,能夠指定一個文件夾,用來專門保存正則表達式的文件,須要注意的是該文件夾中的全部文件中的正則表達式都會被依次加載,包括備份文件
patterns_dir => [「/ opt / logstash / patterns」,「/ opt / logstash / extra_patterns」]

Match
值類型是數組 
默認值是 {} 
描述:字段⇒值匹配
filter { grok { match => { "message" => "Duration: %{NUMBER:duration}" } } }

mutate插件
經常使用屬性以下:
convert #類型轉換
gsub #字符串替換
split/join/merge #字符串切割、數組合併爲字符串、數組合併爲數組
rename #字段重命名
update/replace #字段內容更新或替換
remove_field #刪除字段

filter {
mutate {
split => [ 「message」 ,「 - 」 ]
add_field => { 「hostname」 => 「%{message[0]}」 }
}
mutate {
rename => [ 「hostname」 ,「xiongzhx」 ]
}
}
#上面這段話的意思就是使用 「 - 」進行日誌切換,message[0]表示第一段內容,message[1]表示第二段內容,依次往下,而後使用字段hostname存放message[0]的內容。
最後再將hostname重名名爲xiongzhx

配置文件詳細介紹
https://blog.csdn.net/len9596/article/details/82884507
插件詳細介紹:
https://blog.csdn.net/xushiyu1996818/article/details/84030000

3、kinaba安裝配置
3.一、安裝過程
Kianba.yml配置文件修改以下:
ELK搭建
[root@localhost config]# grep -Ev "^$|^#" kibana.yml
server.port: 5601
server.host: "192.168.159.180"
elasticsearch.url: "http://192.168.159.180:9200"

後臺啓動方法
Cd /opt/app/kibana
nohup ./bin/kibana &

3.二、添加索引
添加prtrequest.log日誌
ELK搭建
添加完成以後看到的效果:
ELK搭建

日誌切割以後
ELK搭建

相關文章
相關標籤/搜索