Elastic+logstash+head简单介绍

Elastic+logstash+head简单介绍

一. 概述

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。

二.ElasticSearch的安装与简单配置

1.1. 应该始终运行最新版本的 Java 虚拟机( JVM ), 除非 Elasticsearch 网站上另有说明。  Elasticsearch, 特别是 Lucene,是一个高要求的软件。Lucene 的单元测试和集成测试经常暴露出 JVM 本身的 bug。这些 bug 的范围从轻微的麻烦到严重段错误,所以,最好尽可能的使用最新版本的 JVM

1.2. 下载ElasticSearch

下载地址:https://www.elastic.co/downloads/elasticsearch


如下载最新版本请点TAR,其他版本请点击 past releases选择

1.3.  解压安装包


1.4. 目录讲解:

1. bin:包含运行ElasticSearch实例和管理插件的一些脚本

2. Config: 主要是一些设置文件,如logging,elasticsearch.yml,jvm

3. Lib:包含相关的包文件等

4. Plugins:包含相关的插件文件等

5. Logs:日志文件

6. Data:数据存放地址

1.5. 零配置启动

直接进入bin目录下,启动脚本elasticsearch

./elasticsearch

会显示如下错误:

(1).java.lang.RuntimeException: can not run elasticsearch as root

这是由于elastic之前因为root超级权限下启动引发过血案,所有强制不让在root下启动 。解决方案:

添加elastic启动用户:

useradd syliu

passwd syliu

chown -R syliu:syliu elasticsearch-6.1.3

su syliu #

然后进入bin目录下启动./elasticsearch

(2).max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]

这是由于linux下最大打开文件数量比elastic要求的打开数量少

查看系统最大打开文件数量

- ulimit -a (查看)

- ulimit -n 65536(设置)

或者:

切换到root用户修改

vim /etc/security/limits.conf


(3).max number of threads [3889] for user [syliu] is too low, increase to at least [4096]

vi /etc/security/limits.d/90-nproc.conf


vim /etc/security/limits.conf


(4).max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

修改/etc/sysctl.conf配置文件,

cat /etc/sysctl.conf | grep vm.max_map_count

vm.max_map_count=262144

如果不存在则添加

echo "vm.max_map_count=262144" >>/etc/sysctl.conf

1.6. 到此,环境配置完成,重新启动项目,项目启动成功

访问http://localhost:9200 后会显示成功提示

(1) name:elastic实例名,设置可以在config/elasticsearch.yml中配置

(2) Version:版本号,以json格式表示的一组信息。

① Name: 当前版本号

② build_snapshot:是否从源码构建而来

③ lucene_version:基于lucene的版本

1.7. 简单配置elastic集群



1. cluster.name:集群名称。设置好以后会根据同一集群名字自动发现同一网段下的节点,如果在同一网段下有多个集群,可以根据这个字段区分集群

2. Node.name:节点名称,可以自动生成节点名称,这里配置是有利于利用api访问具体的节点,建议自己配置

3. Node.master:节点是否为master主节点-----每个节点都可被配置为主节点。默认值为true,目的是指定该节点是否有资格被选举成为node。默认集群中第一台集群为master。如果这台机器出现故障,集群会自动重新选举

4. Node.data:设置节点是否存储数据,默认为true,如果不希望存储,则设置为false

客户节点配置:

Node.master:true

Node.data:false

数据节点配置:

Node.master:false

Node.data:true

5. Network.host: 绑定监听IP,提供外界访问

6. Transport.tcp.port:设置节点间交互的tcp端口

7. Discovery.zen.ping.unicast.hosts:设置集群中master节点的初始列表-通过这些节点来自动发现新加入的集群

8. discovery.zen.ping_timeout:设置集群中自动发现其他节点时ping连接超时时间-默认为3秒。对于比较差的网络环境可以加大值来防止自动发现时出错

9. client.transport.ping_timeout:客户端连接ping的最大超时时间

10. bootstrap.memory_lock:true 锁定内存,防止内存交换

11. http.port:绑定监听ip的端口号,默认9200

12. path.data:数据存放位置,最好不要放在默认安装目录下,这样卸载了会引起数据丢失,可以保存到不同的目录下,最好挂载到不同的磁盘上

配置方法如下:path.data: /path/to/data1,/path/to/data2

启动elastic会发现报错:

memory locking requested for elasticsearch process but memory is not locked

解决办法:

vim /etc/security/limits.conf

Syliu soft memlock unlimited

Syliu hard memlock unlimited

修改:

/etc/sysctl.conf

vm.swappiness=0

到此:配置完成,然后将本配置,将本配置拷贝到其他节点下,注意修改node.name.

如果配置在同一台服务器下其他节点还需要修改端口号,以免端口被占用

三.Logstash的简单配置与安装

1.1  Logstash是一个能有效进行日志处理的工具,可以对日志进行收集,分析。其本身并不产生日志,它只是一个内置分析和转换工具的日志管理工具,是一个接收,处理,转发日志的’管道’。

1.2 下载logstash

下载地址:https://www.elastic.co/downloads/logstash


下载压缩包,解压






1.3 进入bin目录下创建.conf文件作为启动文件

