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

elasticsearch集群cluster示例詳解

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

前言

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

節(jié)點DiscoveryNode

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

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

集群阻塞

集群還需要有一個機制就是集群阻塞,因為處于不同狀態(tài)的集群能夠進行的操作不同,如沒有master節(jié)點的時候,所有的master操作都要停止,當前的任務是選舉master,此時一個block就會引發(fā),通知集群所有節(jié)點。不同于同一個jvm中的同步,不同的節(jié)點處在不同的jvm中,jvm的同步機制無法使用,因此只能使用這種阻塞機制進行節(jié)點間的協(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),阻塞級別(READ(0),WRITE(1), METADATA(2)),及restful狀態(tài)碼RestStatus構成。阻塞級別主要用于節(jié)點間對于index的操作的阻塞,如某個index在進行恢復過程時,它的狀態(tài)是MATEDATA級別,此時不能夠?qū)ζ溥M行任何讀寫操作。 RestStatus主要用于restful請求的阻塞。最后要說的就是ack機制,集群的很多操作都需要節(jié)點響應。因此cluster定義了ack的請求和響應接口。所有需要ack的請求通過實現(xiàn)此ack接口都能夠?qū)崿F(xiàn)。另外集群還涉及matedata和routing,這兩部分其實都是針對數(shù)據(jù)(index),如matedata主要是mapping,index, alias的相關元數(shù)據(jù),因此這兩部分會在分析數(shù)據(jù)功能時在做分析。

clusterService接口

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

這里著重說一下submitStateUpdateTask的實現(xiàn)。對于節(jié)點來說,如果它探測到集群狀態(tài)的更新,如果它是master則它需要向其它節(jié)點發(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);
       //會超時的任務
            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;
            }
        }
    }

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

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

總結(jié)

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

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

相關文章

最新評論

呼和浩特市| 文成县| 北流市| 宜阳县| 吴川市| 奎屯市| 牟定县| 马山县| 常宁市| 闽清县| 古丈县| 晋江市| 内乡县| 德惠市| 南投市| 高碑店市| 安庆市| 义乌市| 霍州市| 囊谦县| 昆明市| 太仓市| 阿勒泰市| 修武县| 二手房| 集安市| 大方县| 义马市| 秦皇岛市| 枣阳市| 阿合奇县| 北流市| 福海县| 柳江县| 庆城县| 株洲县| 千阳县| 苏州市| 信丰县| 呈贡县| 关岭|