ELK
Elasticsearch
基本概念
NRT--Near Real Time
近實時:你對文檔進行索引到你能對其進行查詢的延時很短(一般是1s)
Cluster--集群
擁有你全量數(shù)據(jù)并提供索引存儲和查詢功能的一個或多個es服務節(jié)點。
Node--服務節(jié)點
服務節(jié)點是一臺集群中的服務器,為集群提供索引和查詢能力。
Index--索引
索引是一個擁有類似特征的文檔的集合。
Document--文檔
文檔是一個可被索引的信息的基本單元。
Shards & Replicas--分區(qū)和復制
安裝ES
yum
# step1 下載rpm包
# step2 yum install
具體可參考官方。
docker
docker pull docker.elastic.co/elasticsearch/elasticsearch:6.2.4 包含xpack
docker pull docker.elastic.co/elasticsearch/elasticsearch-platinum:6.2.4 包含xpack及30天試用證書
docker pull docker.elastic.co/elasticsearch/elasticsearch-oss:6.2.4 不包含xpack
ES的關鍵配置
ES只需要很簡單的配置即可開始使用,但在投入生產之前,官方建議我們仔細閱讀如下配置:
Path Settings
如果用zip或tar包安裝,那么數(shù)據(jù)和日志的文件夾是在$ES_HOME的子文件夾下,如果保持默認配置不變,這兩個文件夾很有極大風險被刪除。
path:
logs: /var/log/elasticsearch
data: /var/data/elasticsearch
Cluster names
ES會將所有有共同集群名稱的服務節(jié)點加入集群。
需要注意不同的環(huán)境(測試、生產)的配置集群名的區(qū)分,否則就會出現(xiàn)不同環(huán)境的節(jié)點加入同個集群。
cluster.name: logging-prod
Node name
ES會使用隨機生成的UUID的前七位作為node id。node id 是永久的并不會因為重啟而改變,因此默認的node name也不會改變。
官方建議給出更有意義的命名方式。
node.name: prod-data-2
# 也可以設置為系統(tǒng)的HOSTNAME
node.name: ${HOSTNAME}
Network host
ES會使用回送地址(loopback addresses) 127.0.0.1 和 [::1]。對于單個開發(fā)節(jié)點來說,這樣的配置就足夠了。
但是為了集群的節(jié)點間通信呢,我們就需要指定一個非回送地址(non-loopback address):
network.host: 192.168.1.10
ES還可以識別其他的特殊值,詳見這里。
Discovery settings
ES使用的是一種自定義的集群節(jié)點對節(jié)點和主從選舉發(fā)現(xiàn)方式--“Zen Discovery“。這個發(fā)現(xiàn)方式有兩個重要的配置項:
- discovery.zen.ping.unicast.hosts
在沒有任何網絡配置的情況下,ES會banding在回送地址并會不斷掃描9300-9305端口來連接其他在同個服務器上的其他節(jié)點。
如果需要連接其他服務器的節(jié)點,則需要我們給出種子節(jié)ip地址。種子節(jié)點的ip地址可以用如下方式給出:
discovery.zen.ping.unicast.hosts:
- 192.168.1.10:9300
- 192.168.1.11 # 不指定端口會訪問默認端口
- seeds.mydomain.com # 這個域名解析出的全部ip
- discovery.zen.minimum_master_nodes
為防止數(shù)據(jù)丟失,這個配置是非常重要的。有了這項配置,集群中的所有節(jié)點就知道選舉主節(jié)點需要的最少參與節(jié)點數(shù)。如果沒有這項配置,某個節(jié)點的網絡錯誤會導致集群分成兩個部分,從而導致數(shù)據(jù)丟失。關于集群分成兩個部分,我們可以看這個更詳細的描述,在這個更詳細的描述中,官方建議集群配置最少需要三個主節(jié)點。
# 算法:(master_eligible_nodes / 2) + 1
# 如果我們有三個主節(jié)點,則我們需要配置最少2個。(3/2) + 1 = 2
discovery.zen.minimum_master_nodes: 2
Heap size
ES會默認配置1GB的最小/最大堆容量。當我們往生產環(huán)境遷移的時候,確保ES有足夠的堆容量是很重要的一點。
官方給出如下建議:
- 將最小Xms和最大Xmx的對容量設置為相同數(shù)值。
- 為ES配置的對容量越大,ES可使用的緩存越大。需要指出的是,過大的對容量會導致很長的垃圾回收暫停。
- 設置Xmx的時候,不要超過物理RAM容量的50%來保證系統(tǒng)有足夠的RAM來提供文件系統(tǒng)的緩存。
- 設置Xmx數(shù)值的時候,不要超過JVM為壓縮對象指針的隔斷。不同java版本的隔斷不同,但都接近32GB。我們可以在ES的日志中找到如下這一行,確認一下這個數(shù)值:
heap size [1.9gb], compressed ordinary object pointers [true]