Logstash处理事件有三个阶段:输入Inputs,过滤Filters,输出OutPuts


具体参阅:http://udn.yyuap.com/doc/logstash-best-practice-cn/input/stdin.html 或者https://www.elastic.co/guide/en/logstash/current/input-plugins.html


1.指定file为读取文件的方式:

input {

file {

type => "guoan"

path => "F:/logs/guoanjia/guoanjia/*.log"

codec => json { charset => "GBK" }

start_position => "beginning"

}

}


type: 标记事件类型  集成java的时候需要用到。还可以根据type值做一些过滤的操作

path:为某个绝对路径文件夹下所有以.log结尾的文件为数据源

codec: 编码插件: codec 就是用来 decode、encode 事件的

指定输入到logstash的格式为json格式的,指定字符集为中文

start_position:从什么位置开始读取文件数据,默认是结束位置

把这个设定改成 "beginning",logstash 进程就从头开始读取

除此之外还有一些配置有时候需要手动配上:

discover_interval:logstash 每隔多久去检查一次被监听的 path 下是否有新文件。默认值是 15 秒

exclude:不想被监听的文件可以排除出去

stat_interval:logstash 每隔多久检查一次被监听文件状态(是否有更新),默认是 1 秒

******注意:start_position 仅在该文件从未被监听过的时候起作用。如果 sincedb 文件中已经有这个文件的 inode 记录了,那么 logstash 依然会从记录过的 pos 开始读取数据。所以重复测试的时候每回需要删除 sincedb 文件。

2. 通过TCP套接字读取事件。

input {

tcp {

host =>127.0.0.1

port => 8999

mode => "server"

ssl_enable => false

type => "guoan3"

codec => json { charset => "GBK" }

}

}


可以接受来自客户端的连接或连接到服务器,具体取决于mode。

编辑

mode

值可以是任何的:server,client

默认值为 "server"

操作模式。server监听客户端连接, client连接到服务器。

ssl_enable => false

启用SSL(必须设置其他ssl_选项才能生效)

host:

值类型是字符串

默认值为 "0.0.0.0"

当模式是server,地址要监听。当模式是client,连接到的地址

然后 需要在SpringBoot项目中加入 相应的依赖:


日志配置文件(不是SpringBoot也可以):


利用本模式进行数据的导入需要在springboot 配置文件中加入

server:

context-path: /agenthouseCutomer

port:8084

max-http-header-size: 10024

3. 利用logstash的 logstash-input-jdbc进行与mysql数据的同步

进入logstash的bin目录下安装插件

Logstash-plugin install logstash-input-jdbc

Input配置


4. 关于filter的配置

4.1 grok filter

127.0.0.1 POST /logs/getLog 12345 0.123

grok { match => {“message”=>“%{IP:client}%{WORD:method}%{URIPATHPARAM:url}%{NUMBER:count}%{NUMBER:money}”} }

可以将肮脏的非结构化日志数据解析成结构化和可查询的数据

Grok作为数据结构化工具,在logstash中默认上百个grok变量,可以直接拿来使用


适合对syslog.apache log等可读日志进行分析

4.2 kv filter

对于诸如key-value 这种键值对数据进行分析

如:user=国安1&url=111&method=main&ip=124.65.164.98&args=null

kv {

source => "message"

field_split => "&?"

}

解析出来格式

"method": "main",

ip": "124.65.164.98",

"message": "user=国安1&url=111&method=main&ip=124.65.164.98&args=null",

"url": "111",

"args": "null",

"user": "国安1"

4.3 geoip

geoip {

source => "ip"

fields => ["city_name", "country_code2", "country_name", "latitude", "longitude", "region_name"]

remove_field => ["[geoip][country_code3]", "[geoip][region_name]", "[geoip][continent_code]", "[geoip][timezone]", "[geoip][ip]"]

}

根据上面kv解析出来的ip字段进行获取详细地理信息和经纬度

响应:

"geoip": {

"city_name": "Beijing",

"latitude": 39.9289,

"country_code2": "CN",

"country_name": "China",

"longitude": 116.3883

},



5. 关于output配置

5.1 elasticsearch

elasticsearch {

hosts => "127.0.0.1:9200"

#index => "guoan88881234"

index => "guoerror-%{+YYYY.MM.dd}"

user => elastic

password => changeme

retry_on_conflict => 5

}

将logstash中数据输入到elasticsearch中:

hosts:ip加端口号,或者域名

index:代表每天以guoerror-开头生成索引

user:elasticsearch的用户名

password:代表elasticsearch的密码

retry_on_conflict:输出重试次数

5.2 email

email {

port => "25" 端口

address => "smtp.126.com" 地址

username => "lsy4723@126.com"  用户

password => "*****" 客户端授权密码 适用于登录以下服务: POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务

authentication => "plain" 固定

use_tls => false

from => "lsy4723@126.com"

subject=> "Warning: 系统出错了!%{@timestamp}-%{type}-%{logger_name}"

to => "lsy4723@163.com"

via => "smtp"

body => "%{stack_trace}"

        }

6. 启动logstash

配置完成后windons下创建 run.bat

写入logstash -f guoan.conf 启动命令

或直接命令行logstash -f guoan.conf启动

-f 参数意思 ‘文件’

