ES与传统的关系型数据库比较:
在此说明,ES版本的变化都会做一定的调整,其他博客推从解释说关系型数据库的Tables类似于ES的type,这个理解是错误的,官网也有说名(https://www.elastic.co/guide/en/elasticsearch/reference/6.2/removal-of-types.html)在SQL数据库中,表彼此独立。一个表中的列与另一个表中具有相同名称的列无关。映射类型中的字段不是这种情况。详细建下方type的详解或者参考官网文档。
ES的简单组成:
索引(Index)
ES将数据存储于一个或多个索引的分片中;Elasticsearch默认每个索引5个分片,每个分片1个副本。简单的理解就是,ElasticSearch索引和传统的关系型数据库相比,索引相当于数据库,在所有的CRUD操作都需要指定索引。
(注:索引名称必须是小写的,不能用下划线开头,不能包含逗)
文档类型(Type)
文档类型在Index内相当于一个个的逻辑分区,(旧版本:一个索引内部可定义一个或多个类型(type),6.x版本后推从一个index对应一个type;官网有说明,将来要取消type)。请参考官网文档
https://www.elastic.co/guide/en/elasticsearch/reference/6.2/removal-of-types.html
(注:type名称可以是大写或者小写,但是同时不能用下划线开头,不能包含逗号)
Index与Type
我们知道一个index下可以创建多个Type,但是关于index和Type的取舍随着版本的升级需要我们了解一下。
当然index由多个分片组成,但是每个分片都是要消耗一些磁盘、内存资源。上面描述过了,Elasticsearch 默认每个索引5个分片,每个分片1个副本。所以一个索引最少有10个分片了,副本的优势在于查询的时候可以加速,但是索引文档时候性能不是很快。还有如果有太多分片查询的结果需要合并,或者你发起了一个结果巨大的搜索请求,合并任务会需要大量 CPU 和内存资源。(这样我们在设置分片得多方面考虑了,当然我们可以简单得预算一下,分片数最少要等于集群的节点数,这样保证每个节点有一个分片,ES处理时候能把数据分散到各个节点,还有考虑到后期的扩展,初期设置分片数时候建议是节点数的1.5~3倍)
type的使用可以减少Index的数量。但是有些限制:
1、一个index下的不同type里有两个名字相同的字段,他们的类型(text, long、boolean 等等)和配置也必须相同。
2、如果某个type里存在name这个字段,但是在其他的type中不存在,这样也是会消耗一部分资源的,这是ES的限制性规定,避免文档稀疏,稀疏的文档压率不高。一个Index索引中多个type的mapping类似的时候推荐使用多type。滥用type可能会造成比使用多个index消耗的资源更多,所以官网再慢慢的取消type,6.x版本开始索引index对类型type都是一对一的了。
节点(Node)
一个运行中的Elasticsearch实例称为一个节点,而集群是由一个或者多个拥有相同cluster.name配置的节点组成,它们共同承担数据和负载的压力。
ES集群3-5个节点属于轻量级集群,要保证主节点个数满足((节点数/2)+1)。
节点作用:
共享数据并提供故障转移和扩展功能,当有新的节点加入或者删除节点,集群就会感知到并平衡数据。集群中一个节点会被选举为主节点(master),它用来管理集群中的一些变更
ES集群中节点类型:
1.主节点:负责管理集群范围内的所有变更,例如增删等操作。 主节点并不需要涉及到文档级别的变更和搜索等操作。可以通过属性node.master进行设置。
2.数据节点:存储数据和其对应的倒排索引。默认每一个节点都是数据节点(包括主节点),可以通过node.data属性进行设置。
3.协调节点:如果node.master和node.data属性均为false,则此节点称为协调节点,用来响应客户请求,均衡每个节点的负载。上述节点都是可以通过config目录下的.yml配置文件进行配置。
分片(Shard)和副本(Replica)
一个索引中的数据保存在多个分片中,一个分片便是一个Lucene 的实例;ES实际上就是利用分片来实现分布式。我们保存的文档数据就是保存在分片内。分片又被分配到集群内的各个节点里。分片会在各个节点上自由迁移分配,这样保证了数据分布均匀以使集群保持平衡。
(注:主分片的数量只能在创建索引时定义且不能修改)
副本分片就是主分片的一个副本,主要用于冗余数据和提高查询性能。副本分片的主要目的就是为了故障转移,如果持有主分片的节点挂掉了,一个副本分片就会晋升为主分片的角色。如果集群中的某个主分片丢失了,可以通过这个分片的副本将数据全部找回。因为副本分片不会和原分片放在同一节点上。
主分片与副本的交互:
新建、索引和删除请求都是写(write)操作,它们必须在主分片上成功完成才能复制到相关的副本分片上。(步骤如下:)
(1. 客户端选择一个node发送请求过去,这个node就是coordinating node(协调节点)
(2. coordinating node,对document进行路由,将请求转发给对应的node(有primary shard [主分片])
(3. 实际的node上的primary shard处理请求,然后将数据同步到replica node (副节点)
(4. coordinating node,如果发现primary node和所有replica node都成功之后,就返回响应结果给客户端
(详细见下图)
对ES的简单了解就到这了,详细的说明后期再更新。