- 更好的做法是,我們可以試著將Xmx設置為低于 the threshold for zero-based compressed oops;在大部分系統(tǒng)這個值一般確定在26GB,有些系統(tǒng)是30GB。你可以在ES的啟動時對其jvm參數(shù)多家兩行:XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode 在啟動日志尋找如下兩行:
heap address: 0x000000011be00000, size: 27648 MB, zero based Compressed Oops
heap address: 0x0000000118400000, size: 28672 MB, Compressed Oops with base: 0x00000001183ff000

PS:實驗下來,使用docker啟動ES, the cutoff that the JVM uses for compressed object pointers 跟the threshold for zero-based compressed oops這兩個數(shù)值與docker容器中jvm.options中Xms和Xmx數(shù)值掛鉤,與分配給docker容器的內存不相關。
Heap dump path
使用RMP和Debian包安裝的ES服務,默認的堆轉儲文件會存放在/var/lib/elsaticsearch。如果這個路徑不適合存儲,你可以在jvm.options修改這個路徑。
-XX:HeapDumpPath=/var/lib/elasticsearch
需要指出的是,使用打包好的ES(zip,tar)開啟的ES服務,會將堆轉儲存在ES的工作目錄下,如果你想換路徑,需要修改jvm.options中# -XX:HeapDumpPath=/heap/dump/path 這一行。
GC logging
ES默認會開啟GC logging。這個也是在jvm.options中配置,且與ES日志在相同路徑。默認的日志每個文件64M,最多占用2GB磁盤空間。
LogStash

安裝LogStash
https://www.elastic.co/guide/en/logstash/current/installing-logstash.html
基本概念

輸入 input
- file:文件。從文件系統(tǒng)讀取文件,類似命令
tail -0F - syslog:從514端口讀取系統(tǒng)日志信息并且用RFC3164格式解析。
- redis:使用redis channels和redis lists讀取redis 服務器內容。redis經常扮演“中間人”的角色,將遠程的logstash事件按隊列傳輸。
- beats:處理Filebeat傳遞的事件。
過濾 filter
- grok:對任意文本進行解析和重構。
- mutate:對事件中字段進行通用處理。
- drop:對一些事件直接丟棄,如debug事件。
- clone:對事件進行拷貝,可以添加或移除字段。
- geoip:根據(jù)ip地址獲取地理位置信息。
輸出 output
- elasticsearch:可以將事件直接傳遞給ES服務器。
- file:可以將事件寫入磁盤文件。
- graphite:將事件傳遞給graphite。
- statsd:將事件傳遞給statsd。
解編碼器 Codecs
- json:以json格式解編碼。
- multiline:將多行文件(如java拋出的異常和堆棧信息)合并為單行事件。
一般用法
bin/logstash -f logstash-simple.conf
logstash-simple.conf一般格式
# 這里是注釋
# 這里是輸入描述
input {
...
}
# 這里是
filter {
...
}
output {
...
}
logstash-simple.conf樣例
input {
beat {
port => "5044" # 暴露給filebeat端口,使用docker請記得將5044端口映射出去。
}
}
filter {
dissect {
mapping => {
"message" => "[%{req_msg}] %{ip} () {%{msg_body}} [%{ts} %{+ts} %{+ts} %{+ts} %{+ts}] %{method} %{uri} => %{generated_msg} (%{http_p} %{http_status}) %{other_message}"
}
}
mutate {
replace => {"ip"=> "112.64.179.50"}
}
geoip {
source => "ip"
}
}
output {
elasticsearch { hosts => ["localhost:9200"] }
stdout { codec => rubydebug }
}
Filebeat