作用是指定logstash配置文件

-e 参数的作用为执行  如:logstash -e ‘input{stdin{}} output{stout{}}’

除此之外,还有 -t,-l,-w,-p,-v

启动之前注意:

在config/logstash.yml中配置:

#pipeline管道线程数,官方建议是等于CPU内核数

pipeline.workers: 8

#pipeline管道实际output时的线程数,一般小于或等于管道线程数,建议等于cpu内核数

pipeline.output.workers: 8

#单个工作线程在尝试执行过滤器和输出之前收集的最大事件数,默认125;  数值越大,处理则通常更高效,但增加了内存开销; 某些硬件配置要求通过设置LS_HEAP_SIZE变量来增加JVM堆大小,以避免使用此选项导致性能下降; 此参数的值超过最佳范围会导致由于频繁的垃圾回收或与内存不足异常相关的JVM崩溃而导致性能下降; 调整pipeline.batch.size设置大小可调整发送到Elasticsearch的批量请求的大小

pipeline.batch.size: 3000

#此设置调整Logstash管道的延迟,默认5; 流水线批处理延迟是Logstash在当前管道工作线程中接收到事件后等待新消息的最大时间(毫秒); 在此时间过后,Logstash开始执行过滤器和输出.Logstash在接收事件和在过滤器中处理该事件之间等待的最大时间是pipeline.batch.delay和pipeline.batch.size设置的乘积

pipeline.batch.delay: 100

四.Head 配置

1.在elasticsearch.yml配置跨域支持

http.cors.enabled: true

http.cors.allow-origin: "*"

2. 下载 elasticsearch-head

https://github.com/mobz/elasticsearch-head

3. Npm install

Npm run start


或者去google商店搜索ElasticSearch-head插件,直接安装即可使用

我得百度网盘:https://pan.baidu.com/s/1dkA1m9XECKSfpH65-qmE3Q

下载完之后加入谷歌扩展程序即可使用

五.ElasticSearch优化建议

1.调大系统的“最大打开文件数”,建议32k甚至64k

- ulimit -a (查看)

- ulimit -n 32000(设置)

2. 修改配置文件调整es的jvm内存大小

修改bin/elasticsearch.in.sh中ES_MIN_MEM和ES_MAX_MEM的大小,建议设置一样大,避免平凡的分配内存,根据服务器内存大小配置,一般分配60%左右(默认256)

3.设置mlockall来锁定进程的物理内存地址

- 避免交换(swapped)来提高性能

-修改文件 conf/elasticsearch.yml 中 bootstrap.mlockall:true

4.分片多的话可以提升建立索引的能力,5-20个比较合适,默认5个

如果分片数过少或过多,都会导致检索比较慢。分片数过多会导致检索时打开比较多的文件,另外也会导致多台服务器之间的通讯过慢。而分片数过少会导致单个分片索引过大,所以检索速度会慢下来。建议单个分片最多储存20G左右的索引数据,所以,分片数=数据总量/20G

5.副本多的话,可以提升搜索能力,但是如果设置很多副本的话也会对服务器造成额外的压力,因为需要同步数据,所以建议设置2-3个

PUT /gakj-1 { "settings": { "number_of_shards" : 5, "number_of_replicas" : 2 } }

6.定时优化索引,segment越多,查询速度越差

max_num_segments=1

7.去掉mappings _all域,索引创建时默认会有_all域,这样会给查询带来方面,但是增加索引时间和索引尺度

- "_all":{"enabled":"false"}

8.log输出的水平默认为trace,即查询超过500ms即为慢查询,就要打印日志,造成cpu和mem,io负载很高,把log输出水平改为info,可减轻服务器的压力

-修改ES_HOME/conf/logging.yaml文件

-或修改ES_HOME/conf/elasticsearch.yaml

六.Elastic安装x-pack

安装:进入elastic 的bin下

命令:elasticsearch-plugin install x-pack

安装完成后启动elasticsearch

初始化密码:

bin/x-pack/setup-passwords auto

或者手动设置密码:

bin/x-pack/setup-passwords interactive

注意:x-pack目前部分功能是收费的,试用期是一个月,基础版需要申请,基础版免费

七.ElasticSearch学习笔记及查询语法

1.信息检索与结果过滤


通过_source 返回指定的检索字段集

2.kibana 中 sort排序不准确的问题

3.match 检索子句和_all参数的使用


匹配全部字段的检索

4.match_phrase 在指定字段中匹配特定的检索去


5.对于给定的内容,query_string查询使用查询解析器来构造实际的查询


其中^2表示包含打开门锁且其权重为2

6.prefix 找到某个字段以给定前缀开头的文档


7.range 范围查询

gte

大于或等于

gt

比...更棒

lte

小于或等于

lt

少于



8.more_like_this,fuzzy_like_this

查询得到与所提供的文本相似的文档

fields

like

9.multi_match 多字段中组合搜索


10.过滤查询


查询存在某个字段的日志

11.query_string 查询


12.cat命令

1.GET /_cat

列出所有cat命令


2.GET /_cat/health?v

检查集群健康状况


3.GET /_cat/nodes?v

节点统计


4.GET /_cat/indices

获取全部节点

