ELK(elasticsearch+logstash+redis+kibana)

一、环境搭建

软件版本:

Linux:centos7 64bit

JDK:1.8.0

elasticsearch:elasticsearch-5.3.0

logstash:logstash-5.3.1sys

redis:redis-3.2.3

kibana:kibana-5.3.0

二、软件安装与配置

1.1配置JDK:

下载JDK,解压/data即可。

[root@localhost data]# vim /etc/profile.d/java.sh

export JAVA_HOME=/data/jdk1.8.0_121

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export PATH=$JAVA_HOME/bin:$PATH

1.2.加载JDK环境变量:

[root@localhost data]# source /etc/profile.d/java.sh

到此,JDK完毕。

2.1安装配置elasticsearch:

直接tar解压即可

[root@elk data]# tar xf elasticsearch-5.3.0.tar.gz

2.2配置elasticsearch:

[root@elk config]# vim /data/elasticsearch-5.3.0/config/elasticsearch.yml

一般使用集群配置:

cluster.name: estest

#注释:集群的名字

node.name: node-1

#注释:节点名称

network.host: 192.168.75.141

#注释:本机的iP地址

http.port: 9200

#注释:监听的端口号

path.data: /data/elasticsearch-5.3.0/data

#注释:数据存放位置,可以根据实际情况修改存放目录

path.logs: /data/elasticsearch-5.3.0/logs

#注释:日志存放目录

discovery.zen.minimum_master_nodes: 1

#注释:设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)

gateway.recover_after_nodes: 1

设置集群中N个节点启动时进行数据恢复,默认为1。

discovery.zen.ping.unicast.hosts: ["192.168.75.141", "192.168.75.142","192.168.75.143"]

#注释:用来ping或者数据传输,这里如果加上端口那么必须是9300,而不是监听端口9200,切记!

其他两台elasticsearch基本跟上面相同:

注意的是:

node.name: node-2/3

#注释:节点名称不能一样

network.host: 192.168.75.142/143

#注释:本机的iP地址也不能一样

到此三台elasticsearch搜索集群配置完成。

启动:

elasticsearch不支持root启动,

添加一个es账户

[root@elk ~]# useradd es

接着守护进程启动:

[root@elk ~]# su - es -c "/data/elasticsearch-5.3.0/bin/elasticsearch &"

启动会报错,连接数:

[2017-05-02T08:54:12,704][WARN ][o.e.b.BootstrapChecks    ] [RExnWpW] max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]

修改连接数:

[root@elk ~]# vim /etc/security/limits.conf

添加下面内容:

* soft nofile 65536

* hard nofile 131072

* soft nproc 2048

* hard nproc 4096

重新启动即可。


安装x-pack 结合之后kibana使用:

[root@elk ~]# cd /data/elasticsearch-5.3.0/bin/

[root@elk bin]# ./elasticsearch-plugin install x-pack

重启elasticsearch即可


三、elasticsearch知识点:

elasticsearch搭建相对简单容易,但是知识点是非常多,尤其是搜索部分,内容量比较大。


3.1 基本组件:

索引(index):文档容器,索引是具有类似属性的文档的集合,类似于表,索引名必须使用小写字母,全小写字符

类型(type):类型是索引内部的逻辑分区,其意义完全取决于用户需求,一个索引内部可定义一个或多个类型。一般来说,类型就是拥有相同的域的文档的预定义

文档(document)文档是Lucene索引和搜索的原子单位,它包含了一个或多个域,是域的容器,基于JSON格式表示,每个域的组成部分,一个名字,一个或多个值,拥有多个值的域,通常成为多值域

映射(mapping):原始内容存储为文档之前需要事先进行分析,例如:切词,过滤掉某些词等,映射用于定义此分析机制该如何实现。除此之外,ES还为映射提供了诸如将域中的内容排序等功能

3.2 ES的集群组件:

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

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

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

shard有两种类型:primary shard(主shard)和replica shard(副本shard)

replica用于数据冗余及查询时的负载均衡,每个主shard的副本数量可自定义,且可动态修改

3.3 ES cluster工作过程:

启动时,通过单播播(默认)或单播方式在9300/tcp查找同一集群中的其他节点,并与之建立通信。

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

集群有状态,green(正常状态),red(严重的状态),yellow(不健康的状态)

3.4 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:请求的主体

查看实例:

[root@localhost ~]# curl -X GET 'http://192.168.75.129:9200/?pretty'

