ELK由浅入深

1.  ELK stack

    Lucene:

      文档:Document

          包含一个或多个域的容器

            filed:value

          域:

            有很多选项

              索引选项,存储选项,项向量使用选项

            索引选项用于通过倒排索引来控制文本是否被搜索

            存储选项:是否需要存储域的真实值

          文档和域的加权操作

            默认都没有加权

            加权计算标准:

          搜索:

            查询Lucene索引时,它返回的是一个有序的scoreDOC对象:查询时,Lucene会为每个文档计算出其score。

2.  ElasticSearch

    ES是一个基于Lucene实现的开源,分布式,Restful的全文搜索引擎;此外,它还是一个分布式实现文档存储,其中每个文档的每个filed均可以被索引的数据,且可被搜索;也是一个带实时分析功能的分布式搜索引擎,能够扩展至数以百计的节点实时处理PB级的数据。

    基本组件:

      索引:文档容器,类似于表,索引名必须使用小写字母

      类型:类型是索引内部的逻辑分区,其意义完全取决于用户需求

      文档:文档是Lucene索引和搜索的原子单位,它包含了一个或多个域,是域的容器;基于JSON格式表示。拥有多个值的域,叫做多值域。

      映射:原始内容存储为文档之前需要进行分析,例如切词,过滤掉某些词等;映射用于定义此分析机制该如何实现。

    ES的集群组件:

      cluster:ES的集群标识为集群名称,默认为"elasticsearch",节点就是靠此名字来决定加入到哪个集群,一个节点只能属于一个集群。

      node:运行了单个ES实例的主机即为节点,用于存储数据,参与集群索引及搜索操作,节点的标识靠节点名。

      shard:将索引切割成为的物理存储组件,但每一个shard都是独立且完整的索引:创建索引时,ES默认将其分割为5个shard,用户也可以按需自定义。(一旦确定,不可修改)

        shard有两种类型:primary shard和replica,replica用于数据冗余及查询时的负载均衡。默认每个索引有5个primary shard,每个primary shard的副本数量可自定义,且可动态修改。默认为1.

    ES cluster工作过程:

      启动时,通过多播或单播方式在9300/tcp查找同一集群中的其它节点,并与之通信。

      集群中的所有节点会选举出一个主节点负责管理整个集群状态,以及在集群范围内决定各shard的分布方式.站在用户角度,每个节点均可接收并响应用户的各类请求。

      当集群中的某个节点宕机了,集群状态会进入修复状态也就是yellow,主节点会检查所有可用shard的主shard是否够用,如果主shard不够,那么对应的副本shard会提升为主shard(这个时候shard是没有冗余和负载均衡的,所以集群的性能会下降很多),这样副本shard数量就不够用了,那么主节点会复制一份作为副本shard。这个时候会进入重新均衡状态。ES会自动rebalance。

      如果有多个副本,那么当主shard不可用,副本之间会进行一个选举,选举出一个副本升级为主shard。

      当集群中的主节点宕机时,slave节点会重新选举出一个新的master节点。

      集群状态:green,red,yellow

    官方站点: https://www.elastic.co/downloads/elasticsearch

3.  安装jdk(至少1.8以上版本)

    yum list all | grep jdk

    yum install java-1.8.0-openjdk.x86_64

    yum install java-1.8.0-openjdk-devel.x86_64

    yum install java-1.8.0-openjdk-headless.x86_64

    其它准备工作:

官方提供了生产环境下 Elasticsearch 所在操作系统的相关建议,详见 这里

虚拟内存设置,编辑 /etc/sysctl.conf,追加:

vm.max_map_count=262144

修改文件句柄限制,编辑 /etc/security/limits.conf,追加:

*    soft nofile 65536
*    hard nofile 65536

4.  安装Elasticsearch

    1.  导入PGP Key

        rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

    2.  配置一下 elasticsearch的yum源

        在/etc/yum.repos.d/目录下,创建一个名为elasticsearch.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

    3.   安装elasticsearch

        yum install elasticsearch -y

        chkconfig -add elasticsearch

    4.  启动elasticsearch

        /etc/init.d/elasticsearch start

    5.  检查启动是否正常

        curl -XGET 'http://127.0.0.1:9200/'

    6.  配置elasticsearch

        默认的配置文件:/etc/elasticsearch/elasticsearch.yml

        系统配置文件: /etc/sysconfig/elasticsearch

        参数内容:

ES_USER

The user to run as, defaults to elasticsearch.

ES_GROUP

The group to run as, defaults to elasticsearch.

JAVA_HOME

Set a custom Java path to be used.

MAX_OPEN_FILES

Maximum number of open files, defaults to 65536.

MAX_LOCKED_MEMORY

Maximum locked memory size. Set to unlimited if you use the bootstrap.memory_lock option in elasticsearch.yml.

