從零掌握ELKStack:如何打造高效的日誌監控與分析平臺?

ELKstack基礎入門
ELK簡介
通俗來講,ELK是由Elasticsearch、Logstash、Kibana 三個開源軟體的組成的一個組合體,這三個軟體當中,每個軟體用於完成不同的功能,ELK 又稱為ELK stack,官方域名為elastic.co,ELK stack的主要優點有如下幾個:
  • 1.處理方式靈活:elasticsearch是即時全文索引,具有強大的搜尋功能
  • 2.配置相對簡單:elasticsearch全部使用JSON 介面,logstash使用模組配置,
  • kibana的配置檔案部分更簡單。
  • 3.檢索效能高效:基於優秀的設計,雖然每次查詢都是即時,但是也可以達到百億級資料的查詢秒級響應。
  • 4.叢集線性擴充套件:elasticsearch和logstash都可以靈活線性擴充套件
  • 5.前端操作絢麗:kibana的前端設計比較絢麗,而且操作簡單
日誌收集軟體
  • ELKstack
  • flume
  • 日誌易
什麼是elasticsearch
儲存日誌

資料庫:是一個高度可擴充套件的開源全文搜尋和分析引擎,它可實現資料的即時全文搜尋搜尋、支援分散式可實現高可用、提供API介面,可以處理大規模日誌資料,比如Nginx、Tomcat、系統日誌等功能。
什麼是logstash(filebeat)
收集日誌,轉發日誌

可以透過外掛實現日誌收集和轉發,支援日誌過濾,支援普通log、自定義json格式的日誌解析。
什麼是kibana
主要是透過介面呼叫elasticsearch的資料,並進行前端資料視覺化的展現。web圖形化日誌展示

部署ES
環境準備
主機名 外網IP 內網IP 角色 應用
ELKstack01 10.0.0.81 172.16.1.81 ES日誌儲存資料庫 JDK、elasticsearch
ELKstack02 10.0.0.82 172.16.1.82 ES日誌儲存資料庫 JDK、elasticsearch
安裝es
# 1.更換es官方源

[root@elkstack02 ~]

# vim /etc/yum.repos.d/es.repo

[elasticsearch-5.x]

name=Elasticsearch repository

for

5.x packages

baseurl=https://artifacts.elastic.co/packages/5.x/yum

gpgcheck=1

gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch

enabled=1

autorefresh=1

type

=rpm-md

# 2.安裝es

[root@elkstack02 ~]

# yum install -y elasticsearch

# 3.修改es配置檔案

[root@elkstack02 ~]

# vim /etc/elasticsearch/elasticsearch.yml

cluster.name: elkstack

node.name: es02

path.data: /data/es/data

path.logs: /data/es/logs

bootstrap.memory_lock:

false

bootstrap.system_call_filter:

false

network.host: 0.0.0.0

http.port: 9200

discovery.zen.ping.unicast.hosts: [

"10.0.0.81"

,

"10.0.0.82"

]

# 4.修改啟動指令碼

[root@elkstack01 ~]

# vim/usr/lib/systemd/system/elasticsearch.service
#修改記憶體限制(去掉此行註釋)

LimitMEMLOCK=infinity

# 5.建立日誌和資料目錄

[root@elkstack02 ~]

# mkdir -p /data/es/{logs,data}

# 6.授權

[root@elkstack02 ~]

# chown -R elasticsearch.elasticsearch /data/

# 7.最佳化檔案描述符

[root@elkstack01 ~]

# vim /etc/security/limits.conf

* soft memlock unlimited

* hard memlock unlimited

* soft nofile 131072

* hard nofile 131072

# 8.修改jvm

[root@elkstack02 ~]

# vim /etc/elasticsearch/jvm.options

-Xms1g

-Xmx1g

開啟瀏覽器訪問:http://10.0.0.82:9200/

安裝es的head外掛
# 1.安裝npm

[root@elkstack01 ~]

# yum install -y npm

# 2.拉程式碼

[root@elkstack01 ~]

# git clone https://github.com/mobz/elasticsearch-head.git

# 3.下載程式碼zip包

[root@elkstack01 ~]

# ll

-rw-r--r-- 1 root root 1357536 Sep 6 10:36 elasticsearch-head-master.zip

# 4.解壓

[root@elkstack01 ~]

# unzip elasticsearch-head-master.zip

# 5.構建前端程式碼

[root@elkstack01 elasticsearch-head-master]

# npm install grunt -save

# 6.啟動前端

[root@elkstack01 elasticsearch-head-master]

# npm run start &

報錯

報錯原因:缺少bzip2解壓命令

解決方案:yum install -y bzip2

開啟瀏覽器訪問:http://10.0.0.81:9100/

# 連線不上叢集,給es做跨域訪問配置

[root@elkstack01 ~]

# vim /etc/elasticsearch/elasticsearch.yml

http.cors.enabled:

true

http.cors.allow-origin:

"*"

[root@elkstack01 ~]

# systemctl restart elasticsearch