13 设置最小节点,防止脑裂,避免两个主节点同时存在一个集群中

discovery.zen.minimum_master_nodes: 2

通过api修改正在运行的节点,设置最小节点



PUT /_cluster/settings

{

          "persistent" : {

                "discovery.zen.minimum_master_nodes" : 2

    }

        }

14.集群恢复方面的配置

阻止 Elasticsearch 在存在至少 8 个节点(数据节点或者 master 节点)之前进行数据恢复

gateway.recover_after_nodes: 8

配置集群中应该有多少节点,以及我们愿意为这些节点等待多长时间

gateway.expected_nodes: 10      gateway.recover_after_time: 5m

设置单播节点列表,防止节点无意加入集群

discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]

防止同一个分片(shard)的主副本存在同一个物理机上

cluster.routing.allocation.same_shard.host: true

允许 JVM 锁住内存,禁止操作系统交换出去

bootstrap.mlockall: true

15.配置elasticsearch不要去配置垃圾回收和线程池

设置堆内存

export ES_HEAP_SIZE=1g 或 ./bin/elasticsearch -Xmx1g -Xms1g


确保堆内存最小值( Xms )与最大值( Xmx )的大小是相同的,防止程序在运行时改变堆内存大小, 这是一个很耗系统资源的过程。

设置禁用内存交换 或 降低swappiness 的值

sudo swapoff -a    vm.swappiness = 1

16.查询某个字段必须包含什么,必须排除什么


17.es内置REST接口

1./index/_search 搜索指定索引下的数据

2./_aliases  获取或操作索引的别名

3./index/type/  创建或操作类型

4./index/_mapping 创建或操作mapping

5./index/_settings  创建或操作设置(number_of_shards 是不可更改的)

6./index/_open 打开指定被关闭的索引

7./index/_close 关闭指定索引

8./index/refresh  刷新索引(使新加内容对索引可见,不保证数据被写入磁盘)

9./index/_flush  刷新索引(会触发lucene提交)

18.term查询指定的精确值


19.使用 constant_score 查询以非评分模式来执行 term 查询并以一作为统一评分


内部过滤器的操作:

1.查找匹配文档

term查询在倒排索引中查找包含该term的所有文档,它描述了哪个文档会包含该 term 。匹配文档的标志位是 1

2.创建bitset(一个包含0和1的数组)

3.迭代bitset(s)

一旦为每个查询生成了 bitsets ,Elasticsearch 就会循环迭代 bitsets 从而找到满足所 有过滤条件的匹配文档的集合。执行顺序是启发式的,但一般来说先迭代稀疏的 bitset (因为它可以排除掉大量的文档)

4.增量使用计数

Elasticsearch 能够缓存非评分查询从而获取更快的访

20.bool过滤器


must

所有的语句都 必须(must) 匹配,与 AND 等价。

must_not

所有的语句都 不能(must not) 匹配,与 NOT 等价。

should

至少有一个语句要匹配,与 OR 等价。

21.terms查找多个精确值


22.创建文档索引

PUT /gakj

{

  "settings": {

    "number_of_shards": 5

  },

  "mappings": {

    "guoanjia":{

      "properties": {

        "id" :

        {

          "type" : "long",

          "store": true

         

        }, 

        "url" :

        {

          "type" : "text",

          "index" :true,

          "omit_norms": "true",

          "store": true

        }

      }

    }

  }

}

23。创建索引时添加默认过期时间

PUT my_index 


  "mappings": { 

    "my_type": { 

      "_ttl": { 

        "enabled": true, 

        "default": "5m" 

      } 

    } 

  } 


如果不添加ttl过期参数则文档默认不过期

  d


  ms(默认)

毫秒

m

分钟

24.ik分词器集成

https://github.com/medcl/elasticsearch-analysis-ik

下载后在elastic/plugins下创建ik文件夹,将下载的解压,然后根目录下所有文件拷贝进ik文件夹,重新启动服务,完成安装

PUT /mytest

{

  "mappings": {

    "iktest":{

        "properties": {

            "content": {

                "type": "text",

                "analyzer": "ik_max_word",

                "search_analyzer": "ik_max_word"

            }

        }

    }

  }

}


GET /mytest/_analyze

{

  "text":"生活总是这样,就像猫的花色远不只一种",

  "tokenizer": "ik_max_word"

}



GET /testik/ik/_search

{

  "query": {

    "match": {

      "content": "自首"

    }

  },

  "highlight" : {

        "pre_tags" : ["<tag1>", "<tag2>"],

        "post_tags" : ["</tag1>", "</tag2>"],

        "fields" : {

            "content" : {}

        }

    }

}

25.关于elastic预先定义文档结构后添入新字段会自动添加问题elastic给出明确的回答

PUT /my_index

{

    "mappings": {

        "my_type": {

            "dynamic":"strict",

            "properties": {

                "title":  { "type": "text"},

                "stash":  {

                    "type":    "object",

                    "dynamic":  true

                }

            }

        }

    }

}

默认情况下,当在文档中找到先前未见的字段时,Elasticsearch会将新字段添加到类型映射中。object 通过将dynamic参数设置为false(忽略新字段)或设置为strict(在遇到未知字段时抛出异常),可以在文档和级别禁用此行为
















