Elasticsearch是什么
你知道的,为了搜索(和分析)
Elasticsearch 是处于 Elastic 栈中心位置的分布式的搜索和分析引擎。Logstash 和 Beats 促进了集合、聚合和丰富你的数据并将它存储进 Elasticsearch。Kibana 使你能够交互式地对你的数据探索、可视化和分享见解并且监控整个栈。Elasticsearch 是索引、搜索、分析魔力发生的地方。
Elasticsearch 为所有类型的数据提供接近实时的搜索和分析。不管是你有结构化非结构化的文本数字型数据、还是地球空间信息(geo)数据,Elasticsearch 以一种方式高效的存储和索引它,以支持快速搜索。除了简单的数据检索和聚合信息你还可以走得更远去发现你的数据中的趋势和模式。随着你的数据和查询量的增长,Elasticsearch 的天然分布式使你的部署能够无缝地增长。
然而不是每一个问题都是一个搜索问题, Elasticsearch 在一个巨量的使用案例中提供处理数据的速度和弹性:
- 向一个 app 或者网站提供一个搜索盒子
- 存储和分析日志,度量和安全保护事件数据
- 使用机器学习实时地自动为你数据的行为创建模型
- 使用 Elasticsearch 作为一个存储引擎使业务流程自动化
- 使用 Elasticsearch 作为一个地理信息系统(GIS)管理、集成、分析空间信息
- 使用 Elasticsearch 作为一个生物信息学研究工具存储和处理基因数据
我们不断的惊讶于人们使用搜索的新奇的方式。但是不管你的用例和这些中的一个相似,还是你使用 Elasticsearch 要处理一个新的问题,在 Elasticsearch 里操作你的数据、文档还有索引的方式是一样的。
1. 数据输入:文档和索引
Elasticsearch 是一个分布式的文档存储,区别于存储行和列的数据,Elasticsearch存储被序列化为JSON文档的复杂数据结构。如果在一个集群中有多个 Elasticsearch 节点,存储的文档被分布到集群中,并且可以立即从任何节点访问。
当一个文档被存储,它被索引,并且可以接近于实时的搜索-1秒内。Elasticsearch使用一个反向索引的数据结构,可以使全文搜索很快。一个反向索引列出出现在任何文档中的每一个单一的词,并且识别出每一个词存在的所有文档。
一个索引可以被认为是一个优化后的文档的集合,每一个文档是一个字段的集合,也是一个包含了你的数据的键-值对。默认,Elasticsearch会索引所有的字段,每一个被索引的字段有一个专用的,优化的数据结构。例如:text 字段存储为反向索引,numeric 和 geo 字段被存储为BKD树。
Elasticsearch是弱模式的,这意味着索引文档不需要显式的指定如何处理一个文档中不同的字段。当动态映射启用时,Elasticsearch可以自动检测并添加新的字段到索引。这个默认的行为可以很方便的索引和探索你的数据--只需要索引文档,那么Elasticsearch将自动检测并映射布尔型, 浮点型和整型值,日期和字符串到它相应的Elasticsearch数据类型。
最后,你比Elasticsearch更了解你的数据。所以你可以指定规则去控制映射,也可以显式的定义映射,对字段如何存储和索引也有完全的控制。
定义你自己的映射可以使你:
- 区分全文本字符串字段和精确值字段
- 实施特定语言的文本分析
- 为部分匹配优化字段
- 使用自定义数据格式
- 使用geo_point, geo_shape等不能被自动检测的数据类型
一个经常的用法是使用不同的方式索引相同的field,以达到不同的目的。比如,你可能想索引一个字符串字段同时作为一个可以进行全文搜索的 text 字段和一个可以排序和聚集数据的 keyword 字段。又或者,你可能会使用超过1种语言分析器去处理包含了用户输入的内容的 string 字段。
在索引期间应用于全文本字段的分析链同样可用于搜索时。当你查询一个全文本字段时,查询文本在查找索引之前会经历同样的分析。
2. 信息输出:搜索和分析
当你使用 Elasticsearch 作为一个文档存储并检索文档和他们的元数据,真正的实力来源于能够非常容易地访问到基于Apache Lucene搜索引擎库提供的全套搜索能力。
Elasticsearch 为管理你的集群、索引和搜索数据提供一个简单的、一致性的REST API。为了测试,你可以容易地从命令行或者通过Kibana的开发者控制台直接提交请求。从你的应用程序,你也可以使用为你的语言提供的 Elasticsearch客户端,包括:Java,JavaScript,Go,.NET,PHP,Perl,Python或者Ruby.
搜索数据
Elasticsearch REST APIs支持结构化查询,全文查询和包含这两种的复杂查询。结构化查询类似与SQL里的查询类型。比如,你可以在 employee 索引里查询 gender 和 age 字段,并且匹配 hire_date 字段进行排序。全文本查询找到所有匹配查询字符串的文档,并且按相关性排序-对查询条目的匹配度。
除了可以搜索独立的条目,你还可以执行短语搜索,相似搜索,前缀搜索和获得自动完成建议。
你想要查询地球空间信息(geo)或者其他的数字型数据? Elasticsearch 用优化的数据结构来索引非文本化的数据以支持高性能的 geo 和数字型查询。
你可以使用 Elasticsearch 的全面的JSON风格的查询语言来获得所有这些搜索能力。你也可以构建SQL类型的查询来原生地搜索和聚集 Elasticsearch 里的数据,并且 JDBC 和 ODBC 驱动使广泛的第三方应用能够通过 SQL 与 Elasticsearch 进行交互。
分析你的数据
Elasticsearch 聚合使你能够建立起你的数据的复杂的摘要,并且获得对关键字度量、模式、趋势的洞察力。聚合能够回答以下问题,而不是仅仅像众所周知的“干草垛找针”那样式的查找:
- 有多少根”针“在干草垛里?
- ”针“的平均长度是多少?
- 被制造商破坏掉的”针“的中位数长度是多少?
- 最近的6个月有多少”针“被加入到干草垛里。
你也可以使用聚合回答更多微妙的问题,比如:
- 你最流行的”针“制造商是什么?
- 是否有一些不寻常或者反常的”针“块?
因为聚合利用了用于搜索的相同的数据结构,所以他也很快。这使你能够实时的分析和可视化你的数据。
你的数据改变后你的报告和仪表盘就会更新,所以你可以基于最新的信息采取动作。
另外,聚合操作紧随着搜索请求。你可以在一个请求里同时对同样的数据搜索文档,过滤结果,执行分析。并且因为聚合是基于特定搜索的上下文进行计算的,所以你不是仅仅展示了一个所有尺寸为70的”针“的计数,而是展示了一个符合用户搜索条件的所有尺寸为70的”针“的计数-比如,所有尺寸为70的不粘绣花针。
等等,还有
想要自动分析你的时间序列的数据?你可以使用机器学习特性来创建你数据的正常行为的精确基准线来识别不规则的模式。通过机器学习,你可以检测:
- 关于值,计数,频率的时间偏差的异常
- 统计罕见度
- 群体成员的异常行为
最好的部分?你可以做这些不需要指定算法,模型或者其它关于数据科学性相关的配置。
3. 可扩展性和弹性:集群、节点、切片
Elasticsearch 被创建为总是可用的和根据你的需要进行扩展。它具有天然的分布式来做这个。你可以添加服务器(节点)到集群来增大能力,Elasticsearch 则会自动将你的数据和查询负载分布到所有可用的节点。不需要改造你的应用程序,Elasticsearch 知道如何均衡多节点的集群来提供可扩展性和高可用性。越多的节点,越开心~
这是如何工作的?在表面之下,一个 Elasticsearch 索引实际是一个或多个物理分片的逻辑分组,每一个分片实际上是一个自包含的索引。将一个索引里的文档分布到多个分片,再把这些分片分布到多个节点,Elasticsearch 能确保冗余性-既能保护免受硬件故障,同时由于增加了节点到集群里,所以又增强了查询能力。随着集群的增长或收缩,Elasticsearch 自动迁移切片来达到集群的再平衡。
有两种类型的切片:主的和备的。每一个在索引里的文档属于一个主切片。一个备份切片是一个主切片的拷贝。备份为你的数据提供冗余的拷贝以保护抵御硬件故障,并且提升像搜索或检索一个文档这样的读请求的服务能力。
一个索引中主分片的数量在索引被创建的时候就会固定下来,但是备份切片的数量可以随时更改,不需要中断索引或者查询操作。
它依赖于...
关于一个索引配置的切片尺寸和主切片的数量上有许多性能上的考虑和取舍。很简单,越多的切片在维持这些索引上也会有越多的开销。切片的尺寸越大,当 Elasticsearch 需要再平衡集群的时候它要移动切片所花费的时间也越长。
查询大量的小切片使得每个切片的处理很快,但是越多的查询意味着越多的开销,所以查询少量的大切片可能更快。一句话...它依赖于这个。
作为一个起点:
- 保持平均的切片尺寸在几GB至几十GB之间。在基于时间的数据用例中,通常切片在20GB到40GB的范围。
- 避免极大量的切片问题。一个节点能持有的切片的数量对于可用的堆空间要成比例。通常的规则是:每GB的堆空间对应的切片的数量应该少于20.
检测你的用例的最优配置的最好方式是通过 测试你自己的数据和查询.
万一灾难
一个集群的节点彼此之间需要好的、可信的链接。为了提供更高的连接,通常将节点驻扎在同一个数据中心或者离的近的数据中心。然而,为了维持高可用性,你又需要避免任何单点故障。在一个位置的主要断电事件,在另外位置的服务器需要能够接管。答案是?跨集群复制(CCR)
CCR提供了一种方式可以自动从你的主集群到你的可以作为一个热备服务的次要的远程集群同步索引。如果主集群挂了,从集群能够接管。你还可以使用CCR创建在地理位置接近用户时提供服务从集群。
跨集群复制是主动-被动的。在主集群中的索引是活动的领导索引,负责处理所有的写请求。从集群中的索引是只读的跟随者。
护理和投入
作为任何的企业级系统,你需要工具来安全保护,管理和监控你的 Elasticsearch 集群。安全性,监控性和管理性被集成进 Elasticsearch 使你能够使用 Kibana 作为一个控制中心来管理你的集群。像数据回滚和索引生命周期管理这些特性随着时间的推移能帮助你聪明地管理你的数据。