一、环境搭建
软件版本:
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