Elastic+logstash+head简单介绍


一. 概述


ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。


二.ElasticSearch的安装与简单配置


1.1. 应该始终运行最新版本的 Java 虚拟机( JVM ), 除非 Elasticsearch 网站上另有说明。  Elasticsearch, 特别是 Lucene,是一个高要求的软件。Lucene 的单元测试和集成测试经常暴露出 JVM 本身的 bug。这些 bug 的范围从轻微的麻烦到严重段错误,所以,最好尽可能的使用最新版本的 JVM


1.2. 下载ElasticSearch


下载地址:https://www.elastic.co/downloads/elasticsearch



如下载最新版本请点TAR,其他版本请点击 past releases选择


1.3.  解压安装包



1.4. 目录讲解:


1. bin:包含运行ElasticSearch实例和管理插件的一些脚本


2. Config: 主要是一些设置文件,如logging,elasticsearch.yml,jvm


3. Lib:包含相关的包文件等


4. Plugins:包含相关的插件文件等


5. Logs:日志文件


6. Data:数据存放地址


1.5. 零配置启动


直接进入bin目录下,启动脚本elasticsearch


./elasticsearch


会显示如下错误:


(1).java.lang.RuntimeException: can not run elasticsearch as root


这是由于elastic之前因为root超级权限下启动引发过血案,所有强制不让在root下启动 。解决方案:


添加elastic启动用户:


useradd syliu


passwd syliu


chown -R syliu:syliu elasticsearch-6.1.3


su syliu #


然后进入bin目录下启动./elasticsearch


(2).max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]


这是由于linux下最大打开文件数量比elastic要求的打开数量少


查看系统最大打开文件数量


- ulimit -a (查看)


- ulimit -n 65536(设置)


或者:


切换到root用户修改


vim /etc/security/limits.conf



(3).max number of threads [3889] for user [syliu] is too low, increase to at least [4096]


vi /etc/security/limits.d/90-nproc.conf



vim /etc/security/limits.conf



(4).max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]


修改/etc/sysctl.conf配置文件,


cat /etc/sysctl.conf | grep vm.max_map_count


vm.max_map_count=262144


如果不存在则添加


echo "vm.max_map_count=262144" >>/etc/sysctl.conf


1.6. 到此,环境配置完成,重新启动项目,项目启动成功


访问http://localhost:9200 后会显示成功提示


(1) name:elastic实例名,设置可以在config/elasticsearch.yml中配置


(2) Version:版本号,以json格式表示的一组信息。


① Name: 当前版本号


② build_snapshot:是否从源码构建而来


③ lucene_version:基于lucene的版本


1.7. 简单配置elastic集群




1. cluster.name:集群名称。设置好以后会根据同一集群名字自动发现同一网段下的节点,如果在同一网段下有多个集群,可以根据这个字段区分集群


2. Node.name:节点名称,可以自动生成节点名称,这里配置是有利于利用api访问具体的节点,建议自己配置


3. Node.master:节点是否为master主节点-----每个节点都可被配置为主节点。默认值为true,目的是指定该节点是否有资格被选举成为node。默认集群中第一台集群为master。如果这台机器出现故障,集群会自动重新选举


4. Node.data:设置节点是否存储数据,默认为true,如果不希望存储,则设置为false


客户节点配置:


Node.master:true


Node.data:false


数据节点配置:


Node.master:false


Node.data:true


5. Network.host: 绑定监听IP,提供外界访问


6. Transport.tcp.port:设置节点间交互的tcp端口


7. Discovery.zen.ping.unicast.hosts:设置集群中master节点的初始列表-通过这些节点来自动发现新加入的集群


8. discovery.zen.ping_timeout:设置集群中自动发现其他节点时ping连接超时时间-默认为3秒。对于比较差的网络环境可以加大值来防止自动发现时出错


9. client.transport.ping_timeout:客户端连接ping的最大超时时间


10. bootstrap.memory_lock:true 锁定内存,防止内存交换


11. http.port:绑定监听ip的端口号,默认9200


12. path.data:数据存放位置,最好不要放在默认安装目录下,这样卸载了会引起数据丢失,可以保存到不同的目录下,最好挂载到不同的磁盘上


配置方法如下:path.data: /path/to/data1,/path/to/data2


启动elastic会发现报错:


memory locking requested for elasticsearch process but memory is not locked


解决办法:


vim /etc/security/limits.conf


Syliu soft memlock unlimited


Syliu hard memlock unlimited


修改:


/etc/sysctl.conf


vm.swappiness=0


到此:配置完成,然后将本配置,将本配置拷贝到其他节点下,注意修改node.name.


如果配置在同一台服务器下其他节点还需要修改端口号,以免端口被占用


三.Logstash的简单配置与安装


1.1  Logstash是一个能有效进行日志处理的工具,可以对日志进行收集,分析。其本身并不产生日志,它只是一个内置分析和转换工具的日志管理工具,是一个接收,处理,转发日志的’管道’。


1.2 下载logstash


下载地址:https://www.elastic.co/downloads/logstash



下载压缩包,解压







1.3 进入bin目录下创建.conf文件作为启动文件


Logstash处理事件有三个阶段:输入Inputs,过滤Filters,输出OutPuts



