[db:标题]

摘要:前言 最近面试过程中遇到问Elasticsearch的问题不少,这次总结一下,然后顺便也了解一下Elasticsearch内部是一个什么样的结构,毕竟总不能就只了解个倒排索引吧。本文标题就是我遇到过的两个问题,所以此次基本上只是围绕着这两个
前言 最近面试过程中遇到问Elasticsearch的问题不少,这次总结一下,然后顺便也了解一下Elasticsearch内部是一个什么样的结构,毕竟总不能就只了解个倒排索引吧。本文标题就是我遇到过的两个问题,所以此次基本上只是围绕着这两个问题来总结。 ES写入数据 在介绍写入数据的过程时,先明确一下ES中的一些关键性的概念: Cluster:集群,由一到N个Elasticsearch服务节点组成。 Node:节点,组成Elasticsearch集群的基本单元,单个集群内节点名称唯一。通常一个节点中分配一道多个分片。 Shards:分片,当ES的索引数据过大时,会进行水平拆分,拆分出来的每一个单元都称为分片。在进行写入数据的时候,会通过路由来确定具体写到哪个分片(主分片)上,所以在创建索引的时候就要确定好分片(主分片)数量,并且一旦确定不可更改。索引数据在经过分片后,在数据管理和性能上都有很大提升,并且每一个分片都是一个Lucene的索引,每个分片都必须有一个主分片和零到多个副分片。 Replicas:副本或备份,副本是指对主分片的备份分片,无论是主分片还是副本分片都可以对外提供查询服务。但是写入操作时是先写入主分片,然后再分发到副本上。 当主分片不可用时会在副本分片上选举一个作为主分片,因此副本不仅可以保证系统的高可用性,还可以提升搜索时的并发性能(主副分片都可以提供查询)。但并不是副本越多越好,副本数量过多会导致数据同步的负担过大。 分片分配实际计算方法: 1、按数据量估算:分片数 = 向上取整(预估总数据量 / 单个分片理想大小)。例:预估数据量 300GB,理想分片大小 30GB → 分片数 ≈ 10 个 2、按节点规模估算:分片数 ≈ 数据节点数 × 2(或1.5~3倍之间调整)。例:4 个数据节点 → 分片数建议 6~12 个 副本策略:副本数建议 ≤ 数据节点数 - 1(如 3 节点 → 2 副本) Index:索引,由一个和多个分片组成,单个集群内索引名字是唯一的。 Type:类型,指索引内部的逻辑分区,一般是通过Type的名字来进行分区,若是查询条件中没有该值,则说明在整个索引中执行查询。 Document:文档,ES索引中的每一条数据都称为一个Document,基本上和关系型数据库中的一个记录意思相同,通过_id,在Type内进行唯一标识。 Settings:对集群中索引的设定,例如默认的分片数量,副本数等信息。 Mapping:这里的Mapping类似于,关系型数据库的表结构信息,这里面包含了索引中字段的存储类型,分词方式,是否分词等信息。 Elasticsearch中的Mapping是可以动态识别的,Elasticsearch字段的数据格式识别它的类型,但是若是需要对Filed字段进行特殊设置时,就需要手动创建Mapping了。注意:一个Mapping一旦创建成功后,若是已经存储了数据了,就不可以修改了。 Analyzer:字段的分词方式的定义,一个Analyzer,通常由一个Tokenizer,零到多个Filter组成。例如默认的标准Analyzer包含一个标准的Analyzer和三个Filter(Standard Token Filter、Lower Case Token Filter、Stop Token Filter)。 Elasticsearch的节点分类 Master Node(主节点):主节点主要负责创建索引,删除索引,分配分片,追踪集群中的节点状态等工作。在配置文件中设置node.master=true 来将该节点设置成候选主节点,在集群中只有候选主节点才有选举权和被选举权。 Data Node(数据节点):数据节点负责数据的存储和相关具体操作,例如索引数据的创建,更新,搜索,聚合等操作。因此,数据节点对机器的要求比较高无论是在磁盘空间还是CPU、内存、I/O性能等。 集群在扩大后,需要增加更多的数据节点来提高可用性,在配置文件中通过node.data=true 来设置当前节点为数据节点。 Client Node(客户端节点):客户端节点是既不做候选主节点也不做数据节点的节点,只负责请求的分发、汇总等。若是单独增加这种节点主要是更多地为了提高并发性。 Tribe Node(部落节点):部落节点可以跨越多个集群,它可以接收每个集群的状态,然后合并成一个全局集群状态。 Coordinating Node(协调节点):协调节点只是一个角色,并不是指具体的某个集群节点,也没法通过配置来指定某个节点为协调节点,这也就说明集群中任何一个节点都可以是协调节点。
阅读全文