MAX_MAP_COUNT

Maximum number of memory map areas a process may have. If you use mmapfs as index store type, make sure this is set to a high value. For more information, check the linux kernel documentation about max_map_count. This is set via sysctl before starting elasticsearch. Defaults to 262144.

LOG_DIR

Log directory, defaults to /var/log/elasticsearch.

DATA_DIR

Data directory, defaults to /var/lib/elasticsearch.

CONF_DIR

Configuration file directory (which needs to include elasticsearch.yml and log4j2.properties files), defaults to /etc/elasticsearch.

ES_JAVA_OPTS

Any additional JVM system properties you may want to apply.

RESTART_ON_UPGRADE

Configure restart on package upgrade, defaults to false. This means you will have to restart your elasticsearch instance after installing a package manually. The reason for this is to ensure, that upgrades in a cluster do not result in a continuous shard reallocation resulting in high network traffic and reducing the response times of your cluster.

    7.  目录结构

home

Elasticsearch home directory or $ES_HOME

/usr/share/elasticsearch

bin

Binary scripts including elasticsearch to start a node and elasticsearch-plugin to install plugins

/usr/share/elasticsearch/bin

conf

Configuration files including elasticsearch.yml

/etc/elasticsearch

path.conf

conf

Environment variables including heap size, file descriptors.

/etc/sysconfig/elasticsearch

data

The location of the data files of each index / shard allocated on the node. Can hold multiple locations.

/var/lib/elasticsearch

path.data

logs

Log files location.

/var/log/elasticsearch

path.logs

plugins

Plugin files location. Each plugin will be contained in a subdirectory.

/usr/share/elasticsearch/plugins


repo

Shared file system repository locations. Can hold multiple locations. A file system repository can be placed in to any subdirectory of any directory specified here.

Not configured

path.repo

script

Location of script files.

/etc/elasticsearch/scripts

path.scripts

    修改clustername

    修改nodename

5.  监控方案

    1.  集群健康状态

        curl -X GET 'http://127.0.0.1:9200/_cluster/health?pretty'  查看群集的健康状态

[root@localhost elk_data]# curl -X GET 'http://192.168.1.100:9200/_cluster/health?pretty'
{
  "cluster_name" : "zhenpin-elk",  集群名称
  "status" : "yellow",  集群状态,重要
  "timed_out" : false,  
  "number_of_nodes" : 3,  集群内节点总数
  "number_of_data_nodes" : 3,  集群内的总数据节点数
  "active_primary_shards" : 6466,  集群内所有索引的主分片总数
  "active_shards" : 7737,  集群内所有索引的分片总数
  "relocating_shards" : 0,  正在迁移的分片数
  "initializing_shards" : 2,  正在初始化的分片数
  "unassigned_shards" : 5193,  未分配到具体节点上的分片数
  "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" : 59.82833281781627  活动分片的百分比
}

    正常情况下:

      relocating_shards

      initializing_shards

      unassigned_shards

      delayed_unassigned_shards

      这四项的值都应该为0

    2.  level请求参数

        curl -X GET 'http://192.168.1.100:9200/_cluster/health?level=indices'

        查看索引级别的分片状态

    3.  使用bigdesk工具

        

    4.  查看节点状态

        curl -X GET  http://192.168.1.100:9200/_cat/nodes?v

        curl -XGET 'http://192.168.10.213:9200/_cluster/state/nodes?pretty'

    5.  安装head插件

        官网地址:https://github.com/mobz/elasticsearch-head

      • git clone git://github.com/mobz/elasticsearch-head.git
      • cd elasticsearch-head
      • npm install
      • npm run start
      • open http://ip:9100
      • 连接9100发现很慢,需要修改主节点的配置文件/etc/elasticsearch/elasticsearch.yml
        •   添加两行内容 :
        • http.cors.enabled: true
            http.cors.allow-origin: "*"
        •        重启elasticsearch服务。

    6.  查看分片状态

        curl -XGET 'http://192.168.x.xx:9200/_cat/shards' |grep UNASSIGNED

    7.  查看节点上的分片信息

        

    四类API:

      1.  检查集群,节点,索引等健康与否,以及获取其相应状态

          curl -X GET 'http://127.0.0.1:9200/?pretty'  查看当前节点的版本信息

          curl -X GET 'http://127.0.0.1:9200/_cat/nodes?v'  查看当前所有节点的负载信息

          curl -X GET 'http://127.0.0.1:9200/_cat/master?v'  查看当前主节点的信息

          curl -X GET 'http://127.0.0.1:9200/_cat/shards/?help'  查看帮助信息

          curl -X GET 'http://127.0.0.1:9200/_cat/indices'  查看所有索引信息

          curl -X GET 'http://127.0.0.1:9200/_cluster/health?pretty'  查看群集的健康状态

          curl -X GET 'http://127.0.0.1:9200/_cluster/health/common-error-*?pretty'  查看某个索引的健康状态

          curl -X GET 'http://127.0.0.1:9200/_cluster/state/master_node'  

      2.  管理集群,节点,索引及元数据

          curl -X GET 'http://127.0.0.1:9200/_cluster/state/master_node'

      3.  执行CRUD操作

          创建文档

            curl -XPUT '127.0.0.1:9200/students/class/1?pretty'  -d ''

          获取文档

            curl -XGET '127.0.0.1:9200/students/class/1?pretty'

          更新文档

            PUT覆盖原来的文档

            只更新部分文档内容,得使用_update API

            curl -XPOST '127.0.0.1:9200/students/class/1/_update?pretty' -d '

            {

              "doc": {"age": 22 }

            }'

          删除文档

            curl -XDELETE 'localhost:9200/students/class/2'

          删除索引

            curl -XDELETE 'localhost:9200/students'

      4.  查询数据

            query API

            Query DSL:  用于实现诸多类型查询操作

            查看某个索引下的所有文档

              curl -XGET 'localhost:9200/students/_search?pretty'

            查看所有索引下的所有文档

              curl -XGET 'localhost:9200/_search?pretty'

      4.  执行高级操作,例如:paging,filtering等

    ES访问接口:  9200/tcp

    curl -X <VERB> '<PROTOCOL>://HOST:PORT/<PATH>?<QUERY_STRING>' -d '<BODY>'

      VERB:  GET,PUT,DELETE

      PROTOCOL:  http,  https

      QUERY_STRING:  查询参数,例如?pretty表示用易读的JSON格式输出

      BODY:  请求的主体

    Cluster APIs:

      health:

          curl -X GET 'http://127.0.0.1:9200/_cluster/health?pretty'  查看群集的健康状态

          curl -X GET 'http://127.0.0.1:9200/_cluster/health/common-error-*?pretty'  查看某个索引的健康状态

      state:

          curl -X GET 'http://127.0.0.1:9200/_cluster/state/master_node'

      stats:

          curl -X GET 'http://127.0.0.1:9200/_cluster/stats?pretty'