使用API可以查看cat

[root@localhost ~]# curl -X GET 'http://192.168.75.136:9200/_cat'

查看全信息,需要后面加?v

[root@localhost ~]# curl -X GET 'http://192.168.75.136:9200/_cat/nodes?v'

还可以加help获取帮助:

[root@localhost ~]# curl -X GET 'http://192.168.75.136:9200/_cat/nodes?help'

自定义显示

[root@localhost ~]# curl -X GET 'http://192.168.75.136:9200/_cat/nodes?h=name,ip,port,uptime,heap.current'

node-3 192.168.75.136 9300  1.1h  97.4mb

node-1 192.168.75.129 9300 32.7m 140.4mb

查看健康状态:

[root@localhost ~]# curl -X GET 'http://192.168.75.136:9200/_cat/health'

1492355100 11:05:00 testes green 2 2 0 0 0 0 0 0 - 100.0%

集群_cluster

查看集群可以使用_cluster

[root@localhost ~]# curl -X GET 'http://192.168.75.129:9200/_cluster/health?pretty=ture'

如果要查看详细的易读格式,因为level和pretty都是参数,所以要用&

[root@localhost ~]# curl -X GET 'http://192.168.75.129:9200/_cluster/health?level=cluster&pretty'

查看集群节点主节点:

[root@localhost ~]# curl -XGET 'http://192.168.75.129:9200/_cluster/state/master_node?pretty'

查看集群节点:

[root@localhost ~]# curl -XGET 'http://192.168.75.129:9200/_cluster/state/nodes?pretty'

查看集群数据信息:

[root@localhost ~]# curl -XGET 'http://192.168.75.129:9200/_cluster/stats?human&pretty'

查看节点数据信息:

[root@localhost ~]# curl -XGET 'http://192.168.75.129:9200/_nodes?pretty'

插入索引数据:

[root@localhost ~]# curl -XPUT '192.168.75.139:9200/testlog/class1/2?pretty' -d '

> {

>  "first_name": "san",

>  "last_name": "zhang",

>  "gender": "female",

>  "age": 23,

>  "courses": "zhongguogongfu"

> }'

列出索引数据:

[root@localhost ~]# curl -XGET 'http://192.168.75.139:9200/students/class1/1?pretty'

更新文档:

1.PUT方法会覆盖原有文档

2.使用_update API

POST方法提交表单:

[root@localhost ~]# curl -XPOST 'http://192.168.75.139:9200/students/class1/2/_update?pretty' -d '

{

"doc": { "age": 100 }

}'

删除文档:

DELETE

[root@localhost ~]# curl -XDELETE '192.168.75.139:9200/students/class1/2?pretty'

{

"found" : true,

"_index" : "students",

"_type" : "class1",

"_id" : "2",

"_version" : 6,

"result" : "deleted",

"_shards" : {

"total" : 2,

"successful" : 1,

"failed" : 0

}

}

删除索引:

首先查看索引:

[root@localhost ~]# curl -XGET 'http://192.168.75.139:9200/_cat/indices?v'

删除:不可逆

[root@localhost ~]# curl -XDELETE 'http://192.168.75.139:9200/students'

{"acknowledged":true}

查询数据:

query API:

query DSL:查询语言,JSON based语言

用于实现诸多类型的查询操作。比如。simple term query

ES的查询操作执行分为两个阶段:

分散阶段:

合并阶段:

查询方式:

向ES发起查询请求的方式有两种:

1、通过restful request API查询,也称为query string;

2、通过发送REST request body进行

简单的全量查询:

[root@localhost ~]# curl -XGET '192.168.75.139:9200/students/_search?pretty'

不常用:

[root@localhost ~]# curl -XGET '192.168.75.139:9200/students/_search?pretty' -d '

> {

>  "query": { "match_all": {} }#说明:query是固定格式,match_all匹配所有内容

> }‘’

多索引,多类型查询:

所有索引查询:

/_search 查询所有索引

[root@localhost ~]# curl -XGET '192.168.75.139:9200/_search?pretty'

单索引查询,指定索引查询:

/INDEX_NAME/_search:单索引查询

[root@localhost ~]# curl -XGET '192.168.75.139:9200/students/_search?pretty'

多索引查询:

/INDEX1,INDEX2/_search 多索引查询

通配符查询:

/s*,t*/_search    以s开头和t开头的索引查询

/students/class1/_search :单类型搜索

/students/class1,class2/_search:多类型搜索