具体参阅:http://udn.yyuap.com/doc/logstash-best-practice-cn/input/stdin.html 或者https://www.elastic.co/guide/en/logstash/current/input-plugins.html



1.指定file为读取文件的方式:


input {


file {


type => "guoan"


path => "F:/logs/guoanjia/guoanjia/*.log"


codec => json { charset => "GBK" }


start_position => "beginning"


}


}



type: 标记事件类型  集成java的时候需要用到。还可以根据type值做一些过滤的操作


path:为某个绝对路径文件夹下所有以.log结尾的文件为数据源


codec: 编码插件: codec 就是用来 decode、encode 事件的


指定输入到logstash的格式为json格式的,指定字符集为中文


start_position:从什么位置开始读取文件数据,默认是结束位置


把这个设定改成 "beginning",logstash 进程就从头开始读取


除此之外还有一些配置有时候需要手动配上:


discover_interval:logstash 每隔多久去检查一次被监听的 path 下是否有新文件。默认值是 15 秒


exclude:不想被监听的文件可以排除出去


stat_interval:logstash 每隔多久检查一次被监听文件状态(是否有更新),默认是 1 秒


******注意:start_position 仅在该文件从未被监听过的时候起作用。如果 sincedb 文件中已经有这个文件的 inode 记录了,那么 logstash 依然会从记录过的 pos 开始读取数据。所以重复测试的时候每回需要删除 sincedb 文件。


2. 通过TCP套接字读取事件。


input {


tcp {


host =>127.0.0.1


port => 8999


mode => "server"


ssl_enable => false


type => "guoan3"


codec => json { charset => "GBK" }


}


}



可以接受来自客户端的连接或连接到服务器,具体取决于mode。


编辑


mode


值可以是任何的:server,client


默认值为 "server"


操作模式。server监听客户端连接, client连接到服务器。


ssl_enable => false


启用SSL(必须设置其他ssl_选项才能生效)


host:


值类型是字符串


默认值为 "0.0.0.0"


当模式是server,地址要监听。当模式是client,连接到的地址


然后 需要在SpringBoot项目中加入 相应的依赖:



日志配置文件(不是SpringBoot也可以):



利用本模式进行数据的导入需要在springboot 配置文件中加入


server:


context-path: /agenthouseCutomer


port:8084


max-http-header-size: 10024


3. 利用logstash的 logstash-input-jdbc进行与mysql数据的同步


进入logstash的bin目录下安装插件


Logstash-plugin install logstash-input-jdbc


Input配置



4. 关于filter的配置


4.1 grok filter


127.0.0.1 POST /logs/getLog 12345 0.123


grok { match => {“message”=>“%{IP:client}%{WORD:method}%{URIPATHPARAM:url}%{NUMBER:count}%{NUMBER:money}”} }


可以将肮脏的非结构化日志数据解析成结构化和可查询的数据


Grok作为数据结构化工具,在logstash中默认上百个grok变量,可以直接拿来使用



适合对syslog.apache log等可读日志进行分析


4.2 kv filter


对于诸如key-value 这种键值对数据进行分析


如:user=国安1&url=111&method=main&ip=124.65.164.98&args=null


kv {


source => "message"


field_split => "&?"


}


解析出来格式


"method": "main",


ip": "124.65.164.98",


"message": "user=国安1&url=111&method=main&ip=124.65.164.98&args=null",


"url": "111",


"args": "null",


"user": "国安1"


4.3 geoip


geoip {


source => "ip"


fields => ["city_name", "country_code2", "country_name", "latitude", "longitude", "region_name"]


remove_field => ["[geoip][country_code3]", "[geoip][region_name]", "[geoip][continent_code]", "[geoip][timezone]", "[geoip][ip]"]


}


根据上面kv解析出来的ip字段进行获取详细地理信息和经纬度


响应:


"geoip": {


"city_name": "Beijing",


"latitude": 39.9289,


"country_code2": "CN",


"country_name": "China",


"longitude": 116.3883


},




5. 关于output配置


5.1 elasticsearch


elasticsearch {


hosts => "127.0.0.1:9200"


#index => "guoan88881234"


index => "guoerror-%{+YYYY.MM.dd}"


user => elastic


password => changeme


retry_on_conflict => 5


}


将logstash中数据输入到elasticsearch中:


hosts:ip加端口号,或者域名


index:代表每天以guoerror-开头生成索引


user:elasticsearch的用户名


password:代表elasticsearch的密码


retry_on_conflict:输出重试次数


5.2 email


email {


port => "25" 端口


address => "smtp.126.com" 地址


username => "lsy4723@126.com"  用户


password => "*****" 客户端授权密码 适用于登录以下服务: POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务


authentication => "plain" 固定


use_tls => false


from => "lsy4723@126.com"


subject=> "Warning: 系统出错了!%{@timestamp}-%{type}-%{logger_name}"


to => "lsy4723@163.com"


via => "smtp"


body => "%{stack_trace}"


        }


6. 启动logstash


配置完成后windons下创建 run.bat


写入logstash -f guoan.conf 启动命令


或直接命令行logstash -f guoan.conf启动


-f 参数意思 ‘文件’


作用是指定logstash配置文件


