最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

elasticsearch集群cluster示例詳解

 更新時(shí)間:2022年04月21日 15:26:31   作者:zziawan  
這篇文章主要為大家介紹了elasticsearch集群cluster示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

上一篇通過clusterservice對(duì)cluster做了一個(gè)簡(jiǎn)單的概述, 應(yīng)該能夠給大家一個(gè)初步認(rèn)識(shí)。本篇將對(duì)cluster的代碼組成進(jìn)行詳細(xì)分析,力求能夠?qū)luster做一個(gè)更清晰的描述。cluster作為多個(gè)節(jié)點(diǎn)的協(xié)同工作機(jī)制,它需要節(jié)點(diǎn),節(jié)點(diǎn)間通信,各個(gè)節(jié)點(diǎn)的狀態(tài)及各個(gè)節(jié)點(diǎn)上的數(shù)據(jù)(index)狀態(tài)。因此這一部分代碼包括了上述的幾個(gè)部分。

節(jié)點(diǎn)DiscoveryNode

首先是節(jié)點(diǎn)(DiscoveryNode),這里的節(jié)點(diǎn)不同于之前所說的node,只是集群上一個(gè)邏輯意義上的節(jié)點(diǎn),只是一個(gè)實(shí)際節(jié)點(diǎn)的描述信息。它實(shí)現(xiàn)了Streamable接口和  serializable接口,可以在物理節(jié)點(diǎn)上傳輸。下圖是它的field:

可以看到它只是一個(gè)節(jié)點(diǎn)的信息描述。在集群中每個(gè)節(jié)點(diǎn)會(huì)被抽象成一個(gè)DiscoveryNode,這些DiscoveryNode被封裝到DiscoveryNodes中,同時(shí)提供一下操作如查找,連接等。這樣集群維護(hù)所有節(jié)點(diǎn)的信息,同時(shí)可以根據(jù)集群狀態(tài)進(jìn)行節(jié)點(diǎn)的操作。

集群阻塞

集群還需要有一個(gè)機(jī)制就是集群阻塞,因?yàn)樘幱诓煌瑺顟B(tài)的集群能夠進(jìn)行的操作不同,如沒有master節(jié)點(diǎn)的時(shí)候,所有的master操作都要停止,當(dāng)前的任務(wù)是選舉master,此時(shí)一個(gè)block就會(huì)引發(fā),通知集群所有節(jié)點(diǎn)。不同于同一個(gè)jvm中的同步,不同的節(jié)點(diǎn)處在不同的jvm中,jvm的同步機(jī)制無法使用,因此只能使用這種阻塞機(jī)制進(jìn)行節(jié)點(diǎn)間的協(xié)調(diào)。它的部分代碼如下所示:

public class ClusterBlock implements Serializable, Streamable, ToXContent {
    private int id;
    private String description;
    private EnumSet<ClusterBlockLevel> levels;
    private boolean retryable;
    private boolean disableStatePersistence = false;
    private RestStatus status;
    ClusterBlock() {
    }
    public ClusterBlock(int id, String description, boolean retryable, boolean disableStatePersistence, RestStatus status, EnumSet<ClusterBlockLevel> levels) {
        this.id = id;
        this.description = description;
        this.retryable = retryable;
        this.disableStatePersistence = disableStatePersistence;
        this.status = status;
        this.levels = levels;
    }
}

