索引
-
索引是文档的容器,是一类文档的集合
- index 体现了逻辑空间的概念: 每个索引都有自己的Mapping定义,用于定义包含的文档的字段名和字段类型。
- Shard 体现了物理空间的概念:索引中的数据分散在Shard上。
-
索引这个词在 ElasticSearch 会有三种意思:
-
索引(名词)
类比传统的关系型数据库领域来说,索引相当于SQL中的一个数据库(Database)。索引由其名称(必须为全小写字符)进行标识。 -
索引(动词)
保存一个文档到索引(名词)的过程。这非常类似于SQL语句中的 INSERT关键词。如果该文档已存在时那就相当于数据库的UPDATE。 -
倒排索引
关系型数据库通过增加一个B+树索引到指定的列上,以便提升数据检索速度。索引ElasticSearch 使用了一个叫做倒排索引
的结构来达到相同的目的。
-
索引(名词)
-
与关系型数据库的类比
Type
Type
可以理解成关系数据库中Table。
之前的版本中,索引和文档中间还有个类型的概念,每个索引下可以建立多个类型,文档存储时需要指定index和type。从6.0.0开始单个索引中只能有一个类型,7.0.0以后将将不建议使用,8.0.0 以后完全不支持。
弃用该概念的原因:
- 我们虽然可以通俗的去理解Index比作 SQL 的 Database,Type比作SQL的Table。但这并不准确,因为如果在SQL中,Table 之前相互独立,同名的字段在两个表中毫无关系。但是在ES中,同一个Index 下不同的 Type 如果有同名的字段,他们会被 Luecence 当作同一个字段 ,并且他们的定义必须相同。所以我觉得Index现在更像一个表,而Type字段并没有多少意义。
- 目前Type已经被Deprecated,在7.0开始,一个索引只能建一个Type为
_doc
。
文档(Document)
- Index 里面单条的记录称为Document(文档)。等同于关系型数据库表中的行。
- Elasticsearch 是面向文档的,文档是所有可搜索数据的最小单位。
- 一部电影的具体信息/一张唱片的详细信息
- 文档会被序列化JSON格式,保存在Elasticsearch中
- JSON对象由字段组成
- 每个字段都有对应的字段类型 (字符串/数值/布尔/日期/二进制/范围类型)
- 每个文档都有一个Unique ID
- 你可以自己指定ID
- 或者通过Elasticsearch自动生成
-
文档的源数据
#源数据用于标注文档的相关信息
#_index 文档所属的索引名
#_type 文档所属的类别名
#_id 文档的唯一id
#_source 文档的原始Json数据
#_version 文档的版本信息
#_seq_no 严格递增的顺序号,每个文档一个,Shard级别严格递增,保证后写入的Doc的_seq_no大于先写入的Doc的_seq_no
#primary_term primary_term也和_seq_no一样是一个整数,每当Primary Shard发生重新分配时,比如重启,Primary选举等,_primary_term会递增1
#found 查询的ID正确那么ture, 如果 Id 不正确,就查不到数据,found字段就是false。
节点
- 节点是一个Elasticsearch的实例
- 本质上就是一个JAVA进程。
- 一台机器可以运行多个Elasticsearch进程,但是生产环境一般建议还是一台机器运行一个Elasticsearch实例。
- 每个节点都有名字,通过配置文件配置,或者启动的时候 -E node.name=node1 指定
- 每个节点在启动之后,会分配一个UID,保存在data目录下
Master-eligible 节点 和 Master 节点
- 每个节点启动后,默认就是一个Master eligible 节点
- Master-eligible节点可以参加选主流程,成为Master节点
- 当第一个节点启动的时候,它会将自己选举成Master节点
- 每个节点上都保存了集群的状态,但是只有Master节点才能修改集群的状态信息
- 集群状态(Cluster State),维护了一个集群中,必要的信息
所有的节点信息
、所有的索引和其相关的Mapping 与 Setting 信息
、分篇的路由信息
。
- 集群状态(Cluster State),维护了一个集群中,必要的信息
Data 节点 和 Coordinating 节点
- Data 节点
- 可以保存数据的节点,叫做Data Node。负责保存分片数据,在数据扩展上起到了至关重要的作用。
- Coordinating 节点
- 负责接受Client的请求,将请求分发到合适的节点,最终把结果汇聚到一起。
- 每个节点默认都起到了Coordinating Node 的职责。
其他节点
- Hot & Warm 节点
- 不同硬件配置的Data Node,用来实现Hot & Warm 结构,降低集群部署的成本。
- Machine Learning Node
- 负责跑机器学习的Job。
分片
- 主分片,用以解决数据水平扩展的问题,通过主分片,可以将数据分布到集群的所有节点之上
- 一个分片是一个运行的Lucene的实例。
- 主分片在索引创建时指定,后续不允许修改,除非Reindex。
- 副本,用以解决数据高可用的问题,副本分片是主分片的拷贝
- 副本分片数,可以动态调整。
- 增加副本数,还可以在一定程度上提高服务可用性(读取的吞吐)。
- 分片的设定
- 分片数设置过小
导致后续无法增加节点进行水平扩展。
导致分片的数据量太大,数据在重新分配时耗时。 - 分片数设置过大
影响搜索结果的相关性打分,影响统计结果的准确性。
单个节点上过多的分片,会导致资源浪费,同时也会影响性能。
网友评论