-e 参数的作用为执行  如:logstash -e ‘input{stdin{}} output{stout{}}’


除此之外,还有 -t,-l,-w,-p,-v


启动之前注意:


在config/logstash.yml中配置:


#pipeline管道线程数,官方建议是等于CPU内核数


pipeline.workers: 8


#pipeline管道实际output时的线程数,一般小于或等于管道线程数,建议等于cpu内核数


pipeline.output.workers: 8


#单个工作线程在尝试执行过滤器和输出之前收集的最大事件数,默认125;  数值越大,处理则通常更高效,但增加了内存开销; 某些硬件配置要求通过设置LS_HEAP_SIZE变量来增加JVM堆大小,以避免使用此选项导致性能下降; 此参数的值超过最佳范围会导致由于频繁的垃圾回收或与内存不足异常相关的JVM崩溃而导致性能下降; 调整pipeline.batch.size设置大小可调整发送到Elasticsearch的批量请求的大小


pipeline.batch.size: 3000


#此设置调整Logstash管道的延迟,默认5; 流水线批处理延迟是Logstash在当前管道工作线程中接收到事件后等待新消息的最大时间(毫秒); 在此时间过后,Logstash开始执行过滤器和输出.Logstash在接收事件和在过滤器中处理该事件之间等待的最大时间是pipeline.batch.delay和pipeline.batch.size设置的乘积


pipeline.batch.delay: 100


四.Head 配置


1.在elasticsearch.yml配置跨域支持


http.cors.enabled: true


http.cors.allow-origin: "*"


2. 下载 elasticsearch-head


https://github.com/mobz/elasticsearch-head


3. Npm install


Npm run start



或者去google商店搜索ElasticSearch-head插件,直接安装即可使用


我得百度网盘:https://pan.baidu.com/s/1dkA1m9XECKSfpH65-qmE3Q


下载完之后加入谷歌扩展程序即可使用


五.ElasticSearch优化建议


1.调大系统的“最大打开文件数”,建议32k甚至64k


- ulimit -a (查看)


- ulimit -n 32000(设置)


2. 修改配置文件调整es的jvm内存大小


修改bin/elasticsearch.in.sh中ES_MIN_MEM和ES_MAX_MEM的大小,建议设置一样大,避免平凡的分配内存,根据服务器内存大小配置,一般分配60%左右(默认256)


3.设置mlockall来锁定进程的物理内存地址


- 避免交换(swapped)来提高性能


-修改文件 conf/elasticsearch.yml 中 bootstrap.mlockall:true


4.分片多的话可以提升建立索引的能力,5-20个比较合适,默认5个


如果分片数过少或过多,都会导致检索比较慢。分片数过多会导致检索时打开比较多的文件,另外也会导致多台服务器之间的通讯过慢。而分片数过少会导致单个分片索引过大,所以检索速度会慢下来。建议单个分片最多储存20G左右的索引数据,所以,分片数=数据总量/20G


5.副本多的话,可以提升搜索能力,但是如果设置很多副本的话也会对服务器造成额外的压力,因为需要同步数据,所以建议设置2-3个


PUT /gakj-1 { "settings": { "number_of_shards" : 5, "number_of_replicas" : 2 } }


6.定时优化索引,segment越多,查询速度越差


max_num_segments=1


7.去掉mappings _all域,索引创建时默认会有_all域,这样会给查询带来方面,但是增加索引时间和索引尺度


- "_all":{"enabled":"false"}


8.log输出的水平默认为trace,即查询超过500ms即为慢查询,就要打印日志,造成cpu和mem,io负载很高,把log输出水平改为info,可减轻服务器的压力


-修改ES_HOME/conf/logging.yaml文件


-或修改ES_HOME/conf/elasticsearch.yaml


六.Elastic安装x-pack


安装:进入elastic 的bin下


命令:elasticsearch-plugin install x-pack


安装完成后启动elasticsearch


初始化密码:


bin/x-pack/setup-passwords auto


或者手动设置密码:


bin/x-pack/setup-passwords interactive


注意:x-pack目前部分功能是收费的,试用期是一个月,基础版需要申请,基础版免费


七.ElasticSearch学习笔记及查询语法


1.信息检索与结果过滤



通过_source 返回指定的检索字段集


2.kibana 中 sort排序不准确的问题


3.match 检索子句和_all参数的使用



匹配全部字段的检索


4.match_phrase 在指定字段中匹配特定的检索去



5.对于给定的内容,query_string查询使用查询解析器来构造实际的查询



其中^2表示包含打开门锁且其权重为2


6.prefix 找到某个字段以给定前缀开头的文档



7.range 范围查询


gte


大于或等于


gt


比...更棒


lte


小于或等于


lt


少于




8.more_like_this,fuzzy_like_this


查询得到与所提供的文本相似的文档


fields


like


9.multi_match 多字段中组合搜索



10.过滤查询



查询存在某个字段的日志


11.query_string 查询



12.cat命令


1.GET /_cat


列出所有cat命令



2.GET /_cat/health?v


检查集群健康状况



3.GET /_cat/nodes?v


节点统计



4.GET /_cat/indices


获取全部节点


13 设置最小节点,防止脑裂,避免两个主节点同时存在一个集群中