阻塞主要由三部分組成,描述(description),阻塞級(jí)別(READ(0),WRITE(1), METADATA(2)),及restful狀態(tài)碼RestStatus構(gòu)成。阻塞級(jí)別主要用于節(jié)點(diǎn)間對(duì)于index的操作的阻塞,如某個(gè)index在進(jìn)行恢復(fù)過程時(shí),它的狀態(tài)是MATEDATA級(jí)別,此時(shí)不能夠?qū)ζ溥M(jìn)行任何讀寫操作。 RestStatus主要用于restful請(qǐng)求的阻塞。最后要說的就是ack機(jī)制,集群的很多操作都需要節(jié)點(diǎn)響應(yīng)。因此cluster定義了ack的請(qǐng)求和響應(yīng)接口。所有需要ack的請(qǐng)求通過實(shí)現(xiàn)此ack接口都能夠?qū)崿F(xiàn)。另外集群還涉及matedata和routing,這兩部分其實(shí)都是針對(duì)數(shù)據(jù)(index),如matedata主要是mapping,index, alias的相關(guān)元數(shù)據(jù),因此這兩部分會(huì)在分析數(shù)據(jù)功能時(shí)在做分析。

clusterService接口

說完了DiscoveryNode和block,接下來通過clusterService接口,它的作用主要是提供對(duì)外調(diào)用。這個(gè)接口主要提供Listener,block的add和remove及cluster狀態(tài)的更新提交。cluster只是一個(gè)理論上的實(shí)體,其實(shí)并不存在,所有功能都是由各個(gè)節(jié)點(diǎn)來完成的。因此clusterService接口主要方法是集群狀態(tài)監(jiān)聽器的操作。它的類圖:

這里著重說一下submitStateUpdateTask的實(shí)現(xiàn)。對(duì)于節(jié)點(diǎn)來說,如果它探測(cè)到集群狀態(tài)的更新,如果它是master則它需要向其它節(jié)點(diǎn)發(fā)布。代碼如下:

public void submitStateUpdateTask(final String source, Priority priority, final ClusterStateUpdateTask updateTask) {
        if (!lifecycle.started()) {
            return;
        }
        try {
       //封裝成updateTask
            final UpdateTask task = new UpdateTask(source, priority, updateTask);
       //會(huì)超時(shí)的任務(wù)
            if (updateTask instanceof TimeoutClusterStateUpdateTask) {
                final TimeoutClusterStateUpdateTask timeoutUpdateTask = (TimeoutClusterStateUpdateTask) updateTask;
                updateTasksExecutor.execute(task, threadPool.scheduler(), timeoutUpdateTask.timeout(), new Runnable() {
                    @Override
                    public void run() {
                        threadPool.generic().execute(new Runnable() {
                            @Override
                            public void run() {
                                timeoutUpdateTask.onFailure(task.source(), new ProcessClusterEventTimeoutException(timeoutUpdateTask.timeout(), task.source()));
                            }
                        });
                    }
                });
            } else {
                updateTasksExecutor.execute(task);
            }
        } catch (EsRejectedExecutionException e) {
            // ignore cases where we are shutting down..., there is really nothing interesting
            // to be done here...
            if (!lifecycle.stoppedOrClosed()) {
                throw e;
            }
        }
    }

上面的代碼邏輯很簡(jiǎn)單,對(duì)于提交的task進(jìn)行封裝然后運(yùn)行。這里運(yùn)行的是ClusterStateUpdateTask, 它的實(shí)現(xiàn)很多,無法一一說明。但是它的方法說明了一切,它的類圖如下所示:

子類的主要邏輯實(shí)現(xiàn)都在execute方法中,比如ZenDiscovery中handleMasterGone中的實(shí)現(xiàn),master丟失后會(huì)進(jìn)行master選舉或者是試圖加入新組成的集群。這些在后面的分析中可以看到。

總結(jié)

cluster是由很多功能組成的,如DiscoveryNode,block等。這一部分的主要代碼是提供一些集群狀態(tài)更新及監(jiān)聽的接口。集群狀態(tài)的更新發(fā)布master獨(dú)有的功能,但是監(jiān)聽集群狀態(tài)變得時(shí)每個(gè)節(jié)點(diǎn)都需要的。

