目录
介绍
数据传入: document和indices
信息输出:搜索和分析
搜索数据
分析数据
规模化和还原能力:集群,节点和分片
分片的影响
灾难情况
维护
Elasticsearch是Elastic Stack的核心部分,分布式的搜索和分析引擎。Logstash和Beats专注于收集,聚集和丰富数据,并将这些数据存储在Elasticsearch。Kibana允许交互地探索,可视化,分享数据成果,管理并监控整个技术栈。
Elasticsearch可以对各类数据进行实时搜索和分析。结构化的和非结构化的文本,数字型数据或者地理数据,Elasticsearch都可以高效地存储和索引,以便快速搜索。通过简单地操作检索数据和聚集信息,在此基础上发现数据中的趋势和模式。随着数据和查询量的增长,Elasticsearch天然的分布式特性允许无缝地、迅速地扩张部署集群规模。
当然不是所有问题都是搜索问题,Elasticsearch的速度和弹性可以提供处理数据的广泛用例:
为app或者网站增加一个搜索框
存储分析日志,指标和安全事件数据
机器学习实时地自动建立数据行为模型
在商业的自动化工作流中使用Elasticsearch作为存储引擎
使用Elasticsearch作为地理信息系统(GIS)管理,聚集,分析空间信息
使用Elasticsearch作为生物信息搜索工具存储和处理基因数据
Elasticsearch是分布式的对document的存储。Elasticsearch将复杂的数据结构序列化为JSON格式的document并进行存储,而不是像常见的数据一样一行行地存储列数据。将大量Elasticsearch节点在集群中部署后,存储的document分布在集群中,就可以通过任意的节点迅速地访问到。
document存储后被索引,并且可以接近实时地查询到。Elasticsearch使用一个叫做倒排索引(inverted index)的数据结构来支持快速的全文检索。倒排索引可以列出全部document里面的所有独立word,然后标出这些word在文档出现的所有位置。
一个索引可以认为是优化的document集合,每个document是field的集合,field是包含数据的键值对儿。通常,Elasticsearch通过每个field(字段)索引到所有数据,每个索引的field都有专用的、优化的数据结构。例如,文本field存储在倒排索引里,数字和地理field存储在BKD树中。维护这些数据结构并从中取得数据是Elasticsearch搜索如此迅速的原因。
Elasticsearch还有一个无需模式的能力,意味着document可以被索引到,但是不需要明确地指定如何处理document中每个不同field。动态mapping启用之后,Elasticsearch自动检测并添加新的field到索引里面。这可以更容易地索引数据,只要开始索引document,Elasticsearch就会检测并map各种类型的数据到适合的Elasticsearch数据类型。
你可以定义规则控制动态mapping并定义mapping来完全掌握怎么存储和检索field。
定义自己的mapping可以:
区分全文字符string field和特定的值string field
运行特定语言的文本分析
优化field的局部匹配
自定义日期格式
使用geo_point
和geo_shape
这样的不能自动检测的数据类型
通常会为不同的目的对同一字段建立不同的索引。例如,既希望把string field索引为文本field用来全文搜索,也想作为关键字field来排序或聚集数据。或者,可能选择使用多个语言分析器来处理包含用户输入的string field的内容。
在索引期间应用于全文字段的分析链,也会在搜索时使用。查询全文字段时,在索引中查找到term之前,就可以查询文本进行相同的分析。
用Elasticsearch作为document存储,并且用来取出document和它们的metadata,强大的能力来源于能够运用Apache Lucene 搜索引擎库的全部能力。
Elasticsearch提供简单一致的REST API来管理集群,索引和搜索数据。在测试中,你可以通过命令行或者Kibana的开发控制栏,方便地直接提交请求。来自应用的请求,可以选择对应语言的Elasticseach client。
Elasticsearch REST API 支持结构化查询和全文搜索,以及这两种结合的复杂查询。结构化查询类似于SQL语句可以构建的查询。例如,查找employee
的索引中的gender
和age
两个字段,查询结果以hire_date
字段排序。全文查询寻找所有匹配字符串的document,返回结果按照相关度(relevavance)进行排序。相关度评估了搜索term与document的匹配程度。
还有查询单独的term,可以进行短语搜索,相似度搜索,和前缀搜索,并且自动获得搜索建议。
地理空间的和其他数字类型的数据查询?Elasticseach以优化的数据结构来索引非文本的数据,支持高性能的地理和数据类型查询。
使用ELasticsearch的JSON风格的查询语言(Query DSL)实现这些查询能力。也可以构建SQL查询语句来自然地搜索、聚集数据,JDBC和ODBC驱动允许广泛的第三方应用通过SQL连接Elasticsearch。
Elasticsearch的aggregation允许对数据建立复杂的summary,获得关键指标,模式和趋势的洞见(insight)。不只是找到谚语“大海捞针”,aggregation允许回答像这样的一些问题:
海洋有多少针?
针的平均长度?
针长度的中位数是多少,由制造商区分
过去六个月大海里面有多少针掉进去了?
也可以用一些aggregation回答更细致的问题,比如:
最受欢迎的针的生产生是哪家?
有哪些是不正常的针?
因为aggregation使用和搜索一样的数据结构,所以处理速度也非常快。这就可以实时地分析,可视化数据。报告和dashboard和数据变化同步更新,所以可以基于最新的信息采取行动。
aggregation操作由搜索请求决定。可以在一个单独的请求中针对数据,同时搜索docuemnt,filter结果,数据分析。aggregation在特定的查询上下文中计算,显示的针的计数符合用户查询的标准,比如,所有为不锈钢材质的针的数量。
Elasticsearch可以按需规模化。可以添加服务器(节点)到集群增加空间。Elasticsearch可以自然地在所有节点中分布数据和进行查询。
Elasticsearch索引是在物理分片(shard)上面的逻辑组织。每一个分片事实上是独立的索引。把一个索引上的所有document分布在不同的分片,把分片分布在不同的节点,Elasticsearch可以保证冗余,来避免硬件挂掉带来的问题,并且提高查询性能。集群扩容之后,Elasticsearch自动地迁移分片来重新在集群中取得平衡。
有两种分片:基础的和副本的。每个索引的document属于一个基础的分片,一个副本分片是基础分片的复制。副本分片提供数据的冗余备份对抗硬件错误,提高可用性。
索引建立后基础分片的数量就定下来了,副本分片的数量任何时候都能改变,不会影响索引和查询。
对于索引的分片的大小和基础分片的数量设置,有一些对于性能的考量和权衡。分片越多,维护这些索引的日常开支就越多。分片越大,在Elasticsearch需要在集群重新均衡的时候需要用来移动分片的时间就越长。
查询大量小的分片,每个分片处理的速度快,但是更多的查询意味着更多的日常开销。所以查询大量小的分片可能更快,但是往往有其他方面的因素牵制。
起步:
保持平均分片大小在GB到几十GB。时间相关的数据情况下,通常分片在20GB到40GB区间。
避免庞大的碎片问题。一个节点可以维持的分片数量和可以访问的堆空间成正比。通常,堆空间每1GB的分片数量应该小于20。
决定配置的最好的方法是测试数据和查询。
由于性能原因,一个集群的节点是同一个网络的。在不同的数据中心平衡分片花太多时间。但是高可用的架构需要避免把鸡蛋放在一个篮子里。在一个地方的大断电事件中,另一个地方的服务器可以无缝地解决这个问题。答案是跨集群副本( Cross-cluster replication,CCR)。
CCR提供从主集群到次要的远程集群自动同步索引的技术,依此进行热备份。也可以用CCR创建第二个集群来给用户提供地理上接近的读请求服务。
CCR是主动-被动的。基础集群的索引是主动的leader index,处理所有写请求。复制到副集群的索引是只读的follower。
Elasticsearch集成的安全、监控和管理特性允许你使用Kibana作为控制中心管理集群。像data rollups和index生命周期管理的特性帮助长时间地管理数据。
参考:
Elasticsearch introduction