6.  ES的plugins插件

    1.  插件扩展ES的功能

        添加自定义的映射类型,自定义分析器,本地脚本,自定义发现方式

    2.  安装

        直接将插件放到plugins目录中,/usr/share/elasticsearch/plugins

        使用plugin脚本管理/usr/share/elasticsearch/bin/plugin

        /usr/share/elasticsearch/bin/plugin -h 帮助

        /usr/share/elasticsearch/bin/plugin -i 安装插件

        /usr/share/elasticsearch/bin/plugin -r 卸载插件

 

        /usr/share/elasticsearch/bin/elasticsearch-plugin install 插件url路径

        /usr/share/elasticsearch/bin/elasticsearch-plugin remove 插件名称

        /usr/share/elasticsearch/bin/elasticsearch-plugin list 列出所有插件

        插件:marvel插件

    3.  站点插件

        http://127.0.0.1:9200/_plugin/plugins_name

7.  ES stack之logstash

    1.  logstash日志收集工具

         支持多数据获取机制,通过TCP/UDP协议,文件,syslog,windows,eventlogs及STDIN等。

        它支持对数据执行过滤,修改等操作。

        agent/server

    2.  logstash插件

        1.  input plugin

            file:从指定的文件中读取事件流,类似于tail -f

            udp

            redis:从redis读取数据,支持redis channel和lists两种方式

        2.  codec plugin

        3.  filter plugin

            用于在于将event通过output发出之前对其实现某些处理功能。grok

            grok:用于分析并结构化文本数据,目前是logstash中将非结构化日志数据转化为结构化的可查询数据的不二之选。

            模式定义位置:/usr/share/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.1.2/patterns/grok-patterns

            1.1.1.1 GET /index.html 30  0.23

            %{IP:clientip} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes}  %{NUMBER:decrion}

            例子:

input {
  beats {
    port => 5044
  }
}

filter {
   if [fields][tag] == "common-all"{
     grok {
       match =>{
         "message" => "\ - %{TIMESTAMP_ISO8601:datetime} \[// -  - \] %{LOGLEVEL:loglevel} %{NOTSPACE:other} - %{ALL:info}"
       }
     }
   }
   if [fields][tag] == "common-error"{
     grok {
       match =>{
         "message" => "%{TIMESTAMP_ISO8601:datetime} \[// -  - \] %{LOGLEVEL:loglevel} %{NOTSPACE:other} - %{ALL:info}"
       }
     }
   }
}



