您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“elasticsearch元數據怎么構建metadata及routing類”,內容詳細,步驟清晰,細節處理妥當,希望這篇“elasticsearch元數據怎么構建metadata及routing類”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
雖然在剛開始源碼概述時把代碼分為分布式和數據兩部分,但是它們的界限并不明顯。之前這幾篇可以說是這兩部分的銜接。我們在快速接近數據(index)部分。本篇分析一下之前分析cluster遺留下的問題:Metadata與routing,雖然這兩部分的代碼在cluster中,但是卻直接和index相關。
metadata部分主要是和索引相關的一些元數據構建和操作。
別名元數據(AliasMetaData):索引別名相關,將索引通過別名映射到相關的路由上;
索引元數據(IndexMetaData):索引相關的,如shard數目replica數目, 創建時間等;
索引模板元數據(IndexTemplateMetaData):模板相關,如預設的mapping, aliases等 ;
mapping元數據(MappingMetadata):mapping相關的元數據,如id,routing等;
以及RestoreMetadata和 SnapshortMetadata等。這些metadata囊括了索引相關的所有元數據,這些元數據都是集群級別,我個人認為這也是這部分放到cluster的原因。
metadata是相關功能集群級別的配置信息,它們大都類似于數據類本身的邏輯并不復雜,都是由field和一些對field的set和get方法組成,但是它的有些field本身又是類。而且有些metadata類提供了更加復雜的數據操作方法,如MappingMetadata會有build及對于一些數據格式分析的方法。這里簡單分析兩個進行說明。
下圖是IndexMetadata的部分fields:
可以看到就是一些index相關的元數據,很多都是使用中必須解除到的。如Mapping等。方法上也大多是get與set,并沒有太多復雜的邏輯。不同于IndexMetadata,MappingMetaData的filed則多數是內部分類,如下圖所示:
這里的id,routing和timestamp字段都是內部類,因為這些字段還包含其它邏輯,無法通過基本數據類型實現。而Mapping中的關鍵部分內容字段映射則是一個壓縮字符串(source),這是一個json格式的字符串。因此MappingMetadata則包含了很多更復雜的方法用來解析source。
其它的metadata類跟著兩個非常類似就不再一一說明,有興趣的話請參考相關源碼。最后來看一下MetaData相關的service,這些service對外提供了對相關MetaData讀取和操作的接口。這里以MappingMetaDataService為例做個簡單的說明,它的類圖如下所示:
MappingMetaDataService對外提供了MappingMetaData的更新,移除等相關操作,這些方法涉及到了索引的相關操作,這里就不展開,在后面索引的分析中會有涉及。
以上就metadata的相關分析,這一部分自身不涉及太復雜的邏輯,復雜的邏輯都在service中,但是因為service的方法會牽扯到Index的操作,因此這里就先簡單分析,后面索引的相關分析中再來仔細說明相關方法。
同MetaData類似,routing這一部分主要是集群中索引的路由的相關元數據,但和MetaData不同的是,這一部分有層次結構。ShardRouting是最基本元素,由它構成index的
IndexRoutingTable,最后由IndexRoutingTable構成集群的RoutingTable。
如下圖所示:
一個Routing本質上是一個可以序列化的XContent,ImmutableShardRount中是Routing中不可變的字段及他們的set和get方法如id, version等。MutableShardRouting中主要是相關的shard操作,如重分配,primaryshard的變動等。一個shard的primary和所有的replica組成一個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中記錄著一個shard所有狀態的replica。index由多個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線記錄了每個節點上的shard的路由信息,由shardRouting構成nodeRoutingTable,然由NodeRoutingTable構成NodesRoutingTable(集群shardRouting)。
同所有是其它模塊一樣,這些Routing的相關操作也是由service對外提供,另外這一部分還有以下shard操作的相關類如ShardIterator,ShardShuffle等。
讀到這里,這篇“elasticsearch元數據怎么構建metadata及routing類”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。