ES的副本分片
副本分片的主要目的就是為了故障轉移,如果持有主分片的節點掛掉了,一個副本分片就會晉升為主分片的角色。

在索引寫入時,副本分片做著與主分片相同的工作。新文件首先被索引進主分片然後再同步到其它所有的副本分片。

增加副本數並不會增加索引容量。

無論如何,副本分片可以服務於讀請求,如果你的索引也如常見的那樣是偏向查詢使用的,那你可以透過增加副本的數目來提升查詢效能,但也要為此,增加額外的硬體資源。
ES的工作機制
逆向索引
與傳統的資料庫不同,在Elasticsearch中,每個欄位裡面的每個單詞都是可以被搜尋的。如teacher:“zls,bgx,lidao,oldboy,alex”我們在搜尋關鍵字oldboy時,所有包含oldboy的文件都會被匹配到Elasticsearch的這個特性也叫做全文搜尋。

為了支援這個特性,Elasticsearch中會維護一個叫做“invertedindex”(也叫逆向索引)的表,表內包含了所有文件中出現的所有單詞,同時記錄了這個單詞在哪個文件中出現過。
例:
當前有4個文件
txt1:“zls,bgx,lidao” txt2:“zls,oldboy,alex” txt3:“bgx,lidao,oldboy” txt4:“oldboy,alex”

那麼Elasticsearch會維護下面一個數據結構表:
Term txt1 txt2 txt2 txt4
zls y y
bgx y y
lidao y y
oldboy y y y
alex y y
隨意搜尋任意一個單詞,Elasticsearch只要遍歷一下這個表,就可以知道有些文件被匹配到了。

逆向索引裡面不止記錄了單詞與文件的對應關係,它還維護了很多其他有用的資料。如:每個文件一共包含了多少個單詞,單詞在不同文件中的出現頻率,每個文件的長度,所有文件的總長度等等。這些資料用來給搜尋結果進行打分,如搜尋zls時,那麼出現zls這個單詞次數最多的文件會被優先返回,因為它匹配的次數最多,和我們的搜尋條件關聯性最大,因此得分也最多。
逆向索引是不可更改的,一旦它被建立了,裡面的資料就不會再進行更改。這樣做就帶來了以下幾個好處:
  • 1.沒有必要給逆向索引加鎖,因為不允許被更改,只有讀操作,所以就不用考慮多執行緒導致互斥等問題。
  • 2.索引一旦被載入到了快取中,大部分訪問操作都是對記憶體的讀操作,省去了訪問磁碟帶來的io開銷。
  • 3.因為逆向索引的不可變性,所有基於該索引而產生的快取也不需要更改,因為沒有資料變更。
  • 4.使用逆向索引可以壓縮資料,減少磁碟io及對記憶體的消耗
segment
作用:主要就是為了解決逆向索引是不可變的

既然逆向索引是不可更改的,那麼如何新增新的資料,刪除資料以及更新資料?為了解決這個問題,lucene將一個大

的逆向索引拆分成了多個小的段segment。每個segment本質上就是一個逆向索引。在lucene中,同時還會維護一個檔案commit point,用來記錄當前所有可用的segment,當我們在這個commit point上進行搜尋時,就相當於在它下面的segment中進行搜尋,每個segment返回自己的搜尋結果,然後進行彙總返回給使用者。

引入了segment和commit point的概念之後,資料的更新流程如下圖:

  • 1.新增的文件首先會被存放在記憶體的快取中
  • 2.當文件數足夠多或者到達一定時間點時,就會對快取進行commit

    a. 生成一個新的segment,並寫入磁碟

    b. 生成一個新的commit point,記錄當前所有可用的segment

    c. 等待所有資料都已寫入磁碟
  • 3.開啟新增的segment,這樣我們就可以對新增的文件進行搜尋了
  • 4.清空快取,準備接收新的文件
副本分片如何配置
大多數ElasticSearch使用者在建立索引時通用會考慮一個重要問題是:我需要建立多少個分片?

分片分配是個很重要的概念, 很多使用者對如何分片都有所疑惑, 當然是為了讓分配更合理. 在生產環境中, 隨著資料集的增長, 不合理的分配策略可能會給系統的擴充套件帶來嚴重的問題。

同時, 這方面的文件介紹也非常少。很多使用者只想要明確的答案而不僅僅一個數字範圍, 甚至都不關心隨意的設定可能帶來的問題。

首先,我們需要了解ES中以下幾個名詞,是做什麼的:

叢集(cluster):由一個或多個節點組成, 並透過叢集名稱與其他叢集進行區分

節點(node):單個ElasticSearch例項. 通常一個節點執行在一個隔離的容器或虛擬機器中

索引(index):在ES中, 索引是一組文件的集合(就是我們所說的一個日誌)

分片(shard):因為ES是個分散式的搜尋引擎, 所以索引通常都會分解成不同部分, 而這些分佈在不同節點的資料就是分片. ES自動管理和組織分片, 並在必要的時候對分片資料進行再平衡分配, 所以使用者基本上不用擔心分片的處理細節,一個分片預設最大文件數量是20億.
副本(replica):ES預設為一個索引建立5個主分片, 並分別為其建立一個副本分片. 也就是說每個索引都由5個主分片成