output {
  if [fields][tag] == "common-all"{
      elasticsearch {
          hosts => "127.0.0.1:9200"
          index => "common-all-%{+YYYY.mm.dd}"
          #document_type => "%{[@metadata][type]}"
      }
  }
  if [fields][tag] == "common-error"{
      elasticsearch {
          hosts => "127.0.0.1:9200"
          index => "common-error-%{+YYYY.mm.dd}"
          #document_type => "%{[@metadata][type]}"
      }
  }
}

            匹配apache logs

grok {
       match =>{
         "message" => "%{COMBINEDAPACHELOG}"
       }
     }

            匹配nginx logs

              1.  自定义好正则

NGUSERNAME [a-zA-Z\.\@\-\+_%]+
HOSTPORT1 (%{IPV4}:%{POSINT}[, ]{0,2})+
NGUSER %{NGUSERNAME}
NGINXACCESSTRUE %{IPORHOST:http_host} (?:%{IPORHOST:clientip}|-) (?:%{HOSTPORT1:upstream_addr}|-) \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent} (?:%{NUMBER:upstream_time:float}|-) (?:%{NUMBER:request_time:float})
NGINXACCESSERROR %{IPORHOST:http_host} (?:%{IPORHOST:clientip}|-) (?:%{HOSTPORT1:upstream_addr}|-) \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent}

NGINXACCESSLOG %{NGINXACCESSTRUE}|%{NGINXACCESSERROR}
NGINXACCESS %{NGINXACCESSLOG}
 grok {
           patterns_dir => "/usr/share/logstash/patterns"
           match =>{
                 "message" => "%{NGINXACCESS}"
                 }
            }  

        4.  output plugin

            1.  stdout标准输出

            2.  elasticsearch

            3.  redis                           

    3.   安装logstash

        yum install logstash -y

    4.   配置logstash

    5.  检查配置文件语法

        logstash -f /etc/logstash/conf.d/sample.conf -t

    6.  数据类型

        1.  Array: [item1,item2,....]

        2.  Boolean: true

        3.  Bytes

        4.  Codec:编码器

        5.  Hash: key => value

        6.  Number

        7.  string

8.  elasticsearch集群

    1.  故障:

        max file descriptors [64000] for elasticsearch process is too low, increase to at least [65536]

        解决方法:

          

    2.  报错:

        [2019-03-07T15:44:56,109][INFO ][logstash.outputs.elasticsearch] retrying failed action with response code: 429 ({"type"=>"es_rejected_execution_exception", "reason"=>"rejected execution of org.elasticsearch.transport.TransportService$7@3211f4ed on EsThreadPoolExecutor[bulk, queue capacity = 200, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@229b9da8[Running, pool size = 2, active threads = 2, queued tasks = 200, completed tasks = 2554]]"})

        解决方法:

    3.  报错:

[2019-03-15T14:38:54,986][WARN ][r.suppressed ] path: /_bulk, params: {}
org.elasticsearch.cluster.block.ClusterBlockException: blocked by: [SERVICE_UNAVAILABLE/2/no master];
at org.elasticsearch.cluster.block.ClusterBlocks.globalBlockedException(ClusterBlocks.java:165) ~[elasticsearch-5.6.15.jar:5.6.15]
at org.elasticsearch.action.bulk.TransportBulkAction$BulkOperation.handleBlockExceptions(TransportBulkAction.java:396) [elasticsearch-5.6.15.jar:5.6.15]
at org.elasticsearch.action.bulk.TransportBulkAction$BulkOperation.doRun(TransportBulkAction.java:280) [elasticsearch-5.6.15.jar:5.6.15]
at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) [elasticsearch-5.6.15.jar:5.6.15]
at org.elasticsearch.action.bulk.TransportBulkAction$BulkOperation$2.onTimeout(TransportBulkAction.java:433) [elasticsearch-5.6.15.jar:5.6.15]
at org.elasticsearch.cluster.ClusterStateObserver$ContextPreservingListener.onTimeout(ClusterStateObserver.java:311) [elasticsearch-5.6.15.jar:5.6.15]
at org.elasticsearch.cluster.ClusterStateObserver$ObserverClusterStateListener.onTimeout(ClusterStateObserver.java:238) [elasticsearch-5.6.15.jar:5.6.15]
at org.elasticsearch.cluster.service.ClusterService$NotifyTimeout.run(ClusterService.java:1056) [elasticsearch-5.6.15.jar:5.6.15]
at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingRunnable.run(ThreadContext.java:576) [elasticsearch-5.6.15.jar:5.6.15]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_201]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_201]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_201]、

    4.  报错:

