elasticsearch元數(shù)據(jù)構(gòu)建metadata及routing類(lèi)源碼分析
metadata部分
雖然在剛開(kāi)始源碼概述時(shí)把代碼分為分布式和數(shù)據(jù)兩部分,但是它們的界限并不明顯。之前這幾篇可以說(shuō)是這兩部分的銜接。我們?cè)诳焖俳咏鼣?shù)據(jù)(index)部分。本篇分析一下之前分析cluster遺留下的問(wèn)題:Metadata與routing,雖然這兩部分的代碼在cluster中,但是卻直接和index相關(guān)。
metadata部分主要是和索引相關(guān)的一些元數(shù)據(jù)構(gòu)建和操作。
元數(shù)據(jù)部分主要包括
別名元數(shù)據(jù)(AliasMetaData):索引別名相關(guān),將索引通過(guò)別名映射到相關(guān)的路由上;
索引元數(shù)據(jù)(IndexMetaData):索引相關(guān)的,如shard數(shù)目replica數(shù)目, 創(chuàng)建時(shí)間等;
索引模板元數(shù)據(jù)(IndexTemplateMetaData):模板相關(guān),如預(yù)設(shè)的mapping, aliases等 ;
mapping元數(shù)據(jù)(MappingMetadata):mapping相關(guān)的元數(shù)據(jù),如id,routing等;
以及RestoreMetadata和 SnapshortMetadata等。這些metadata囊括了索引相關(guān)的所有元數(shù)據(jù),這些元數(shù)據(jù)都是集群級(jí)別,我個(gè)人認(rèn)為這也是這部分放到cluster的原因。
metadata是相關(guān)功能集群級(jí)別的配置信息,它們大都類(lèi)似于數(shù)據(jù)類(lèi)本身的邏輯并不復(fù)雜,都是由field和一些對(duì)field的set和get方法組成,但是它的有些field本身又是類(lèi)。而且有些metadata類(lèi)提供了更加復(fù)雜的數(shù)據(jù)操作方法,如MappingMetadata會(huì)有build及對(duì)于一些數(shù)據(jù)格式分析的方法。這里簡(jiǎn)單分析兩個(gè)進(jìn)行說(shuō)明。
下圖是IndexMetadata的部分fields:

可以看到就是一些index相關(guān)的元數(shù)據(jù),很多都是使用中必須解除到的。如Mapping等。方法上也大多是get與set,并沒(méi)有太多復(fù)雜的邏輯。不同于IndexMetadata,MappingMetaData的filed則多數(shù)是內(nèi)部分類(lèi),如下圖所示:

這里的id,routing和timestamp字段都是內(nèi)部類(lèi),因?yàn)檫@些字段還包含其它邏輯,無(wú)法通過(guò)基本數(shù)據(jù)類(lèi)型實(shí)現(xiàn)。而Mapping中的關(guān)鍵部分內(nèi)容字段映射則是一個(gè)壓縮字符串(source),這是一個(gè)json格式的字符串。因此MappingMetadata則包含了很多更復(fù)雜的方法用來(lái)解析source。
其它的metadata類(lèi)跟著兩個(gè)非常類(lèi)似就不再一一說(shuō)明,有興趣的話請(qǐng)參考相關(guān)源碼。最后來(lái)看一下MetaData相關(guān)的service,這些service對(duì)外提供了對(duì)相關(guān)MetaData讀取和操作的接口。這里以MappingMetaDataService為例做個(gè)簡(jiǎn)單的說(shuō)明,它的類(lèi)圖如下所示:

MappingMetaDataService對(duì)外提供了MappingMetaData的更新,移除等相關(guān)操作,這些方法涉及到了索引的相關(guān)操作,這里就不展開(kāi),在后面索引的分析中會(huì)有涉及。
以上就metadata的相關(guān)分析,這一部分自身不涉及太復(fù)雜的邏輯,復(fù)雜的邏輯都在service中,但是因?yàn)閟ervice的方法會(huì)牽扯到Index的操作,因此這里就先簡(jiǎn)單分析,后面索引的相關(guān)分析中再來(lái)仔細(xì)說(shuō)明相關(guān)方法。
同MetaData類(lèi)似,routing這一部分主要是集群中索引的路由的相關(guān)元數(shù)據(jù),但和MetaData不同的是,這一部分有層次結(jié)構(gòu)。ShardRouting是最基本元素,由它構(gòu)成index的
IndexRoutingTable,最后由IndexRoutingTable構(gòu)成集群的RoutingTable。
shardRouting,繼承關(guān)系
如下圖所示:

一個(gè)Routing本質(zhì)上是一個(gè)可以序列化的XContent,ImmutableShardRount中是Routing中不可變的字段及他們的set和get方法如id, version等。MutableShardRouting中主要是相關(guān)的shard操作,如重分配,primaryshard的變動(dòng)等。一個(gè)shard的primary和所有的replica組成一個(gè)shardRoutingTable,它的部分代碼如下所示:
public class IndexShardRoutingTable implements Iterable<ShardRouting> {
final ShardShuffler shuffler;
final ShardId shardId;
final ShardRouting primary;
final ImmutableList<ShardRouting> primaryAsList;
final ImmutableList<ShardRouting> replicas;
final ImmutableList<ShardRouting> shards;
final ImmutableList<ShardRouting> activeShards;
final ImmutableList<ShardRouting> assignedShards;
......
}ShardRoutingTable中記錄著一個(gè)shard所有狀態(tài)的replica。index由多個(gè)shard組成,因此IndexRoutingTable由ShardRoutingTable組成,代碼如下所示:
public class IndexRoutingTable implements Iterable<IndexShardRoutingTable> {
private final String index;
private final ShardShuffler shuffler;
// note, we assume that when the index routing is created, ShardRoutings are created for all possible number of
// shards with state set to UNASSIGNED
private final ImmutableOpenIntMap<IndexShardRoutingTable> shards;
private final ImmutableList<ShardRouting> allShards;
private final ImmutableList<ShardRouting> allActiveShards;
.......
}最后所有的IndexRoutingTable組成了集群的RoutingTable:
public class RoutingTable implements Iterable<IndexRoutingTable> {
public static final RoutingTable EMPTY_ROUTING_TABLE = builder().build();
private final long version;
// index to IndexRoutingTable map
private final ImmutableMap<String, IndexRoutingTable> indicesRouting;
.........
}這是indexRoutingTable這條線,另外還有一條RoutingTable,那就是nodeRoutingTable,這條RoutingTable線記錄了每個(gè)節(jié)點(diǎn)上的shard的路由信息,由shardRouting構(gòu)成nodeRoutingTable,然由NodeRoutingTable構(gòu)成NodesRoutingTable(集群shardRouting)。
同所有是其它模塊一樣,這些Routing的相關(guān)操作也是由service對(duì)外提供,另外這一部分還有以下shard操作的相關(guān)類(lèi)如ShardIterator,ShardShuffle等。
總結(jié)
本篇從結(jié)構(gòu)上對(duì)metadata和Routing部分進(jìn)行了簡(jiǎn)單說(shuō)明,這兩部分連接著cluster和index。這里的說(shuō)明并沒(méi)有深入到方法層面,一則這里的邏輯大部分很簡(jiǎn)單,另外這些方法在后面的數(shù)據(jù)(index)部分的分析中會(huì)有涉及。
以上就是elasticsearch元數(shù)據(jù)構(gòu)建metadata routing源碼分析的詳細(xì)內(nèi)容,更多關(guān)于elasticsearch元數(shù)據(jù)構(gòu)建metadata routing的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- elasticsearch數(shù)據(jù)信息索引操作action?support示例分析
- elasticsearch源碼分析index?action實(shí)現(xiàn)方式
- elasticsearch?java客戶(hù)端action的實(shí)現(xiàn)簡(jiǎn)單分析
- elasticsearch構(gòu)造Client實(shí)現(xiàn)java客戶(hù)端調(diào)用接口示例分析
- elasticsearch集群發(fā)現(xiàn)zendiscovery的Ping機(jī)制分析
- elasticsearch集群cluster?discovery可配式模塊示例分析
相關(guān)文章
Java經(jīng)典設(shè)計(jì)模式之適配器模式原理與用法詳解
這篇文章主要介紹了Java經(jīng)典設(shè)計(jì)模式之適配器模式,簡(jiǎn)單說(shuō)明了適配器模式的概念、原理,并結(jié)合實(shí)例形式分析了java適配器模式的用法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-08-08
Spring Security中防護(hù)CSRF功能詳解
這篇文章主要介紹了Spring Security中防護(hù)CSRF功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
IDEA使用Mybatis插件 MyBatisCodeHelper-Pro的圖文教程
這篇文章主要介紹了IDEA使用Mybatis插件 MyBatisCodeHelper-Pro的教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
實(shí)例詳解MyBatis-plus自動(dòng)填充功能
每次對(duì)數(shù)據(jù)進(jìn)行新增、刪除、修改時(shí)都需要對(duì)這些字段進(jìn)行設(shè)置,雖然新增時(shí)間和修改時(shí)間可以使用數(shù)據(jù)庫(kù)的時(shí)間,但是新增人和修改人就不能使用這樣的功能,下面小編給大家介紹下MyBatis-plus自動(dòng)填充功能的實(shí)例代碼,感興趣的朋友一起看看吧2022-01-01
SpringBoot默認(rèn)包掃描機(jī)制及@ComponentScan指定掃描路徑詳解
這篇文章主要介紹了SpringBoot默認(rèn)包掃描機(jī)制及@ComponentScan指定掃描路徑詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Java基礎(chǔ)之Unsafe內(nèi)存操作不安全類(lèi)詳解
Java是面向?qū)ο笳Z(yǔ)言,在使用Java編程時(shí),大多數(shù)情況下都不會(huì)直接操作內(nèi)存,而且Java也不提倡直接操作內(nèi)存,但是Java中到底有沒(méi)有可以直接操作內(nèi)存的工具類(lèi)呢?有!Java中提供Unsafe類(lèi)可以用來(lái)來(lái)直接操作內(nèi)存,文中詳細(xì)介紹了Unsafe內(nèi)存操作不安全類(lèi),需要的朋友可以參考下2021-06-06
Spring框架JdbcTemplate數(shù)據(jù)庫(kù)事務(wù)管理完全注解方式
這篇文章主要介紹了Spring框架JdbcTemplate數(shù)據(jù)庫(kù)事務(wù)管理及完全注解方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05