filebeat設計原理如上圖所示,主要由兩個核心組件組成:Harvester和Prospector。
Harvester
Harvester主要負責讀取單個文件的內容。
Prospector
Prospector主要負責管理Harvesters和尋找所有可以讀取的源。
目前支持兩種Prospector格式:log和stdin
如果格式為log,則filebeat會根據(jù)配置,讀取全部滿足條件的文件,每個文件一個Harvester。
安裝Filebeat
https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-installation.html
一般配置
日志路徑
配置日志所在路徑或者某個日志文件??梢允褂?代表通配。
filebeat.prospectors:
- type: log
enabled: true
paths:
- /var/log/*.log
#- c:\programdata\elasticsearch\logs\*
ES配置
如果希望直接將filebeat讀取到的日志文件傳輸至ES,可以使用如下配置:
output.elasticsearch:
hosts: ["192.168.1.42:9200"]
kibana配置
如果想使用filebeat為kibana提供的dashboard模板,可以使用如下配置:
setup.kibana:
host: "localhost:5601"
配合logstash使用
注意:logstash和ES不能同時使用。
#----------------------------- Logstash output --------------------------------
output.logstash:
hosts: ["127.0.0.1:5044"]
設置filebeat dashboard
filebeat setup --dashboards
配置filebeat modules
一共有三種方法:
1、開啟默認module配置:
在/etc/filebeat 路徑下(centos7)有一個modules.d文件夾,該文件夾有所有默認模塊的默認配置。默認模塊包括:apache2、mysql、system等??梢允褂胢odules enable或modules disable開啟或關閉。
./filebeat modules enable apache2 mysql
查看支持的modules:
./filebeat modules list
2、在啟動filebeat的時候開啟:
./filebeat -e --modules nginx,mysql,system
3、在filebeat.yml配置:
可在filebeat.yml最后添加:
filebeat.modules:
- module: apache2
# Access logs
access:
enabled: true
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
var.paths: ["/var/log/httpd/access_log*"]
# Prospector configuration (advanced). Any prospector configuration option
# can be added under this section.
#prospector:
# Error logs
error:
enabled: true
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
var.paths: ["/var/log/httpd/error_log*"]
# Prospector configuration (advanced). Any prospector configuration option
# can be added under this section.
#prospector:
具體modules可參考:https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-modules.html
Kibana
Kibana是一個開源、基于ES的分析和可視化平臺??梢杂么鎯玫臄?shù)據(jù)指標在kibana上進行搜索、查看和互動。在kibana上,你還能對數(shù)據(jù)進行更進一步的分析并用圖表、表格和地圖的形式可視化呈現(xiàn)。
搭建kibana服務
安裝
https://www.elastic.co/guide/en/kibana/current/install.html
配置
如需正常運行所需的最小配置:
# 任意ip均可訪問
server.host: "0"
# 默認端口5601
server.port: 5601
# ES的url
elasticsearch.url: "http://localhost:9200"
其他配置可參考:https://www.elastic.co/guide/en/kibana/current/settings.html
簡單使用
需要可視化或查詢數(shù)據(jù)之前,需要在kibana中設置ES的index。
點擊左側邊欄"Management"-->"Index Patterns"-->"Create Index Pattern"即可設置。
在kibana 6.x中,會顯示ES中已有的index。用戶可根據(jù)自己的需求,設置index的正則匹配規(guī)則,如:
logstash-*
logstash-6.2.4-*

隨后便可在頁面中,對指定的index進行查詢或可視化操作了。

補充:lucene 查詢語法
整體搭建流程
環(huán)境說明:
- centos7
- docker
ES
# 采用elasticsearch-oss的鏡像,oss代表不包含xpack的鏡像。xpack收費,提供管理、機器學習等模塊。
docker run -itd --restart=always -p 9200:9200 -p 9300:9300 docker.elastic.co/elasticsearch/elasticsearch-oss:6.2.4
將9200(數(shù)據(jù)交互、API交互端口) 9300(集群發(fā)現(xiàn)端口)暴露出來即可。
kibana
由于docker默認的kibana掃描的ES url為'http://elasticsearch.com:9200'
我采用docker build,將kibana.yml復制進docker鏡像。
kibana.yml
# Kibana is served by a back end server. This setting specifies the port to use.
server.host: "0"
server.port: 5601
elasticsearch.url: "http://192.168.2.26:9200"
Dockerfile
FROM docker.elastic.co/kibana/kibana-oss:6.2.4
COPY kibana.yml /usr/share/kibana/config/kibana.yml
USER root
RUN chown kibana /usr/share/kibana/config/kibana.yml
USER kibana
Docker build & run
# 在Dockerfile所在文件夾運行
docker build -t kibana-custom:v1 .
# 隨后
docker run -itd --restart=always -p 5601:5601 kibana-custom:v1
Logstash
# 配合filebeat使用。
# -e 后面的字符串大家也可以將其復制到.conf文件中 使用conf文件啟動logstash。
docker run -it --rm -p 5044:5044 -p 9600:9600 docker.elastic.co/logstash/logstash-oss:6.2.4 -e 'input {beats {port => "5044"}} filter{ dissect {mapping => {"message" => "[%{req_msg}] %{ip} () {%{msg_body}} [%{ts} %{+ts} %{+ts} %{+ts} %{+ts}] %{method} %{uri} => %{generated_msg} (%{http_p} %{http_status}) %{other_message}"}} mutate {replace => {"ip"=> "61.244.37.240"}} geoip {source => "ip"}} output {elasticsearch {hosts => ["192.168.2.26:9200"]}}'
filebeat
filebeat 我采用yum安裝。
具體配置可參考之前的配置方法。
在filebeat啟動成功后,可看到有Harvester字樣輸出,即為配置成功。