[2019-03-15T17:07:05,572][WARN ][o.e.t.n.Netty4Transport ] [node-3] write and flush on the network layer failed (channel: [id: 0x26f5f798, L:0.0.0.0/0.0.0.0:9300 ! R:/192.168.1.100:57523])
java.nio.channels.ClosedChannelException: null
at io.netty.channel.AbstractChannel$AbstractUnsafe.write(...)(Unknown Source) ~[?:?]

    5.  发现elasticsearch的日志,报错:

[2019-03-28T14:44:21,949][DEBUG][o.e.a.b.TransportShardBulkAction] [node-1] [mly-tomcatfilebeat-2019.03.28][4] failed to execute bulk item (index) BulkShardRequest [[mly-tomcatfilebeat-2019.03.28][4]] containing [index {[mly-tomcatfilebeat-2019.03.28][log][AWnDCtk9gquPiFasuuLO], source[{"date":"<com.netflix.discovery.shared.resolver.aws.ConfigClusterResolver>","classfile":"eureka","other":"endpoints","offset":24933,"level":"Resolving","input_type":"log","source":"/usr/local/javalogs/wms/common-all.log","message":"<com.netflix.discovery.shared.resolver.aws.ConfigClusterResolver> - Resolving eureka endpoints via configuration","type":"log","tags":["tomcat_base_wms_service_21","beats_input_codec_plain_applied","multiline"],"@timestamp":"2019-03-28T06:44:08.623Z","@version":"1","beat":{"name":"tomcat-base-wms-21","hostname":"tomcat-base-wms-21","version":"5.6.11"},"host":"tomcat-base-wms-21","time":"-","info":"via"}]}]
org.elasticsearch.index.mapper.MapperParsingException: failed to parse [date]
        at org.elasticsearch.index.mapper.FieldMapper.parse(FieldMapper.java:298) ~[elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.index.mapper.DocumentParser.parseObjectOrField(DocumentParser.java:468) ~[elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.index.mapper.DocumentParser.parseValue(DocumentParser.java:591) ~[elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.index.mapper.DocumentParser.innerParseObject(DocumentParser.java:396) ~[elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.index.mapper.DocumentParser.parseObjectOrNested(DocumentParser.java:373) ~[elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.index.mapper.DocumentParser.internalParseDocument(DocumentParser.java:93) ~[elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.index.mapper.DocumentParser.parseDocument(DocumentParser.java:66) ~[elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.index.mapper.DocumentMapper.parse(DocumentMapper.java:277) ~[elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.index.shard.IndexShard.prepareIndex(IndexShard.java:530) ~[elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.index.shard.IndexShard.prepareIndexOnPrimary(IndexShard.java:507) ~[elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.action.bulk.TransportShardBulkAction.prepareIndexOperationOnPrimary(TransportShardBulkAction.java:458) ~[elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.action.bulk.TransportShardBulkAction.executeIndexRequestOnPrimary(TransportShardBulkAction.java:466) ~[elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.action.bulk.TransportShardBulkAction.executeBulkItemRequest(TransportShardBulkAction.java:146) [elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.action.bulk.TransportShardBulkAction.shardOperationOnPrimary(TransportShardBulkAction.java:115) [elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.action.bulk.TransportShardBulkAction.shardOperationOnPrimary(TransportShardBulkAction.java:70) [elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryShardReference.perform(TransportReplicationAction.java:975) [elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryShardReference.perform(TransportReplicationAction.java:944) [elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.action.support.replication.ReplicationOperation.execute(ReplicationOperation.java:113) [elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.action.support.replication.TransportReplicationAction$AsyncPrimaryAction.onResponse(TransportReplicationAction.java:345) [elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.action.support.replication.TransportReplicationAction$AsyncPrimaryAction.onResponse(TransportReplicationAction.java:270) [elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.action.support.replication.TransportReplicationAction$1.onResponse(TransportReplicationAction.java:924) [elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.action.support.replication.TransportReplicationAction$1.onResponse(TransportReplicationAction.java:921) [elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.index.shard.IndexShardOperationsLock.acquire(IndexShardOperationsLock.java:151) [elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.index.shard.IndexShard.acquirePrimaryOperationLock(IndexShard.java:1659) [elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.action.support.replication.TransportReplicationAction.acquirePrimaryShardReference(TransportReplicationAction.java:933) [elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.action.support.replication.TransportReplicationAction.access$500(TransportReplicationAction.java:92) [elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.action.support.replication.TransportReplicationAction$AsyncPrimaryAction.doRun(TransportReplicationAction.java:291) [elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) [elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryOperationTransportHandler.messageReceived(TransportReplicationAction.java:266) [elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryOperationTransportHandler.messageReceived(TransportReplicationAction.java:248) [elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.transport.RequestHandlerRegistry.processMessageReceived(RequestHandlerRegistry.java:69) [elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.transport.TransportService$7.doRun(TransportService.java:644) [elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:638) [elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) [elasticsearch-5.6.0.jar:5.6.0]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_141]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_141]
        at java.lang.Thread.run(Thread.java:748) [?:1.8.0_141]
Caused by: java.lang.IllegalArgumentException: Invalid format: "<com.netflix.discovery.shared.re..."
        at org.joda.time.format.DateTimeParserBucket.doParseMillis(DateTimeParserBucket.java:187) ~[joda-time-2.9.5.jar:2.9.5]
        at org.joda.time.format.DateTimeFormatter.parseMillis(DateTimeFormatter.java:826) ~[joda-time-2.9.5.jar:2.9.5]
        at org.elasticsearch.index.mapper.DateFieldMapper$DateFieldType.parse(DateFieldMapper.java:240) ~[elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.index.mapper.DateFieldMapper.parseCreateField(DateFieldMapper.java:465) ~[elasticsearch-5.6.0.jar:5.6.0]
        at org.elasticsearch.index.mapper.FieldMapper.parse(FieldMapper.java:287) ~[elasticsearch-5.6.0.jar:5.6.0]
        ... 36 more

      解决方法:

        根据错误显示,认为是date字段解析有问题。怀疑是grok那里写的不对,然后修改了一下grok,发现问题依然存在。

        把所有的客户端的filebeat都停止,然后一台一台开启filebeat,发现当有一台filebeat的时候,问题还是存在。

        怀疑是logstash的multiline不对,然后修改multiline,问题还是存在,把multiline屏蔽,问题不存在。然后把logstatsh的multiline,都放到每个客户端的filebeat中。

    6.  ELK集群中的一个节点报错:

[2019-04-22T16:30:15,468][ERROR][o.e.b.Bootstrap          ] Exception
java.lang.IllegalStateException: Failed to create node environment
        at org.elasticsearch.node.Node.<init>(Node.java:268) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.node.Node.<init>(Node.java:245) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:233) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:233) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:342) [elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:132) [elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:123) [elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:70) [elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:134) [elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.cli.Command.main(Command.java:90) [elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:91) [elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:84) [elasticsearch-5.6.16.jar:5.6.16]
Caused by: java.io.IOException: failed to test writes in data directory [/var/lib/elasticsearch/nodes/0/indices/1a2hC1WUTX-jvawR3tWBzw/3/_state] write permission is required
        at org.elasticsearch.env.NodeEnvironment.tryWriteTempFile(NodeEnvironment.java:1111) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.env.NodeEnvironment.assertCanWrite(NodeEnvironment.java:1090) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:282) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.node.Node.<init>(Node.java:265) ~[elasticsearch-5.6.16.jar:5.6.16]
        ... 11 more
Caused by: java.nio.file.FileSystemException: /var/lib/elasticsearch/nodes/0/indices/1a2hC1WUTX-jvawR3tWBzw/3/_state/.es_temp_file: Not a directory
        at sun.nio.fs.UnixException.translateToIOException(UnixException.java:91) ~[?:?]
        at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) ~[?:?]
        at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) ~[?:?]
        at sun.nio.fs.UnixFileSystemProvider.implDelete(UnixFileSystemProvider.java:244) ~[?:?]
        at sun.nio.fs.AbstractFileSystemProvider.deleteIfExists(AbstractFileSystemProvider.java:108) ~[?:?]
        at java.nio.file.Files.deleteIfExists(Files.java:1165) ~[?:1.8.0_201]
        at org.elasticsearch.env.NodeEnvironment.tryWriteTempFile(NodeEnvironment.java:1107) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.env.NodeEnvironment.assertCanWrite(NodeEnvironment.java:1090) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:282) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.node.Node.<init>(Node.java:265) ~[elasticsearch-5.6.16.jar:5.6.16]
        ... 11 more
[2019-04-22T16:30:15,487][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [node-3] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.IllegalStateException: Failed to create node environment
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:136) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:123) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:70) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:134) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:91) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:84) ~[elasticsearch-5.6.16.jar:5.6.16]
Caused by: java.lang.IllegalStateException: Failed to create node environment
        at org.elasticsearch.node.Node.<init>(Node.java:268) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.node.Node.<init>(Node.java:245) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:233) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:233) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:342) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:132) ~[elasticsearch-5.6.16.jar:5.6.16]
        ... 6 more
Caused by: java.io.IOException: failed to test writes in data directory [/var/lib/elasticsearch/nodes/0/indices/1a2hC1WUTX-jvawR3tWBzw/3/_state] write permission is required
        at org.elasticsearch.env.NodeEnvironment.tryWriteTempFile(NodeEnvironment.java:1111) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.env.NodeEnvironment.assertCanWrite(NodeEnvironment.java:1090) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:282) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.node.Node.<init>(Node.java:265) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.node.Node.<init>(Node.java:245) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:233) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:233) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:342) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:132) ~[elasticsearch-5.6.16.jar:5.6.16]
        ... 6 more
Caused by: java.nio.file.FileSystemException: /var/lib/elasticsearch/nodes/0/indices/1a2hC1WUTX-jvawR3tWBzw/3/_state/.es_temp_file: Not a directory
        at sun.nio.fs.UnixException.translateToIOException(UnixException.java:91) ~[?:?]
        at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) ~[?:?]
        at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) ~[?:?]
        at sun.nio.fs.UnixFileSystemProvider.implDelete(UnixFileSystemProvider.java:244) ~[?:?]
        at sun.nio.fs.AbstractFileSystemProvider.deleteIfExists(AbstractFileSystemProvider.java:108) ~[?:?]
        at java.nio.file.Files.deleteIfExists(Files.java:1165) ~[?:1.8.0_201]
        at org.elasticsearch.env.NodeEnvironment.tryWriteTempFile(NodeEnvironment.java:1107) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.env.NodeEnvironment.assertCanWrite(NodeEnvironment.java:1090) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:282) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.node.Node.<init>(Node.java:265) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.node.Node.<init>(Node.java:245) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:233) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:233) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:342) ~[elasticsearch-5.6.16.jar:5.6.16]
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:132) ~[elasticsearch-5.6.16.jar:5.6.16]
        ... 6 more

    7.  记录一次elk集群中的一个节点突然与主节点,然后一直尝试连接的问题。

        报错内容如下:

[2019-04-25T15:34:45,682][INFO ][o.e.c.s.ClusterService   ] [node-2] detected_master {node-1}{iFpkp4QeQEyfsULp5jXzjw}{4RLhFTzbQoiTaK3mpquN-A}{192.168.1.100}{192.168.1.100:9300}, reason: zen-disco-receive(from master [master {node-1}{iFpkp4QeQEyfsULp5jXzjw}{4RLhFTzbQoiTaK3mpquN-A}{192.168.1.100}{192.168.1.100:9300} committed version [43070]])
[2019-04-25T15:34:46,983][INFO ][o.e.d.z.ZenDiscovery     ] [node-2] master_left [{node-1}{iFpkp4QeQEyfsULp5jXzjw}{4RLhFTzbQoiTaK3mpquN-A}{192.168.1.100}{192.168.1.100:9300}], reason [failed to ping, tried [3] times, each with  maximum [30s] timeout]
[2019-04-25T15:34:46,984][WARN ][o.e.d.z.ZenDiscovery     ] [node-2] master left (reason = failed to ping, tried [3] times, each with  maximum [30s] timeout), current nodes: nodes: 
   {node-2}{Rt0Bx2ZrTn6yLnQoduU3xQ}{OAds0hDJTZuqj6AnnhnV_g}{192.168.1.39}{192.168.1.39:9300}, local
   {node-1}{iFpkp4QeQEyfsULp5jXzjw}{4RLhFTzbQoiTaK3mpquN-A}{192.168.1.100}{192.168.1.100:9300}, master

        反反复复出现这个报错。

        解决方法:

          查看系统时间,发现两台服务器的时间不同,导致这个问题出现。

    8.  新增elasticsearch节点,启动报错       

max number of threads [1024] for user [elasticsearch] is too low, increase to at least [2048]

        解决方法:

           修改/etc/security/limits.d/90-nproc.conf          

*          soft    nproc     2048      

9.  关于elastisearch的索引名称问题

    在logstash的配置文件中,设置时间为

output {
  if [fields][tag] == "common-all"{
      elasticsearch {
          hosts => "192.168.1.100:9200"
          #hosts => "127.0.0.1:9200"
          index => "common-all-%{+YYYY.MM.dd}"
          #document_type => "%{[@metadata][type]}"
      }
  }
  if [fields][tag] == "common-error"{
      elasticsearch {
          hosts => "192.168.1.100:9200"
          #hosts => "127.0.0.1:9200"
          index => "common-error-%{+YYYY.MM.dd}"  这里要写对了
          #document_type => "%{[@metadata][type]}"
      }
  }

10.  kibana配置与管理

    1.  安装

        yum install kibana

    2.  安装目录

        /usr/share/kibana

    3.  配置文件

        /etc/kibana/kibana.yml

[root@localhost kibana]# grep -Ev "^$|^#" /etc/kibana/kibana.yml 
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "http://192.168.1.100:9200"
elasticsearch.pingTimeout: 3000
elasticsearch.requestTimeout: 300000

    4.  管理kibana服务

        /etc/init.d/kibana start status stop restart          

    5.  查看kibana版本

        /usr/share/kibana/bin/kibana --version

    6.  .kibana索引结构

        index pattern

11.  logstash占用CPU过高

logstash 是通过rpm方式安装的,版本是6.2.2 

解决方案 : 

rpm 安装的logstash有 initctl 的守护进程

使用initctl stop logstash来关闭 logstash

#initctl  stop logstash
logstash stop/waiting

12.  kibana使用的lucene查询语法

    1.  全文搜索

        在搜索栏中输入要搜索的关键字,例如:login,会返回所有字段值中包含login的文档

    2.  使用双引号包起来作为一个短语搜索

    3.  按照某个字段搜索

        filed: value

        filed: "value"

    4.  通配符

        ?匹配单个字符

        *匹配0到多个字符

        ?和*不能用作第一个字符

    5.  模糊搜索

        在一个单词后面加上~

    6.  范围搜索

数值/时间/IP/字符串 类型的字段可以对某一范围进行查询
length:[100 TO 200]
sip:["172.24.20.110" TO "172.24.20.140"]
date:{"now-6h" TO "now"}
tag:{b TO e} 搜索b到e中间的字符
count:[10 TO *] * 表示一端不限制范围
count:[1 TO 5} [ ] 表示端点数值包含在范围内,{ } 表示端点数值不包含在范围内,可以混合使用,此语句为1到5,包括1,不包括5
可以简化成以下写法:
age:>10
age:<=10
age:(>=10 AND <20)

    7.  逻辑操作    

AND
OR

+:搜索结果中必须包含此项
-:不能含有此项
+apache -jakarta test aaa bbb:结果中必须存在apache,不能有jakarta,剩余部分尽量都匹配到

    8.  转义特殊字符

+ - = && || > < ! ( ) { } [ ] ^ " ~ * ? : \ /
以上字符当作值搜索的时候需要用\转义
\(1\+1\)\=2用来查询(1+1)=2

  9.  正则表达式

        匹配zhen.com的所有二级域名

        /.*zhen\.com/

13.  elasticsearch集群增加节点

    1.  安装配置好elasticsearch

    2.  修改配置文件/etc/elasticsearch/elasticsearch.yml

cluster.name: test
node.name: node-4
node.master: false
path.data: /elk_data/data
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
network.host: 192.168.1.101
http.port: 9200
discovery.zen.ping.unicast.hosts: ["192.168.1.100:9300","192.168.1.39:9300","192.168.1.52:9300","192.168.1.101:9300"]
http.cors.enabled: true
http.cors.allow-origin: "*"

    3.  修改/etc/security/limits.d/90-nproc.conf  

*          soft    nproc     2048

    4.  启动elasticsearch服务

        /etc/init.d/elasticsearch start

    5.  elasticsearch集群会把部分分片分配到新的服务器上

        查看一下elk集群的状态

        curl -X GET 'http://192.168.1.101:9200/_cluster/health?pretty'

{
  "cluster_name" : "zhenpin-elk",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 3,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 1261,
  "active_shards" : 2522,
  "relocating_shards" : 0,  这个显示为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
}    

14.  elasticsearch集群删除节点

      1.  将自动分配分片,排除192.168.1.39

          curl -XPUT "http://192.168.1.100:9200/_cluster/settings" -d '{"transient": {"cluster.routing.allocation.exclude._ip" : "192.168.1.39"}}'  

      2.  等待所有的分片都分配完成。

          curl -X GET 'http://192.168.1.101:9200/_cluster/health?pretty'  

          结果中relocating_shards这个值为0

      3.  关闭要删除的节点

          /etc/init.d/elasticsearch stop

      4.  其它一下其他节点的/etc/elasticsearch/elasticsearch.yml的配置文件          

discovery.zen.ping.unicast.hosts: ["192.168.1.100:9300","192.168.1.101:9300","192.168.1.52:9300"]                  

      5.  所有节点的elasticsearch服务都需要重启一下。

16.  elasticsearch集群节点重启

      1.  关闭自动分配分片

          curl -XPUT "http://192.168.1.100:9200/_cluster/settings" -d '{"transient": {"cluster.routing.allocation.enable" : "none"}}'          

      2.  重启elastisearch节点

          /etc/init.d/elasticsearch restart

      3.  恢复自动分配分片

          curl -XPUT "http://192.168.1.100:9200/_cluster/settings" -d '{"transient": {"cluster.routing.allocation.enable" : "all"}}'                      

17.  定时清理elasticsearch集群索引

#!/bin/bash
shijian=`date +%Y.%m.%d -d "60 days ago"`
/usr/bin/curl -XDELETE "http://192.168.1.100:9200/common-error-${shijian}" && /usr/bin/curl -XDELETE "http://192.168.1.100:9200/common-all-${shijian}"
posted @ 2019-01-29 15:49  奋斗史  阅读(1064)  评论(0)    收藏  举报