本, 而每個主分片都相應的有一個copy.

對於分散式搜尋引擎來說, 分片及副本的分配將是高可用及快速搜尋響應的設計核心.主分片與副本都能處理查詢請求,

它們的唯一區別在於只有主分片才能處理索引請求.
大規模的資料場景進行分片
如果真的擔心資料的快速增長, 我們建議你多關心這條限制: ElasticSearch推薦的最大JVM堆空間是30~32G, 所以把你的分片最大容量限制為30GB, 然後再對分片數量做合理估算. 例如, 你認為你的資料能達到200GB, 我們推薦你最多分配7到8個分片.
總之, 不要現在就為你可能在三年後才能達到的10TB資料做過多分配. 如果真到那一天, 你也會很早感知到效能變化的.
儘管本部分並未詳細討論副本分片, 但我們推薦你保持適度的副本數並隨時可做相應的增加. 如果你正在部署一個新的環境, 也許你可以參考我們的基於副本的叢集的設計.這個叢集有三個節點組成, 每個分片只分配了副本. 不過隨著需求

變化, 你可以輕易的調整副本數量.
對大資料集, 我們非常鼓勵你為索引多分配些分片–當然也要在合理範圍內. 上面講到的每個分片最好不超過30GB的原則依然使用.
不過, 你最好還是能描述出每個節點上只放一個索引分片的必要性. 在開始階段, 一個好的方案是根據你的節點數量按照1.5~3倍的原則來建立分片. 例如:如果你有3個節點, 則推薦你建立的分片數最多不超過9(3×3)個.
隨著資料量的增加,如果你透過叢集狀態API發現了問題,或者遭遇了效能退化,則只需要增加額外的節點即可. ES會自動幫你完成分片在不同節點上的分佈平衡.
再強調一次, 雖然這裡我們暫未涉及副本節點的介紹, 但上面的指導原則依然使用: 是否有必要在每個節點上只分配一個索引的分片. 另外, 如果給每個分片分配1個副本, 你所需的節點數將加倍. 如果需要為每個分片分配2個副本, 則需要3倍的節點數
總結
再次宣告, 資料分片也是要有相應資源消耗,並且需要持續投入.

當索引擁有較多分片時, 為了組裝查詢結果, ES必須單獨查詢每個分片(當然並行的方式)並對結果進行合併. 所以高效能IO裝置(SSDs)和多核處理器無疑對分片效能會有巨大幫助. 儘管如此, 你還是要多關心資料本身的大小,更新頻率以及未來的狀態. 在分片分配上並沒有絕對的答案, 只希望大家能從本部落格中受益.
分片實戰
模擬資料

# 修改副本分片介面

curl -XPUT -d

'

{ "template": "*",

"settings": {

"index": {

"number_of_shards": 6,

"number_of_replicas": 1

}

}

}'

http://10.0.0.81:9200/_template/my_template

叢集健康值顏色
  • 綠色:正常健康叢集(沒有分片丟失)
  • 黃色:非正常叢集(副本分片丟失)
  • 紅色:非正常叢集(副本分片和主分片都丟失)
監控es叢集狀態

vim es.py

#!/usr/bin/env python
#coding:utf-8
#Author:_DriverZeng_
#Date:2017.02.12

import smtplib

from email.mime.text import MIMEText

from email.utils import formataddr

import subprocess

body =

""
false

=

"false"

clusterip =

"10.0.0.81"

obj = subprocess.Popen((

"curl -sXGET http://"

+clusterip+

":9200/_cluster/health?

pretty=true"

),shell=True, stdout=subprocess.PIPE)

data = obj.stdout.read()

data1 =

eval

(data)

status = data1.get(

"status"

)

if

status ==

"green"

:

print"\033[1;32m 0 \033[0m"
elif

status ==

"yellow"

:

print"\033[1;33m 1 \033[0m"
else

:

print"\033[1;31m 2 \033[0m"

## 叢集健康狀態的API

curl -s -XGET http://10.0.0.81:9200/_cluster/health?pretty=

true

連結:https://www.cnblogs.com/wangchengww/p/16662728.html
                                                              (版權歸原作者所有,侵刪)

文末福利

即將步入2025年,不少小夥伴在考慮來年的工作方向。

僅目前來說,傳統運維衝擊年薪30W+的轉型方向就是SRE&DevOps崗位。

為了幫助大家早日擺脫繁瑣的基層運維工作,給大家整理了一套【2024最新運維資料高階運維工程師必備技能資料包(文末一鍵領取),內容有多詳實豐富看下圖!
共有 20 個模組
1.38張最全工程師技能圖譜
2.面試大禮包
3.Linux書籍
4.go書籍
······
6.自動化運維工具
18.訊息佇列合集
 以上所有資料獲取請掃碼
識別上方二維碼
備註:2024最新運維資料
100%免費領取
(是掃碼領取,不是在公眾號後臺回覆,別看錯了哦)


相關文章