ES是一个近实时的查询系统,基于其倒排索引的结构,使得其在根据文档值索引文档相当快,在此基础上,多节点,多分片,多副本等设计提高了整个系统的相应速度的同时,也保证了数据的高可用。下面我们介绍一下ES的存储结构。
Node
节点一般指的是我们部署集群的服务器,一个服务器我们认为是一个节点。这些节点中会存在一个主节点,是通过选举出来的,关于master选举,主要思想还是基于高可用的的分布式选举。内容可以参考master选举链接。
在节点启动之前可以配置节点的属性:
node.master:true
node.data:true
这两个配置某人都是true。如果配置了node.master:true则说明这个节点是master 候选节点 在选举时可以被选举为master节点。node.data 数据节点,如果配置为true 则这个节点将会负责数据的查询,存储,聚合等操作,一般数据节点的网络I/O较高,对于数据节点的机器需要较宽的贷款,磁盘最好使用SSD。
在我们的集群中,目前所有的节点都是数据节点,数据节点中有一大部分作为master候选节点。这样设计的原因是当时申请集群资源时给的是统一的配置的机器,且配置较高。
路由
路由其实是集群的元数据。里面记录每个索引对应的分片数据,以及每个分片存储在哪个node上。单个get查询时,可以根据id直接计算出所属的分片,直接去分片查询,当时过滤search查询时,可以并行的在一个索引的多个分片上查询,加快查询速度。
index
索引,区分Lucene索引,这里的索引可以理解成mysql的数据库表。而Lucene索引其实对应的index下的一个分片。在创建索引时,需要指定索引的模板,即元数据信息,并指定索引元数据的哪些字段。如果不指定索引的字段,在查询时无法使用term进行查询。数据一般以json的方式存入到索引中。在创建索引时,除了要指定元数据外还需要指定索引的主分片个数,以及每个主分片副本的个数。一般主分片的个数设置为何node节点一致,副本分片设置为1。用来保证数据的高可用。
shard(Lucene 索引)
每个分片为一个Lucene索引,本身就是一个单独的搜索引擎,也是底层最基本的读写单元。分片的作用是将大数据量切分成多个分片,这些分片又会存储在不同的节点上,这样,这些数据可以并行操作。一个分片上会包含多个segment段。
segment
每个segment是一个单独的倒排索引。每次es通过refresh将数据刷新到到文件时,同时也会生成一个segment。每个segment包换若干条数据,其中中不同的字段会建立单独的倒排索引。每个倒排索引又会包含多个词,这些词使用B-Tree的结构组织起来。
集群状态
集群的状态分为三个颜色:Green,Yellow,Red。三个颜色分别代表的时:
- Green:集群所有的分片和副本处于在线状态;
- Yellow:集群中所有索引的主分片处于在线状态,部分副本可能不在线,这个时候的写请求没有影响,单数读请求不能路由到其他的分片,查询速度会下降。
- Red:集群中部分索引的主分片处于下先状态,这时候操作的索引的主分片都在线,将不会受太大影响,如果操作的索引的部分主分片存在下线状态,那么查询的数据可能存在缺失。