這些功能的具體實(shí)現(xiàn)在后面的分析中會(huì)逐步分析,希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中FTPClient上傳中文目錄、中文文件名亂碼問題解決方法

    Java中FTPClient上傳中文目錄、中文文件名亂碼問題解決方法

    這篇文章主要介紹了Java中FTPClient上傳中文目錄、中文文件名亂碼問題解決方法,本文使用apache-commons-net工具包時(shí)遇到這個(gè)問題,解決方法很簡(jiǎn)單,需要的朋友可以參考下
    2015-05-05
  • java將excel轉(zhuǎn)為pdf的方法步驟

    java將excel轉(zhuǎn)為pdf的方法步驟

    之前工作需要,查了挺多種Excel轉(zhuǎn)PDF的方法,下面這篇文章主要給大家介紹了關(guān)于java將excel轉(zhuǎn)為pdf的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • 工廠方法模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    工廠方法模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了工廠方法模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理的相關(guān)資料,需要的朋友可以參考下
    2017-08-08
  • JAVA中try-catch結(jié)構(gòu)之異常處理的使用方法

    JAVA中try-catch結(jié)構(gòu)之異常處理的使用方法

    Java編程中一個(gè)非常重要且實(shí)用的概念,可以幫助我們處理代碼運(yùn)行時(shí)發(fā)生的異常情況,下面這篇文章主要給大家介紹了關(guān)于JAVA中try-catch結(jié)構(gòu)之異常處理的使用方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-09-09
  • Java判斷線程池線程是否執(zhí)行完畢

    Java判斷線程池線程是否執(zhí)行完畢

    這篇文章主要介紹了Java判斷線程池線程是否執(zhí)行完畢,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • SpringBoot接受前臺(tái)參數(shù)的6種方式以及統(tǒng)一響應(yīng)代碼示例

    SpringBoot接受前臺(tái)參數(shù)的6種方式以及統(tǒng)一響應(yīng)代碼示例

    這篇文章主要給大家介紹了關(guān)于SpringBoot接受前臺(tái)參數(shù)的6種方式以及統(tǒng)一響應(yīng)的相關(guān)資料,前端負(fù)責(zé)展示頁面和用戶交互,而后端則負(fù)責(zé)處理業(yè)務(wù)邏輯和數(shù)據(jù)存儲(chǔ),在這種架構(gòu)下前端需要將用戶輸入的數(shù)據(jù)發(fā)送給后端進(jìn)行處理,需要的朋友可以參考下
    2023-12-12
  • Java中異常處理之try和catch代碼塊的使用

    Java中異常處理之try和catch代碼塊的使用

    這篇文章主要介紹了Java中異常處理之try和catch代碼塊的使用,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • mybatis多對(duì)多查詢的實(shí)現(xiàn)(xml方式和注解方式)

    mybatis多對(duì)多查詢的實(shí)現(xiàn)(xml方式和注解方式)

    本文主要介紹了mybatis多對(duì)多查詢的實(shí)現(xiàn),有xml方式和注解方式兩種,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • 源碼解析springbatch的job運(yùn)行機(jī)制

    源碼解析springbatch的job運(yùn)行機(jī)制

    這篇文章主要介紹了springbatch的job是如何運(yùn)行的,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • Java中關(guān)于優(yōu)先隊(duì)列PriorityQueue的使用及相關(guān)方法

    Java中關(guān)于優(yōu)先隊(duì)列PriorityQueue的使用及相關(guān)方法

    這篇文章主要介紹了Java中關(guān)于優(yōu)先隊(duì)列PriorityQueue的使用及相關(guān)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08

最新評(píng)論

二手房| 河池市| 西昌市| 德江县| 班戈县| 柳江县| 定襄县| 通渭县| 久治县| 宜黄县| 东至县| 揭西县| 个旧市| 奉新县| 星子县| 灵宝市| 淮阳县| 内江市| 北辰区| 华安县| 十堰市| 永宁县| 普宁市| 来宾市| 石屏县| 芷江| 汝南县| 泾源县| 广德县| 苍梧县| 麦盖提县| 甘谷县| 平武县| 邻水| 沂南县| 庐江县| 两当县| 汽车| 娱乐| 长武县| 瓦房店市|