Elasticsearchソースコード分析のクラスタ健康
8578 ワード
一つのESクラスターを、王朝にたとえると、3つの状態は、こんなものです.緑、太平盛世、国はとても良い 黄色、奸臣当道、国家危在旦夕 赤、皇上は朝に行かないで、どちらが我慢できないのか 緑なら男耕女織、何をするべきか、気にしないで、黄色なら、どの王朝に奸臣がいないのか、我慢できます.しかし赤色であれば、ひどく、ひどく、ほぼしばらく待ってからクラスタが回復します.はい、感性的な認識がありますが、それはいったいどういうことですか.緑、すべて正常 黄色、コピー損失 赤、プライマリスライス損失 ここを見て、おおらかで、こんなに簡単ですね.分かりました.でも、ちょっと待って、ブログを閉じないでください.私たちとして、追求している私たちがいて、このように簡単にだまされてはいけませんか.コードを見なければならないのは真理であり、コードこそ最も真実である.もし学生たちが比喩に満足しなければ、私たちは続けて、私たちは本当に来ます.
クラスタの健全性の表示
集団健康類
返されるこれらの情報は、どういう意味ですか?IDEを開いて探します...最後に
クラスタ状態
スライスルーティングテーブルの状態
スライスルーティングテーブル
ここを見て、少し分かったようですが、始まったり移転中のスライスは、アクティブスライスで、ちょうどメインスライスで、それはアクティブマスタースライスです.なるほど、しかし、学生たちはまた言います.これらは実体類にすぎません.せいぜい小さいですね.焦らないで、見続けましょう.
クラスタヘルスコンピューティング
TransportClusterHealthActionクラスのclusterHealth()メソッドは、クラスタの健康的な計算を担当し、親クラスから優れた伝統を受け継ぎ、Masterノードでこれらの操作を実行します.Masterノードにこの要求を送信していない場合は、大丈夫です.転送します.先にいくつかの待機情報の処理をして、私たちはしばらく関心を持っていないで、テーマに直行します.
クラスタの健全性の表示
curl http://localhost:9200/_cluster/health?pretty=true
{
"cluster_name" : "mycluster",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 4,
"number_of_data_nodes" : 4,
"active_primary_shards" : 778,
"active_shards" : 1556,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0
}
集団健康類
返されるこれらの情報は、どういう意味ですか?IDEを開いて探します...最後に
クラスタ状態
public enum ClusterHealthStatus {
GREEN((byte) 0),
YELLOW((byte) 1),
RED((byte) 2);
//....
スライスルーティングテーブルの状態
public enum ShardRoutingState {
/**
* .
*/
UNASSIGNED((byte) 1),
/**
* ( ).
*/
INITIALIZING((byte) 2),
/**
* .
*/
STARTED((byte) 3),
/**
* .
*/
RELOCATING((byte) 4);
//....
スライスルーティングテーブル
public class ImmutableShardRouting implements Streamable, Serializable, ShardRouting {
//...
@Override
public boolean unassigned() {
return state == ShardRoutingState.UNASSIGNED;
}
@Override
public boolean initializing() {
return state == ShardRoutingState.INITIALIZING;
}
@Override
public boolean active() {
return started() || relocating();
}
@Override
public boolean started() {
return state == ShardRoutingState.STARTED;
}
@Override
public boolean relocating() {
return state == ShardRoutingState.RELOCATING;
}
//...
ここを見て、少し分かったようですが、始まったり移転中のスライスは、アクティブスライスで、ちょうどメインスライスで、それはアクティブマスタースライスです.なるほど、しかし、学生たちはまた言います.これらは実体類にすぎません.せいぜい小さいですね.焦らないで、見続けましょう.
クラスタヘルスコンピューティング
TransportClusterHealthActionクラスのclusterHealth()メソッドは、クラスタの健康的な計算を担当し、親クラスから優れた伝統を受け継ぎ、Masterノードでこれらの操作を実行します.Masterノードにこの要求を送信していない場合は、大丈夫です.転送します.先にいくつかの待機情報の処理をして、私たちはしばらく関心を持っていないで、テーマに直行します.
private ClusterHealthResponse clusterHealth(ClusterHealthRequest request, ClusterState clusterState) {
if (logger.isTraceEnabled()) {
logger.trace(" , [{}]", clusterState.version());
}
// , , routingTable metaData 。
// : , 5 , routingTable , 4 , 。
RoutingTableValidation validation = clusterState.routingTable().validate(clusterState.metaData());
ClusterHealthResponse response = new ClusterHealthResponse(clusterName.value(), validation.failures());
response.numberOfNodes = clusterState.nodes().size();
response.numberOfDataNodes = clusterState.nodes().dataNodes().size();
String[] concreteIndices;
try {
concreteIndices = clusterState.metaData().concreteIndicesIgnoreMissing(request.indices());
} catch (IndexMissingException e) {
return response;
}
// , 3 , ,
for (String index : concreteIndices) {
IndexRoutingTable indexRoutingTable = clusterState.routingTable().index(index);
IndexMetaData indexMetaData = clusterState.metaData().index(index);
if (indexRoutingTable == null) {
continue;
}
ClusterIndexHealth indexHealth = new ClusterIndexHealth(index, indexMetaData.numberOfShards(), indexMetaData.numberOfReplicas(), validation.indexFailures(indexMetaData.index()));
for (IndexShardRoutingTable shardRoutingTable : indexRoutingTable) {
ClusterShardHealth shardHealth = new ClusterShardHealth(shardRoutingTable.shardId().id());
for (ShardRouting shardRouting : shardRoutingTable) {
if (shardRouting.active()) { // , ,
shardHealth.activeShards++;
if (shardRouting.relocating()) {
// the shard is relocating, the one he is relocating to will be in initializing state, so we don't count it
shardHealth.relocatingShards++; //
}
if (shardRouting.primary()) {
shardHealth.primaryActive = true; // ,
}
} else if (shardRouting.initializing()) {
shardHealth.initializingShards++; //
} else if (shardRouting.unassigned()) {
shardHealth.unassignedShards++; //
}
}
if (shardHealth.primaryActive) {
if (shardHealth.activeShards == shardRoutingTable.size()) { //
shardHealth.status = ClusterHealthStatus.GREEN;
} else {
shardHealth.status = ClusterHealthStatus.YELLOW;
}
} else {
// , , ,
shardHealth.status = ClusterHealthStatus.RED;
}
indexHealth.shards.put(shardHealth.getId(), shardHealth);
}
for (ClusterShardHealth shardHealth : indexHealth) {
if (shardHealth.isPrimaryActive()) {
indexHealth.activePrimaryShards++;
}
indexHealth.activeShards += shardHealth.activeShards;
indexHealth.relocatingShards += shardHealth.relocatingShards;
indexHealth.initializingShards += shardHealth.initializingShards;
indexHealth.unassignedShards += shardHealth.unassignedShards;
}
//
indexHealth.status = ClusterHealthStatus.GREEN;
if (!indexHealth.getValidationFailures().isEmpty()) {
indexHealth.status = ClusterHealthStatus.RED;
} else if (indexHealth.getShards().isEmpty()) { // might be since none has been created yet (two phase index creation)
indexHealth.status = ClusterHealthStatus.RED;
} else {
for (ClusterShardHealth shardHealth : indexHealth) {
if (shardHealth.getStatus() == ClusterHealthStatus.RED) { // ,
indexHealth.status = ClusterHealthStatus.RED;
break;
}
if (shardHealth.getStatus() == ClusterHealthStatus.YELLOW) {
indexHealth.status = ClusterHealthStatus.YELLOW;
}
}
}
response.indices.put(indexHealth.getIndex(), indexHealth);
}
for (ClusterIndexHealth indexHealth : response) {
response.activePrimaryShards += indexHealth.activePrimaryShards;
response.activeShards += indexHealth.activeShards;
response.relocatingShards += indexHealth.relocatingShards;
response.initializingShards += indexHealth.initializingShards;
response.unassignedShards += indexHealth.unassignedShards;
}
response.status = ClusterHealthStatus.GREEN;
if (!response.getValidationFailures().isEmpty()) {
response.status = ClusterHealthStatus.RED;
} else if (clusterState.blocks().hasGlobalBlock(RestStatus.SERVICE_UNAVAILABLE)) { //Ping
response.status = ClusterHealthStatus.RED;
} else {
// ,
// The cluster status is controlled by the worst index status.
for (ClusterIndexHealth indexHealth : response) {
if (indexHealth.getStatus() == ClusterHealthStatus.RED) {
response.status = ClusterHealthStatus.RED;
break;
}
if (indexHealth.getStatus() == ClusterHealthStatus.YELLOW) {
response.status = ClusterHealthStatus.YELLOW;
}
}
}
return response;
}