Elasticsearch以下简称ES,ES是使用Java编写的一种开源搜搜引擎,它在内部使用Lucene做索引与搜索,然后es不仅仅是Lucene,并且也不仅仅只是一个全文搜索引擎。
可以这样形容ES
- 一个分布式的实时文档存储,每个字段可以被索引与搜索。
- 一个分布式实时分析搜索引擎
- 能胜任上百个服务节点的扩展,并支持PB级别的结构化或者非结构化数据。
ES核心概念
集群(cluster):由一个或多个节点组成,并通过集群名称与其他集群进行区分
节点(node):单个ES实例。通常一个节点运行在一个隔离的容器或虚拟机中
分片(Shards):
ES支持PB级全文搜索,当索引上的数据量太大的时候,ES通过水平拆分的方式将一个索引上的数据拆分出来分配到不同的数据块上,拆分出来的数据库块称之为一个分片。
ES自动管理和组织分片,并在必要的时候对分片数据进行再平衡分配,所以用户基本上不用担心分片的处理细节。
在一个多分片的索引中写入数据时,通过路由来确定具体写入哪一个分片中,所以在创建索引的时候需要指定分片的数量,并且分片的数量一旦确定就不能修改。
为什么主分片不可变,举例来说:索引初始化时候默认分配5个分片,假如索引一个document id=5,根据ES文档路由原理该document应该被分配到shard=hash(5)%5=3 P3的分片上,这时候如果添加一个主分批拿,此时shard=hash(5)%6=5,那么根据计算就会定位到P5的分片上。而我们的数据再P3分片上。所以ES集群无法修改主分片数。
技术上来说,一个主分片最大能够存储Integer.MAX_VALUE-128个文档,但是实际最大值还需要参考你的使用场景。
在索引建立的时候就已经确定了主分片数,但是副本分片可以随时修改,索引内任意一个文档都归属于一个主分片,所以主分片的数据决定这索引能够保存的最大数据量。索引在默认情况下会被分配5个主分片。
副本(Replicas)
副本是对主分片的copy,每个主分片都有一个或多个副本分片,当主分片异常时,副本可以提供数据的查询等操作。
主分片和对应的副本分片是不会在同一个节点上的,所以副本分片数的最大值是N-1(N为节点数)
ES为了提高写入能力这个过程是并发写的,同时为了解决并发写的过程中数据冲突的问题,ES通过乐观锁(对应关系型数据库的悲观锁)的方式控制。每个文档都有一个_version(版本)号,当文档被修改是版本号递增。
副本越多,集群的可用性就越高,但是由于每个分片都相当于一个Lucene文件,会占用一定的文件句柄、内存及CPU。并且分片间的数据同步也会占用一定的网络宽带,所以索引的分片数和副本数也不是越多越好。
索引(index):index是保存相关数据的地方,索引实际上是指向一个或者多个物理分片的逻辑命名空间。事实上,我们的数据被存储和索引在分片中,索引只是一个把一个或多个分片分组在一起的逻辑空间,然而内部的一些细节不需要我们关心,文档存储在索引中。
类型(type):我们可以使用相同的类型表示相同的事物,因为他们的数据结构是相同的,每个类型都有自己的映射或结构定义,所有类型下的文档被存储在同一个索引下。
文档(document):一条记录,类似数据库中的一列。在es中,它是指最顶层根对象,这个根对象呗序列化成JSON并存储到ES中,指定了唯一的ID。
映射(mapping):映射是用于定义ES对索引中字段的存储类型、分词方式和是否存储等信息,就像数据库中的Schema,描述了文档可能具有的字段或属性、每个字段的数据类型。
下一篇简介更多ES的原理以及使用,敬请期待........
假如生活欺骗了你,
不要悲伤不要心急!
忧郁的日子里需要镇静;
相信吧,快乐的日子将会来临!
心儿永远向往着未来;
现在却常是忧郁。
一切都是瞬息,一切都将会过去;
而那过去了的,就会成为亲切的怀恋。