mapping和analysis:

ES:对每一个文档,会取得其所有域的所有值,生成一个名为“_all”的域;执行查询时,如果在query_string未指定查询的域,则在_all域上执行查询操作

GET /_search?q='xianglong'

GET /_search?q='xiangong%20shiba%20zhang'

GET /_search?q=courses:'xiangling%20shiba%20zhang'

GET /_search?q=courses:'xianglong'

前两个表示在_all域搜索,

后两个表示在指定域上搜索:需要做精确匹配

[root@localhost ~]# curl -XGET 'http://192.168.75.139:9200/students/_search?q="xianglong"&pretty'

注意:空格需要转义,使用%20即可

[root@localhost ~]# curl -XGET 'http://192.168.75.139:9200/students/_search?q="shiba%20zhang"&pretty'

[root@localhost ~]# curl -XGET 'http://192.168.75.139:9200/students/_search?q=name:"xiao"&pretty'

courses

[root@localhost ~]# curl -XGET 'http://192.168.75.139:9200/students/_search?q=courses"xianglong"&pretty'

数据类型:string,numbers,boolean,dates

查看指定类型的mapping实例:

[root@localhost ~]# curl 'http://192.168.75.139:9200/students/_mapping/class1?pretty'

{

"students" : {

"mappings" : {

"class1" : {

"properties" : {

"age" : {

"type" : "long"

},

"courses" : {

"type" : "text",

"fields" : {

"keyword" : {

"type" : "keyword",

"ignore_above" : 256

}

}

},

ES中搜索的数据广义上可被理解为两类:

types:exact

full-text

精确值:指未经加工的原始值,在搜索时进行精确匹配

full-text:用于引用文本中数据,判断文档在多大程度上匹配查询请求、即文档与用户请求查询的相关度

为了完成full-text搜索,ES必须首先分析文本,并创建出倒排索引,倒排索引中的数据还需进行“正规化”为标准格式

分词

正规化

即分析

分析需要由分析器进行:analyzer

分析器由三个组件构成,字符过滤器,分词器,分词过滤器

ES内置分析器:

standard analyzer

simple analyzer

whitespace analyzer

language analyzer

分析器不仅在创建索引时用到:在构询建查时也会用到;

query DSL:

request body

分为两类:

query dsl:执行full-text查询时,基于相关度来评判其匹配结果,查询执行过程复杂,且不会被缓存

filter dsl:执行exact查询时,基于其结果为“yes”或“no”进行评判,速度快,且结果缓存

filter dsl:

trem filter:精确匹配包含指定term的文档

实例:{ “term”: {}}

[root@localhost ~]# curl -XGET 'http://192.168.75.139:9200/students/_search?pretty' -d '

{

"query": {

"term": {

"name": "lai"

}

}

}'

range filters:用于在指定的范围内查找数值或时间

[root@localhost ~]# curl -XGET 'http://192.168.75.139:9200/students/_search?pretty' -d '

{

"query": {

"range": {

"age": {

"gte": 25

}

}

}

}'

exists and missing filters:判断存在和不存在

boolean filter:

基于boolean的逻辑来合并多个filter子句

must: 其内部所有子句条件必须同事匹配,即and

must: {

“term”: { “age”: 25}

"term": { "gender": "female" }

must_not:其所有子句必须不匹配,即not

must_nor: {

"term": { "age": 25 }

}

should:至少有一个子句匹配,即or

should: {

“term”: {  "age": 25 }

"term": { "gender": "female" }

query DSL:

match_all query:

用于匹配所有文档,没有指定任何query,默认即为match_all query

{ "match_all": {} }

match query:

在几乎任何域上执行full-text或exact-value查询

如果执行full-text查询,首先对查询时的语句做分析

{ “match”: { “students”: guo}}

如果执行exact-value查询,搜索精确值,此时,建议使用过滤,而非查询

[root@localhost ~]# curl -XGET 'http://192.168.75.139:9200/students/_search?pretty' -d '

> {

>  "query": {

>  "match": { "name": "lai" }

> }

> }'

multi_match Query:

用于在多个域上执行相同的查询:

“multi_match”:

"query": full-text search

"field": {'field1','field2' }

{

"multi_match":

"query": {

"students": "guo"

}

"field":

{

"name",

"description"

}

}

bool query:

基于boolean 逻辑合并多个查询语句,与bool filter不太的是,查询子句不是返回“yes”或“no”,而是其计算出的匹配度分值,因此,boolean query 会为各子句合并其score

must:

must_not

should

合并filter和query:

“filterd”: {

query: { "match": { "gender": "female" }}

filter: { "term": { "age": 25}}

查询语句语法检查:

GET /INDEX/_validate/query?pretty

{

.....

}

GET /INDEX/_validate/query?explain&pretty

{

[root@localhost ~]# curl -XGET 'http://192.168.75.139:9200/students/_validate/query?explain&pretty' -d '

{

"query": {

>  "term": { "age": 25 }

> }

> }'

{

"valid" : true,

"_shards" : {

"total" : 1,

"successful" : 1,

"failed" : 0

},

"explanations" : [

{

"index" : "students",

"valid" : true,

"explanation" : "age:[25 TO 25]"

}

]

}


总结:elasticsearch内容比较多,相对较难的就是搜索部分。

四、logstash安装与配置:

logstash采用server和agent,安装全部都一样

4.1下载logstash-5.3.1.tar.gz压缩包

4.2直接解压即可

[root@elk data]# tar xf logstash-5.3.1.tar.gz

4.3启动:

[root@elk ~]# /data/logstash-5.3.1/bin/logstash -f /data/redis.conf -t

#注释:-f 加载配置grok配置文件,-t为测试grok语法

测试OK

做为守护进程启动:

[root@elk ~]# /data/logstash-5.3.1/bin/logstash -f /data/redis.conf &


注意:agent端采集数据输出至redis,redis做为消息队列使用

[root@elk ~]# vim /data/redis.conf

input {

file {

path  => ["/var/log/httpd/access_log"]

#注释:标准输入文件为http日志文件

type  => "httpdlog"

start_position => "beginning"

}

}

filter {

grok {

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

#注释:使用grok的apache log格式

}

}

output {

redis {

port  => "6379"

host  => ["127.0.0.1"]

#注释:输出至本机的redis

data_type      => "list"

key    => "logstash-%{type}"

}

}

现在开始server端logstash

安装过程同上:

配置文件需要另行编写:

[root@localhost ~]# vim /data/input.conf

input {

redis {

port => "6379"

host => ["192.168.75.141"]

data_type => "list"

key => "logstash-httpdlog"

}

}

output {

elasticsearch {

hosts => ["http://192.168.75.141:9200"]

index => "logstash"

user  => "elasticsearch"

}

}

到此,logstash已经全部完成

五、kibana安装配置

5.1下载kibana包kibana-5.3.0-linux-x86_64.tar.gz

5.2解压:

[root@localhost data]# tar xf kibana-5.3.0-linux-x86_64.tar.gz

5.3安装x-pack:

[root@localhost bin]# ./kibana-plugin install x-pack

但是由于直接安装下载太慢

可以用迅雷下载完成之后,直接安装即可

[root@localhost bin]# ./kibana-plugin install x-pack-5.3.0.zip

重启kibana

5.4kibana配置文件

[root@localhost config]# cd /data/kibana-5.3.0-linux-x86_64/config/

[root@localhost config]# grep -v "^#" kibana.yml |grep -v "^$"

server.port: 5601

server.host: "192.168.75.142"

elasticsearch.url: "http://192.168.75.141:9200"

elasticsearch.username: "elastic"

elasticsearch.password: "changeme"

5.5启动kibana即可

浏览器输入http://192.168.75.142:5601

账户:elastic
密码:changeme


login.jpg


推荐阅读更多精彩内容

  • 本人陆陆续续接触了ELK的1.4,2.0,2.4,5.0,5.2版本,可以说前面使用当中一直没有太多感触,最近使用...
    三杯水Plus阅读 2,963评论 0 12
  • 基础概念 Elasticsearch有几个核心概念,从一开始理解这些概念会对整个学习过程有莫大的帮助。 接近实时(...
    山天大畜阅读 1,009评论 0 5
  • 介绍 elasticsearch是一个高效的、可扩展的全文搜索引擎 基本概念 Near Realtime(NRT)...
    imsilence阅读 389评论 0 0
  • 介绍查询语言 Elasticsearch提供一种JSON风格的特定领域语言,利用它你可以执行查询。这杯称为查询DS...
    山天大畜阅读 925评论 0 1
  • “我要 你在我身旁” “我要 你为我梳妆” 我要你在我身边 有的时候想一个人躲起来 只有你和我 在这世外桃源 没有...
    川__阅读 47评论 0 0