elasticsearch集群cluster示例詳解
前言
上一篇通過clusterservice對cluster做了一個簡單的概述, 應(yīng)該能夠給大家一個初步認識。本篇將對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操作都要停止,當(dāng)前的任務(wù)是選舉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構(gòu)成。阻塞級別主要用于節(jié)點間對于index的操作的阻塞,如某個index在進行恢復(fù)過程時,它的狀態(tài)是MATEDATA級別,此時不能夠?qū)ζ溥M行任何讀寫操作。 RestStatus主要用于restful請求的阻塞。最后要說的就是ack機制,集群的很多操作都需要節(jié)點響應(yīng)。因此cluster定義了ack的請求和響應(yīng)接口。所有需要ack的請求通過實現(xiàn)此ack接口都能夠?qū)崿F(xiàn)。另外集群還涉及matedata和routing,這兩部分其實都是針對數(shù)據(jù)(index),如matedata主要是mapping,index, alias的相關(guān)元數(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);
//會超時的任務(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;
}
}
}上面的代碼邏輯很簡單,對于提交的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)在后面的分析中會逐步分析,希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot優(yōu)化后啟動速度快到飛起技巧示例
這篇文章主要為大家介紹了Spring Boot優(yōu)化后啟動速度快到飛起的技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07
Spring通過c3p0配置bean連接數(shù)據(jù)庫
這篇文章主要為大家詳細介紹了Spring通過c3p0配置bean連接數(shù)據(jù)庫,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-08-08
SpringBoot FreeWorker模板技術(shù)解析
這篇文章主要介紹了SpringBoot FreeWorker模板技術(shù)解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11
基于Jenkins自動打包并部署docker環(huán)境的操作過程
這篇文章主要介紹了基于Jenkins自動打包并部署docker環(huán)境,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08