discovery.zen.minimum_master_nodes: 2


通过api修改正在运行的节点,设置最小节点




PUT /_cluster/settings


{


          "persistent" : {


                "discovery.zen.minimum_master_nodes" : 2


    }


        }


14.集群恢复方面的配置


阻止 Elasticsearch 在存在至少 8 个节点(数据节点或者 master 节点)之前进行数据恢复


gateway.recover_after_nodes: 8


配置集群中应该有多少节点,以及我们愿意为这些节点等待多长时间


gateway.expected_nodes: 10      gateway.recover_after_time: 5m


设置单播节点列表,防止节点无意加入集群


discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]


防止同一个分片(shard)的主副本存在同一个物理机上


cluster.routing.allocation.same_shard.host: true


允许 JVM 锁住内存,禁止操作系统交换出去


bootstrap.mlockall: true


15.配置elasticsearch不要去配置垃圾回收和线程池


设置堆内存


export ES_HEAP_SIZE=1g 或 ./bin/elasticsearch -Xmx1g -Xms1g



确保堆内存最小值( Xms )与最大值( Xmx )的大小是相同的,防止程序在运行时改变堆内存大小, 这是一个很耗系统资源的过程。


设置禁用内存交换 或 降低swappiness 的值


sudo swapoff -a    vm.swappiness = 1


16.查询某个字段必须包含什么,必须排除什么



17.es内置REST接口


1./index/_search 搜索指定索引下的数据


2./_aliases  获取或操作索引的别名


3./index/type/  创建或操作类型


4./index/_mapping 创建或操作mapping


5./index/_settings  创建或操作设置(number_of_shards 是不可更改的)


6./index/_open 打开指定被关闭的索引


7./index/_close 关闭指定索引


8./index/refresh  刷新索引(使新加内容对索引可见,不保证数据被写入磁盘)


9./index/_flush  刷新索引(会触发lucene提交)


18.term查询指定的精确值



19.使用 constant_score 查询以非评分模式来执行 term 查询并以一作为统一评分



内部过滤器的操作:


1.查找匹配文档


term查询在倒排索引中查找包含该term的所有文档,它描述了哪个文档会包含该 term 。匹配文档的标志位是 1


2.创建bitset(一个包含0和1的数组)


3.迭代bitset(s)


一旦为每个查询生成了 bitsets ,Elasticsearch 就会循环迭代 bitsets 从而找到满足所 有过滤条件的匹配文档的集合。执行顺序是启发式的,但一般来说先迭代稀疏的 bitset (因为它可以排除掉大量的文档)


4.增量使用计数


Elasticsearch 能够缓存非评分查询从而获取更快的访


20.bool过滤器



must


所有的语句都 必须(must) 匹配,与 AND 等价。


must_not


所有的语句都 不能(must not) 匹配,与 NOT 等价。


should


至少有一个语句要匹配,与 OR 等价。


21.terms查找多个精确值



22.创建文档索引


PUT /gakj


{


  "settings": {


    "number_of_shards": 5


  },


  "mappings": {


    "guoanjia":{


      "properties": {


        "id" :


        {


          "type" : "long",


          "store": true


         


        }, 


        "url" :


        {


          "type" : "text",


          "index" :true,


          "omit_norms": "true",


          "store": true


        }


      }


    }


  }


}


23。创建索引时添加默认过期时间


PUT my_index 



  "mappings": { 


    "my_type": { 


      "_ttl": { 


        "enabled": true, 


        "default": "5m" 


      } 


    } 


  } 



如果不添加ttl过期参数则文档默认不过期


  d



  ms(默认)


毫秒


m


分钟


24.ik分词器集成


https://github.com/medcl/elasticsearch-analysis-ik


下载后在elastic/plugins下创建ik文件夹,将下载的解压,然后根目录下所有文件拷贝进ik文件夹,重新启动服务,完成安装


PUT /mytest


{


  "mappings": {


    "iktest":{


        "properties": {


            "content": {


                "type": "text",


                "analyzer": "ik_max_word",


                "search_analyzer": "ik_max_word"


            }


        }


    }


  }


}



GET /mytest/_analyze


{


  "text":"生活总是这样,就像猫的花色远不只一种",


  "tokenizer": "ik_max_word"


}




GET /testik/ik/_search


{


  "query": {


    "match": {


      "content": "自首"


    }


  },


  "highlight" : {


        "pre_tags" : ["<tag1>", "<tag2>"],


        "post_tags" : ["</tag1>", "</tag2>"],


        "fields" : {


            "content" : {}


        }


    }


}


25.关于elastic预先定义文档结构后添入新字段会自动添加问题elastic给出明确的回答


PUT /my_index


{


    "mappings": {


        "my_type": {


            "dynamic":"strict",


            "properties": {


                "title":  { "type": "text"},


                "stash":  {


                    "type":    "object",


                    "dynamic":  true


                }


            }


        }


    }


}


默认情况下,当在文档中找到先前未见的字段时,Elasticsearch会将新字段添加到类型映射中。object 通过将dynamic参数设置为false(忽略新字段)或设置为strict(在遇到未知字段时抛出异常),可以在文档和级别禁用此行为

















©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容