ELK 探索

ELK

Elasticsearch

基本概念

NRT--Near Real Time

近实时:你对文档进行索引到你能对其进行查询的延时很短(一般是1s)

Cluster--集群

拥有你全量数据并提供索引存储和查询功能的一个或多个es服务节点。

Node--服务节点

服务节点是一台集群中的服务器,为集群提供索引和查询能力。

Index--索引

索引是一个拥有类似特征的文档的集合。

Document--文档

文档是一个可被索引的信息的基本单元。

Shards & Replicas--分区和复制

安装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包安装,那么数据和日志的文件夹是在$ES_HOME的子文件夹下,如果保持默认配置不变,这两个文件夹很有极大风险被删除。

path:
  logs: /var/log/elasticsearch
  data: /var/data/elasticsearch

Cluster names

ES会将所有有共同集群名称的服务节点加入集群。

需要注意不同的环境(测试、生产)的配置集群名的区分,否则就会出现不同环境的节点加入同个集群。

cluster.name: logging-prod

Node name

ES会使用随机生成的UUID的前七位作为node id。node id 是永久的并不会因为重启而改变,因此默认的node name也不会改变。

官方建议给出更有意义的命名方式。

node.name: prod-data-2
# 也可以设置为系统的HOSTNAME
node.name: ${HOSTNAME}

Network host

ES会使用回送地址(loopback addresses) 127.0.0.1 和 [::1]。对于单个开发节点来说,这样的配置就足够了。

但是为了集群的节点间通信呢,我们就需要指定一个非回送地址(non-loopback address):

network.host: 192.168.1.10

ES还可以识别其他的特殊值,详见这里。

Discovery settings

ES使用的是一种自定义的集群节点对节点和主从选举发现方式--“Zen Discovery“。这个发现方式有两个重要的配置项:

  • discovery.zen.ping.unicast.hosts

在没有任何网络配置的情况下,ES会banding在回送地址并会不断扫描9300-9305端口来连接其他在同个服务器上的其他节点。

如果需要连接其他服务器的节点,则需要我们给出种子节ip地址。种子节点的ip地址可以用如下方式给出:

discovery.zen.ping.unicast.hosts:
   - 192.168.1.10:9300
   - 192.168.1.11 # 不指定端口会访问默认端口
   - seeds.mydomain.com # 这个域名解析出的全部ip
  • discovery.zen.minimum_master_nodes

为防止数据丢失,这个配置是非常重要的。有了这项配置,集群中的所有节点就知道选举主节点需要的最少参与节点数。如果没有这项配置,某个节点的网络错误会导致集群分成两个部分,从而导致数据丢失。关于集群分成两个部分,我们可以看这个更详细的描述,在这个更详细的描述中,官方建议集群配置最少需要三个主节点。

# 算法:(master_eligible_nodes / 2) + 1
# 如果我们有三个主节点,则我们需要配置最少2个。(3/2) + 1 = 2
discovery.zen.minimum_master_nodes: 2

Heap size

ES会默认配置1GB的最小/最大堆容量。当我们往生产环境迁移的时候,确保ES有足够的堆容量是很重要的一点。

官方给出如下建议:

  • 将最小Xms和最大Xmx的对容量设置为相同数值。
  • 为ES配置的对容量越大,ES可使用的缓存越大。需要指出的是,过大的对容量会导致很长的垃圾回收暂停。
  • 设置Xmx的时候,不要超过物理RAM容量的50%来保证系统有足够的RAM来提供文件系统的缓存。
  • 设置Xmx数值的时候,不要超过JVM为压缩对象指针的隔断。不同java版本的隔断不同,但都接近32GB。我们可以在ES的日志中找到如下这一行,确认一下这个数值:
heap size [1.9gb], compressed ordinary object pointers [true]
heap size
  • 更好的做法是,我们可以试着将Xmx设置为低于 the threshold for zero-based compressed oops;在大部分系统这个值一般确定在26GB,有些系统是30GB。你可以在ES的启动时对其jvm参数多家两行: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
compressed oops

PS:实验下来,使用docker启动ES, the cutoff that the JVM uses for compressed object pointers 跟the threshold for zero-based compressed oops这两个数值与docker容器中jvm.options中Xms和Xmx数值挂钩,与分配给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

ELK 探索_第1张图片
logstash

安装LogStash

https://www.elastic.co/guide/en/logstash/current/installing-logstash.html

基本概念

ELK 探索_第2张图片
管道

输入 input

  • file:文件。从文件系统读取文件,类似命令tail -0F
  • syslog:从514端口读取系统日志信息并且用RFC3164格式解析。
  • redis:使用redis channels和redis lists读取redis 服务器内容。redis经常扮演“中间人”的角色,将远程的logstash事件按队列传输。
  • beats:处理Filebeat传递的事件。

过滤 filter

  • grok:对任意文本进行解析和重构。
  • mutate:对事件中字段进行通用处理。
  • drop:对一些事件直接丢弃,如debug事件。
  • clone:对事件进行拷贝,可以添加或移除字段。
  • geoip:根据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

ELK 探索_第3张图片
Beats design

filebeat设计原理如上图所示,主要由两个核心组件组成:Harvester和Prospector。

Harvester

Harvester主要负责读取单个文件的内容。

Prospector

Prospector主要负责管理Harvesters和寻找所有可以读取的源。

目前支持两种Prospector格式:logstdin

如果格式为log,则filebeat会根据配置,读取全部满足条件的文件,每个文件一个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等。可以使用modules 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的分析和可视化平台。可以用存储好的数据指标在kibana上进行搜索、查看和互动。在kibana上,你还能对数据进行更进一步的分析并用图表、表格和地图的形式可视化呈现。

搭建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

简单使用

需要可视化或查询数据之前,需要在kibana中设置ES的index。

点击左侧边栏"Management"-->"Index Patterns"-->"Create Index Pattern"即可设置。

在kibana 6.x中,会显示ES中已有的index。用户可根据自己的需求,设置index的正则匹配规则,如:

logstash-*
logstash-6.2.4-*
ELK 探索_第4张图片
创建索引规则

随后便可在页面中,对指定的index进行查询或可视化操作了。

ELK 探索_第5张图片
可视化操作

补充:lucene 查询语法

整体搭建流程

环境说明:

  • 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(数据交互、API交互端口) 9300(集群发现端口)暴露出来即可。

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字样输出,即为配置成功。

ELK 探索_第6张图片
赞赏是第一生产力

这篇文章的Press.one签名:
https://press.one/file/v?s=3152ece53ee4f864fe4326ae2166f230d100a4629548ac0aef527cf2e48ea0976608dcb290c439a522a28f5db5ef05dcf3084496dbe2b1b1b53508500065e4760&h=c0f8f2fb26429366f05ddbf3c2230d8eb37e35cfab19a17a17630565813b17f4&a=866597c04655a093a3e1f31a317c7addd0df9123&f=P1&v=2

你可能感兴趣的:(ELK 探索)