溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

elasticsearch元數(shù)據(jù)怎么構(gòu)建metadata及routing類

發(fā)布時(shí)間:2022-04-22 10:05:43 來(lái)源:億速云 閱讀:235 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“elasticsearch元數(shù)據(jù)怎么構(gòu)建metadata及routing類”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“elasticsearch元數(shù)據(jù)怎么構(gòu)建metadata及routing類”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

    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í)別的配置信息,它們大都類似于數(shù)據(jù)類本身的邏輯并不復(fù)雜,都是由field和一些對(duì)field的set和get方法組成,但是它的有些field本身又是類。而且有些metadata類提供了更加復(fù)雜的數(shù)據(jù)操作方法,如MappingMetadata會(huì)有build及對(duì)于一些數(shù)據(jù)格式分析的方法。這里簡(jiǎn)單分析兩個(gè)進(jìn)行說(shuō)明。

    下圖是IndexMetadata的部分fields:

    elasticsearch元數(shù)據(jù)怎么構(gòu)建metadata及routing類

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

    elasticsearch元數(shù)據(jù)怎么構(gòu)建metadata及routing類

    這里的id,routing和timestamp字段都是內(nèi)部類,因?yàn)檫@些字段還包含其它邏輯,無(wú)法通過(guò)基本數(shù)據(jù)類型實(shí)現(xiàn)。而Mapping中的關(guān)鍵部分內(nèi)容字段映射則是一個(gè)壓縮字符串(source),這是一個(gè)json格式的字符串。因此MappingMetadata則包含了很多更復(fù)雜的方法用來(lái)解析source。

    其它的metadata類跟著兩個(gè)非常類似就不再一一說(shuō)明,有興趣的話請(qǐng)參考相關(guān)源碼。最后來(lái)看一下MetaData相關(guān)的service,這些service對(duì)外提供了對(duì)相關(guān)MetaData讀取和操作的接口。這里以MappingMetaDataService為例做個(gè)簡(jiǎn)單的說(shuō)明,它的類圖如下所示:

    elasticsearch元數(shù)據(jù)怎么構(gòu)建metadata及routing類

    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類似,routing這一部分主要是集群中索引的路由的相關(guān)元數(shù)據(jù),但和MetaData不同的是,這一部分有層次結(jié)構(gòu)。ShardRouting是最基本元素,由它構(gòu)成index的

    IndexRoutingTable,最后由IndexRoutingTable構(gòu)成集群的RoutingTable。

    shardRouting,繼承關(guān)系

    如下圖所示:

    elasticsearch元數(shù)據(jù)怎么構(gòu)建metadata及routing類

    一個(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)類如ShardIterator,ShardShuffle等。

    讀到這里,這篇“elasticsearch元數(shù)據(jù)怎么構(gòu)建metadata及routing類”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI