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: 主要是一些设置文件,如loggingelasticsearch.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_locktrue 锁定内存,防止内存交换

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. 利用logstashlogstash-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.delaypipeline.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. 修改配置文件调整esjvm内存大小

修改bin/elasticsearch.in.shES_MIN_MEMES_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即为慢查询,就要打印日志,造成cpumem,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(一个包含01的数组)
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(在遇到未知字段时抛出异常),可以在文档和级别禁用此行为

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