Elasticsearch源码解析与优化实战 - (EPUB全文下载)
文件大小:0.29 mb。
文件格式:epub 格式。
书籍内容:
Elasticsearch源码解析与优化实战
第1章 走进Elasticsearch
第2章 准备编译和调试环境
第3章 集群启动流程
第4章 节点的启动和关闭
第5章 选主流程
第6章 数据模型
第7章 写流程
第8章 GET流程
第9章 Search流程
第10章 索引恢复流程分析
第11章 gateway模块分析
第12章 allocation模块分析
第13章 Snapshot模块分析
第14章 Cluster模块分析
第15章 Transport模块分析
第16章 ThreadPool模块分析
第17章 Shrink原理分析
第18章 写入速度优化
第19章 搜索速度的优化
第20章 磁盘使用量优化
第21章 综合应用实践
第22章 故障诊断
附录A 重大版本变化
第1章 走进Elasticsearch
本章主要介绍入门知识,对Elasticsearch基本概念已经很熟悉的读者可以跳过本章。
1.1 基本概念和原理
Elasticsearch是实时的分布式搜索分析引擎,内部使用Lucene做索引与搜索。
何谓实时?新增到 ES 中的数据在1秒后就可以被检索到,这种新增数据对搜索的可见性称为“准实时搜索”。分布式意味着可以动态调整集群规模,弹性扩容,而这一切操作起来都非常简便,用户甚至不必了解集群原理就可以实现。按官方的描述,集群规模支持“上百”个节点,相比HDFS等上千台的集群,这个规模“小了点”。影响集群规模上限的原因将在后续的章节中分析。因此,目前我们认为ES适合中等数据量的业务,不适合存储海量数据。
Lucene是Java语言编写的全文搜索框架,用于处理纯文本的数据,但它只是一个库,提供建立索引、执行搜索等接口,但不包含分布式服务,这些正是 ES 做的。什么是全文?对全部的文本内容进行分析,建立索引,使之可以被搜索,因此称为全文。
基于ES,你可以很容易地搭建自己的搜索引擎,用于分析日志,或者配合开源爬虫建立某个垂直领域的搜索引擎。ES 易用的产品设计使得它很容易上手。除了搜索,ES 还提供了大量的聚合功能,所以它不单单是一个搜索引擎,还可以进行数据分析、统计,生成指标数据。而这些功能都在快速迭代,目前每2周左右就会发布新版本。
1.1.1 索引结构
ES是面向文档的。各种文本内容以文档的形式存储到ES中,文档可以是一封邮件、一条日志,或者一个网页的内容。一般使用 JSON 作为文档的序列化格式,文档可以有很多字段,在创建索引的时候,我们需要描述文档中每个字段的数据类型,并且可能需要指定不同的分析器,就像在关系型数据中“CREATE TABLE”一样。
在存储结构上,由_index、_type和_id唯一标识一个文档。
_index指向一个或多个物理分片的逻辑命名空间,_type类型用于区分同一个集合中的不同细分,在不同的细分中,数据的整体模式是相同或相似的,不适合完全不同类型的数据。多个_type可以在相同的索引中存在,只要它们的字段不冲突即可(对于整个索引,映射在本质上被“扁平化”成一个单一的、全局的模式)。_id文档标记符由系统自动生成或使用者提供。
很多初学者喜欢套用RDBMS中的概念,将_index理解为数据库,将_type理解为表,这是很牵强的理解,实际上这是完全不同的概念,没什么相似性,不同_type下的字段不能冲突,删除整个_type也不会释放空间。在实际应用中,数据模型不同,有不同_type需求的时候,我们应该建立单独的索引,而不是在一个索引下使用不同的_type。删除过期老化的数据时,最好以索引为单位,而不是_type和_id。正由于_type在实际应用中容易引起概念混淆,以及允许索引存在多_type并没有什么实际意义,在ES 6.x版本中,一个索引只允许存在一个_type,未来的7.x版本将完全删除_type的概念。
1.1.2 分片(shard)
在分布式系统中,单机无法存储规模巨大的数据,要依靠大规模集群处理和存储这些数据,一般通过增加机器数量来提高系统水平扩展能力。因此,需要将数据分成若干小块分配到各个机器上。然后通过某种路由策略找到某个数据块所在的位置。
除了将数据分片以提高水平扩展能力,分布式存储中还会把数据复制成多个副本,放置到不同的机器中,这样一来可以增加系统可用性,同时数据副本还可以使读操作并发执行,分担集群压力。但是多数据副本也带来了一致性的问题:部分副本写成功,部分副本写失败。我们随后讨论。
为了应对并发更新问题,ES将数据副本分为主从两部分,即主分片(primary shard)和副分片(replica shard)。主数据作为权威数据,写过程中先写主分片,成功后再写副分片,恢复阶段以主分片为准。
数据分片和数据副本的关系如下图所示。
分片(shard)是底层的基本读写单元,分片的目的是分割巨大索引,让读写可以并行操作,由多台机器共同完成。读写请求最终落到某个分片上,分片可以独立执行读写工作。ES利用分片将数据分发到集群内各处。分片是数据的容器,文档保存在分片内,不会跨分片存储。分片又被分配到集群内的各个节点里。当集群规模扩大或缩小时,ES 会自动在各节点中迁移分片,使数据仍然均匀分布在集群里。
索引与分片的关系如下图所示。
一个ES索引包含很多分片,一个分片是一个Lucene的索引,它本身就是一个完整的搜索引擎,可以独立执行建立索引和搜索任务。Lucene索引又由很多分段组成,每个分段都是一个倒排索引。ES每次“refresh”都会生成一个新的分段,其中包含若干文档的数据。在每个分段内部,文档的不同字段被单独建立索引。每个字段的值由若干词(Term)组成,Term是原文本内容经过分词器处理和语言处理后的最终结果(例如,去除标点符号和转换为词根)。
如果想了解Lucene分段由哪些文件组成,每个文件都存储了什么内容,则可以参考Apache Lucene 的手册:http://lucene.apache.org/core/7_3_0/core/org ............
以上为书籍内容预览,如需阅读全文内容请下载EPUB源文件,祝您阅读愉快。
书云 Open E-Library » Elasticsearch源码解析与优化实战 - (EPUB全文下载)