ELK: ElasticSearch + Logstash + Kibana
ELK 是一套日志、数据收集,存储,查询与展示的解决方案。
包括三个主要的软件。
可以理解为数据的搬运工,负责数据的采集,并传输给下一级(ElasticSearch)。
从使用端来看,Logstash 的工作流分为 Input
,Filter
,Output
三个部分。
Logstash 的三个步骤都提供了丰富的插件,满足多种业务场景的需求。
e.g. Input plugins | Logstash Reference [6.3] | Elastic
ES 是 ELK 系统的核心,负责数据的存储和搜索。其搜索基于 Lucene 实现,在使用中,可以 lucene 的搜索语法。 其主要特点是分布式,可以管理多个集群。 可对外提供 RESTful 风格的接口。
官方文档 : Elasticsearch: RESTful, Distributed Search & Analytics | Elastic
Kibana 为数据的数据的查询和展示提供了方便的操作接口,并有丰富的可视化组件、看板等。能够跟直观地查看数据。
ELK 基本结构图
这里的所有的内容都是分布式的。
参考阅读:
1、Lucene
Apache下面的一个开源项目,高性能的、可扩展的工具库,提供搜索的基本架构; 如果开发人员需用使用的话,需用自己进行开发,成本比较大,但是性能高。
2、solr
Solr基于Lucene的全文搜索框架,提供了比Lucene更为丰富的功能, 同时实现了可配置、可扩展并对查询性能进行了优化 建立索引时,搜索效率下降,实时索引搜索效率不高 数据量的增加,Solr的搜索效率会变得更低,适合小的搜索应用,对应java客户端的是solrj。
3、elasticSearch
基于Lucene的搜索框架, 它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口 上手容易,拓展节点方便,可用于存储和检索海量数据,接近实时搜索,海量数据量增加,搜索响应性能几乎不受影响; 分布式搜索框架,自动发现节点,副本机制,保障可用性。 主要特点:对分布式支持很好。
在ElasticSearch中,文档归属于一种类型(type),而这些类型存在于索引(index)中, 索引名称必须是小写。
类比于关系型数据库,其关系如下
存储类型 | 数据库-索引 | 表-类型 | 数据行-文档 | 数据列-字段 |
---|---|---|---|---|
Relational DB | Database | Table | Row | Column |
Elasticsearch | Index | Type | Document | Field |
以上类比可以方便地理解 ES 中的概念,但还是有区别的。
主要区别是:
关系型数据库的存储是基于表的,扁平化的存储,如一个 Person 对象中,有 ContactInfo 这个对象,ContactInfo 包含多个字段,如地址,邮编,邮箱,电话等等。
在关系型数据库中,通常会使用两张表来存储 Person 和 ContactInfo 信息,之间通过 ID 关联。
而在 ES 中,支持非结构化存储,一个 Person 对象的数据(在关系型数据库中称为一条记录,或者一行,在 ES 中称为一条文档),就是这个完整的记录,不需要另外一个 ContactInfo 表,具体的,ES 使用 json 表示这样一条数据(一个文档)。
e.g.
{ "name":"zhangsan", "contactInfo": { "Email":"abx123@xyz.com", }}
问题:数据量特大,没有足够大的硬盘空间来一次性存储,且一次性搜索那么多的数据,响应跟不上。
ES 提供把数据进行分片存储,这样方便进行拓展和提高吞吐。
分片的拷贝,当主分片不可用的时候,副本就充当主分片进行使用。
Elasticsearch 中的每个索引分配5个主分片和1个副本(1个副本:5个分片的拷贝),即10个分片。
curl 指令:模拟 http 请求
Terminal window
curl-X 指定http的请求方法 有HEAD GET POST PUT DELETE-d 指定要传输的数据-H 指定http请求头信息
ElasticSearch 中使用 curl 的格式:
Terminal window
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
curl -XPUT ‘localhost:9201/blog_test?pretty’
curl -XPUT ‘localhost:9201/blog?pretty’
以上指令是新建一个 blog_test 和 blog 的索引,并将返回结构美化输出(格式化一下)。
curl -XDELETE ‘localhost:9200/blog_test?pretty’
删除 blog_test 这条索引。
Terminal window
curl -XPUT -H "Content-Type: application/json" 'localhost:9201/blog/article/1?pretty' -d '{ "title" : "Blog Title", "content" : "Blog Content", "Article" : "Xiaoming"}'
新增一条记录,使用 -H
指定 HTTP 请求头,-d
指定要传输的数据。 这句的意思是:在 blog 索引下,增加一条类型为 article 的数据,改数据的 id 为 1。
curl -XGET ‘localhost:9200/blog/article/1’ curl -XGET ‘localhost:9200/blog/article/1?pretty’(美化推荐)
查询 blog 索引下,article 类型中,id 为 1 的文档。
Terminal window
curl -XGET 'http://localhost:9201/blog/article/_search?q=title:Title'
在 blog 索引的 article 类型中,搜索 title 字段匹配 “Title” 的文档。 q
表示查询,后面是 lucene 查询语句。
除了使用 curl 命令进行操作,ES 还提供了多种查询接口。
kibana 的 DevTools 面板中,使用的其实就是简化的 curl 命令。
其它查询方式如 C# 也是支持的
var client = new ElasticClient();var searchResponse = client.Search<Tweet>(s => s .Index("social-*") .Query(q => q .Match(m => m .Field(f => f.Message) .Query("myProduct") ) ) .Aggregations(a => a .Terms("top_10_states", t => t .Field(f => f.State) .Size(10) ) ));
更多内容可以看这里:
Elasticsearch Clients | Elastic
DSL 是 ES 里面可以完成相当复杂查询的语句。
1、Domain Specific Language 领域特定语言
2、Elasticsearch提供了完整的查询DSL,基于JSON定义查询
3、用于构造复杂的查询语句
Terminal window
curl -XPOST -H "Content-Type: application/json" 'http://localhost:9201/blog/article/_search' -d '{ "query" : { "term" : { "title" : "elk" } }}'# term 关键字: 指定字段查询
与上面看到的不同,这里采用 POST 请求,给 _search 路由发送查询请求,请求 body 使用的就是 DSL 查询语句。整个查询语句是一个 json 语句。
可以在 kibana 的 DevTools 面板里面体验。
DSL 查询语句分两部分,第一个是查询,以 query
关键字开头,第二个是过滤,以 filter
关键字开头。
query
指定查询的内容,其会参与查询结果的评分,评分多则表示匹配度高,查询结果靠前。
filter
是对 query 的查询结果进行过滤,但不参与评分。
官方文档:Query and filter context | Elasticsearch Reference [6.3] | Elastic
在开发 ES 调试时,建议使用 postman 工具。post 方式提交,增加 http 头信息。body 里面选 row 格式,粘贴对应的 dsl 即可。
{ "query": { "bool": { "must": [ { "match": { "title": "elk" } } ], "must_not": [ { "match": { "title": "小D" } } ] } }}
filter 查询(filtered语法已经在5.0版本后移除了,在2.0时候标记过期,改用filter ) 参考地址:https://www.elastic.co/guide/en/elasticsearch/reference/5.0/query-dsl-filtered-query.html
{ "query": { "bool": { "filter": { "range": { "PV": { "gt": 15 } } }, "must": { "match": { "title": "ELK" } } } }}
总结:
1、大部分filter的速度快于query的速度
2、filter不会计算相关度得分,且结果会有缓存,效率高
3、全文搜索、评分排序,使用query
4、是非过滤,精确匹配,使用filter
基础操作文档: Kibana User Guide [6.3] | Elastic
在 Management 面板中,新建一个索引匹配项,可以使用*统配符,去匹配ES中的一个或多个索引(如果没有匹配,无法点击下一步), 后续查询操作都是基于这个索引项的匹配去做。
可以理解为一个索引组。如,有一个 mylog 的索引,实际情况下,通常是每天建立一个新的索引,即 mylog-2018-08-01,mylog-2018-08-02,…
如果我们要对 mylog 相关的内容进行后续的查询,聚合分析,数据展示,就需要建立一个 mylog-*
的索引匹配/索引组。
建立索引匹配之后,就可以在 discover 面板中看到相应的项,选择之后,就可以进行原始数据的查询了。
可以指定时间进行查询。 可以使显示的字段。 查询索引的数据,是使用lucence语法进行查询。
可以在 Visualize 进行数据可以的配置。
首先选择要进行可视化的索引匹配/索引组,然后建立一个可视化组件。
具体方法,可以看文档: Kibana 用户手册 | Elastic
Dashboard 提供了一个可视化面板聚合展示的功能,可以展示多种多样的数据,日常的数据检测主要就是看这里了。
更多内容,看文档咯。
官方文档目录:
参考资料
原文链接: https://cloud.tencent.com/developer/article/2481438
本作品采用 「署名 4.0 国际」 许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。