ES Meta信息

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/JY_He/article/details/88967251

ES Meta

Meta是用来描述数据的数据,在ES中,Index的mapping结构,配置,持久化状态等就属于meta信息;集群的一些配置信息也属于meta。这个meta信息非常重要,如果某个index的meta信息丢失了,那么集群就认为这个index不再存在了ES中的meta数据只能由master进行更新,master想当于集群的大脑。

Es meta主要包括:

ClusterMeta, MetaData,IndexMetaData

ClusterMeta

集群中的每个节点都会在内存中维护一个当前的ClusterMeta,表示当前集群各个状态。ClusterMeta中包含一个MetaData的结构,MetaData中存储的内容更符合meta特征,而且需要持久化的信息都在metadata中,此外其他一些变量时集群运行中动态构建出来的临时变量;

 

MetaData

Meta主要是一些集群的配置,集群所有的Index的Meta,所有Template的Meta。(虽然IndexMetaData是MetaData的一部分,但是存储上却是分开的)

https://upload-images.jianshu.io/upload_images/2509688-cdb231e6433ffdcc.png?imageMogr2/auto-orient/

 

IndexMetaData

IndexMetaData具体是指某个Index的Meta,比如这个Index的shard数,replica数,mappings等。

IndexMetaData:

long version:当前版本号,每次更新加1

int routingNumShards: 用于routing的shard数, 只能是该Index的numberOfShards的倍数,用于split;

State state: Index的状态, 是个enum,值是OPEN或CLOSE;

Settings settings:numbersOfShards,numbersOfRepilicas等配置;

ImmutableOpenMap<String, MappingMetaData> mappings:Index的mapping;

ImmutableOpenMap<String, Custom> customs:自定义配置;

ImmutableOpenMap<String, AliasMetaData> aliases: 别名;

long[] primaryTerms:primaryTerm在每次Shard切换Primary时加1,用于保序;

ImmutableOpenIntMap<Set<String>> inSyncAllocationIds:处于InSync状态的AllocationId,用于保证数据一致性

Meta信息的存储:

启动ES的一个节点,会配置一个data目录,如下:

https://upload-images.jianshu.io/upload_images/2509688-2cf37bf01af032db.png?imageMogr2/auto-orient/

扫描二维码关注公众号,回复: 6090666 查看本文章

其中,es会把Meta和Data都写入到这个目录中,其中目录名为_state的代表该目录存储的是meta文件,根据文件层级不同,共有三种meta存储:

nodes/0/state:

该目录下的global-1.st文件存储的是上文介绍的MetaData中除去IndexMetaData的部分,即一些集群级别的配置和templates。node-0.st中存储的是NodeId;

nodes/0/indices:

这层目录是索引级别的,2Scrm6nuQOOxUN2ewtrNJw是IndexId,该目录下的state-2.st文件存储的是上文介绍的IndexMetaData;

nodes/0/indices/2Scrm6nuQOOxUN2ewtrNJw/0/_state/:

这层目录是shard级别的,该目录下的state-0.st存储的是ShardStateMetaData,包含primary和allocationId等信息。ShardStateMetaData是在IndexShard模块中管理

可以看到cluster的MetaData和Index的MetaData是在不同目录存储的。另外,集群相关的Meta会在所有的MasterNode和DataNode上存储,而Index的Meta会在所有的MasterNode和存储该Index数据的DataNode上存储。

注意:为什么MetaData由MasterNode管理还要在DataNode上。主要原因是考虑到数据安全性,在一个集群只配置了一个master时,如果当前master节点不可用,就会出现master丢失,严重后果

Meta信息恢复

如果es集群重启后,所有进程内存中没有了之前的Meta信息,需要一个角色来恢复Meta,这个角色就是集群中的Master。所以ES集群会先进行Master选举,选出Master后,进行故障恢复。当Master选举出来后,还需要等待某些条件:例如集群节点数大于某个特定值,避免一些DataNode还没有连接上来,造成不必要的数据恢复。

当Master进程决定进行Meta恢复时,它回向集群中的MasterNode和DataNode请求其他机器上的MetaData。对于集群的MetaData,选择Version最大的版本。对于Index Meta也是选择其中最大的。然后,再将集群的Meta和Index Meta组合起来,组成最新的Meta。

参考链接:https://www.jianshu.com/p/8601bc17a270

猜你喜欢

转载自blog.csdn.net/JY_He/article/details/88967251
es
今日推荐