フルクラスター再起動とローリング再起動
フルクラスター再起動を行いたい場合やローリング再起動を行いたい場合があります。フルクラスター再起動の場合、クラスター内のすべてのノードをシャットダウンして再起動しますが、ローリング再起動の場合は、一度に1つのノードのみをシャットダウンするため、サービスは中断されません。
低水準のしきい値を超えるノードは、再起動が遅くなります。ノードを再起動する前に、ディスク使用量を低水準のしきい値以下に減らしてください。
フルクラスター再起動
- 1. シャードの割り当てを無効にします。
データノードをシャットダウンすると、割り当てプロセスはindex.unassigned.node_left.delayed_timeout
(デフォルトでは1分)待機してから、そのノードのシャードをクラスター内の他のノードに複製し始めます。これには多くのI/Oが関与する可能性があります。ノードはすぐに再起動されるため、このI/Oは不要です。データノードをシャットダウンする前に、割り当てを無効にすることで、時間との競争を避けることができます。
Python
resp = client.cluster.put_settings(
persistent={
"cluster.routing.allocation.enable": "primaries"
},
)
print(resp)
Ruby
response = client.cluster.put_settings(
body: {
persistent: {
'cluster.routing.allocation.enable' => 'primaries'
}
}
)
puts response
Js
const response = await client.cluster.putSettings({
persistent: {
"cluster.routing.allocation.enable": "primaries",
},
});
console.log(response);
コンソール
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "primaries"
}
}
大規模クラスターを再起動する際には、ノードが発見を通じて処理している間に初期の負荷を軽減するために、ゲートウェイ設定を考慮することもできます。
- 2. インデックス作成を停止し、フラッシュを実行します。
フラッシュを実行すると、シャードの回復が速くなります。
Python
resp = client.indices.flush()
print(resp)
Ruby
response = client.indices.flush
puts response
Js
const response = await client.indices.flush();
console.log(response);
コンソール
POST /_flush
- 1. アクティブな機械学習ジョブとデータフィードに関連するタスクを一時的に停止します。(オプション)
機械学習機能には特定のサブスクリプションが必要です。
クラスターをシャットダウンする際に、機械学習ジョブとデータフィードを処理するための2つのオプションがあります:- 機械学習ジョブとデータフィードに関連するタスクを一時的に停止し、アップグレードモードAPIを使用して新しいジョブの開始を防ぎます:
Python
resp = client.ml.set_upgrade_mode(
enabled=True,
)
print(resp)
Ruby
response = client.ml.set_upgrade_mode(
enabled: true
)
puts response
Js
const response = await client.ml.setUpgradeMode({
enabled: "true",
});
console.log(response);
コンソール
POST _ml/set_upgrade_mode?enabled=true
アップグレードモードを無効にすると、ジョブは自動的に保存された最後のモデル状態を使用して再開します。このオプションは、シャットダウン中にアクティブなジョブを管理するオーバーヘッドを回避し、データフィードを明示的に停止してジョブを閉じるよりも速くなります。
- すべてのデータフィードを停止し、すべてのジョブを閉じます。このオプションは、閉じた時点でのモデル状態を保存します。クラスター再起動後にジョブを再開すると、正確に同じモデルを使用します。ただし、最新のモデル状態を保存するには、特に多くのジョブや大きなモデル状態を持つジョブがある場合、アップグレードモードを使用するよりも時間がかかります。
- 2. すべてのノードをシャットダウンします。
- Elasticsearchを
systemd
で実行している場合:sudo systemctl stop elasticsearch.service
- ElasticsearchをSysV
init
で実行している場合:sudo -i service elasticsearch stop
- Elasticsearchをデーモンとして実行している場合:
kill $(cat pid)
- 3. 必要な変更を行います。
- 4. ノードを再起動します。
専用のマスターノードがある場合は、最初にそれらを起動し、クラスターを形成してマスターを選出するのを待ってからデータノードを進めます。進捗状況はログを確認することで確認できます。
十分なマスター候補ノードが互いに発見されると、クラスターが形成され、マスターが選出されます。その時点で、cat healthおよびcat nodes APIを使用して、ノードがクラスターに参加しているかを監視できます。
Python
resp = client.cat.health()
print(resp)
resp1 = client.cat.nodes()
print(resp1)
Ruby
response = client.cat.health
puts response
response = client.cat.nodes
puts response
Js
const response = await client.cat.health();
console.log(response);
const response1 = await client.cat.nodes();
console.log(response1);
コンソール
GET _cat/health
GET _cat/nodes
- 5*.* **すべてのノードがクラスターに参加し、黄色のステータスを報告するのを待ちます。**
ノードがクラスターに参加すると、ローカルに保存されているプライマリシャードを回復し始めます。[`````_cat/health`````](/read/elasticsearch-8-15/fea66d877cf3133a.md) APIは最初に`````status`````の`````red`````を報告し、すべてのプライマリシャードが割り当てられていないことを示します。
ノードがローカルシャードを回復すると、クラスター`````status`````は`````yellow`````に切り替わり、すべてのプライマリシャードが回復されたことを示しますが、すべてのレプリカシャードが割り当てられているわけではありません。これは、まだ割り当てを再有効化していないため、予想されることです。すべてのノードが`````yellow`````になるまでレプリカの割り当てを遅らせることで、マスターはすでにローカルシャードのコピーを持つノードにレプリカを割り当てることができます。
- 6*.* **割り当てを再有効化します。**
すべてのノードがクラスターに参加し、プライマリシャードを回復したら、`````cluster.routing.allocation.enable`````をデフォルトに戻して割り当てを再有効化します:
#### Python
``````python
resp = client.cluster.put_settings(
persistent={
"cluster.routing.allocation.enable": None
},
)
print(resp)
`
Ruby
response = client.cluster.put_settings(
body: {
persistent: {
'cluster.routing.allocation.enable' => nil
}
}
)
puts response
Js
const response = await client.cluster.putSettings({
persistent: {
"cluster.routing.allocation.enable": null,
},
});
console.log(response);
コンソール
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": null
}
}
割り当てが再有効化されると、クラスターはレプリカシャードをデータノードに割り当て始めます。この時点でインデックス作成と検索を再開するのは安全ですが、すべてのプライマリシャードとレプリカシャードが正常に割り当てられ、すべてのノードのステータスがgreen
になるまで待つことができれば、クラスターはより早く回復します。_cat/health
および_cat/recovery
APIを使用して進捗を監視できます:
Python
resp = client.cat.health()
print(resp)
resp1 = client.cat.recovery()
print(resp1)
Ruby
response = client.cat.health
puts response
response = client.cat.recovery
puts response
Js
const response = await client.cat.health();
console.log(response);
const response1 = await client.cat.recovery();
console.log(response1);
コンソール
GET _cat/health
GET _cat/recovery
- 7. 機械学習ジョブを再起動します。(オプション)
機械学習ジョブに関連するタスクを一時的に停止した場合は、アップグレードモードAPIを使用してアクティブな状態に戻します:
Python
resp = client.ml.set_upgrade_mode(
enabled=False,
)
print(resp)
Ruby
response = client.ml.set_upgrade_mode(
enabled: false
)
puts response
Js
const response = await client.ml.setUpgradeMode({
enabled: "false",
});
console.log(response);
コンソール
POST _ml/set_upgrade_mode?enabled=false
すべての機械学習ジョブをノードを停止する前に閉じた場合は、Kibanaからジョブを開き、オープンジョブおよびデータフィードを開始 APIを使用してデータフィードを開始します。
ローリング再起動
- 1. シャードの割り当てを無効にします。
データノードをシャットダウンすると、割り当てプロセスはindex.unassigned.node_left.delayed_timeout
(デフォルトでは1分)待機してから、そのノードのシャードをクラスター内の他のノードに複製し始めます。これには多くのI/Oが関与する可能性があります。ノードはすぐに再起動されるため、このI/Oは不要です。データノードをシャットダウンする前に、割り当てを無効にすることで、時間との競争を避けることができます。
Python
resp = client.cluster.put_settings(
persistent={
"cluster.routing.allocation.enable": "primaries"
},
)
print(resp)
Ruby
response = client.cluster.put_settings(
body: {
persistent: {
'cluster.routing.allocation.enable' => 'primaries'
}
}
)
puts response
Js
const response = await client.cluster.putSettings({
persistent: {
"cluster.routing.allocation.enable": "primaries",
},
});
console.log(response);
コンソール
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "primaries"
}
}
大規模クラスターを再起動する際には、ノードが発見を通じて処理している間に初期の負荷を軽減するために、ゲートウェイ設定を考慮することもできます。
- 2. 非必須のインデックス作成を停止し、フラッシュを実行します。(オプション)
ローリング再起動中にインデックス作成を続けることはできますが、非必須のインデックス作成を一時的に停止し、フラッシュを実行すると、シャードの回復が速くなる可能性があります。
Python
resp = client.indices.flush()
print(resp)
Ruby
response = client.indices.flush
puts response
Js
const response = await client.indices.flush();
console.log(response);
コンソール
POST /_flush
- 3. アクティブな機械学習ジョブとデータフィードに関連するタスクを一時的に停止します。(オプション)
機械学習機能には特定のサブスクリプションが必要です。
クラスターをシャットダウンする際に、機械学習ジョブとデータフィードを処理するための2つのオプションがあります:- 機械学習ジョブとデータフィードに関連するタスクを一時的に停止し、アップグレードモードAPIを使用して新しいジョブの開始を防ぎます:
Python
resp = client.ml.set_upgrade_mode(
enabled=True,
)
print(resp)
Ruby
response = client.ml.set_upgrade_mode(
enabled: true
)
puts response
Js
const response = await client.ml.setUpgradeMode({
enabled: "true",
});
console.log(response);
コンソール
POST _ml/set_upgrade_mode?enabled=true
アップグレードモードを無効にすると、ジョブは自動的に保存された最後のモデル状態を使用して再開します。このオプションは、シャットダウン中にアクティブなジョブを管理するオーバーヘッドを回避し、データフィードを明示的に停止してジョブを閉じるよりも速くなります。
- すべてのデータフィードを停止し、すべてのジョブを閉じます。このオプションは、閉じた時点でのモデル状態を保存します。クラスター再起動後にジョブを再開すると、正確に同じモデルを使用します。ただし、最新のモデル状態を保存するには、特に多くのジョブや大きなモデル状態を持つジョブがある場合、アップグレードモードを使用するよりも時間がかかります。
- ローリング再起動を実行する場合は、機械学習ジョブを実行し続けることもできます。機械学習ノードをシャットダウンすると、そのジョブは自動的に別のノードに移動し、モデル状態を復元します。このオプションにより、シャットダウン中にジョブを実行し続けることができますが、クラスターに対する負荷が増加します。
- 4. ローリング再起動の場合は、単一のノードをシャットダウンします。
- Elasticsearchを
systemd
で実行している場合:sudo systemctl stop elasticsearch.service
- ElasticsearchをSysV
init
で実行している場合:sudo -i service elasticsearch stop
- Elasticsearchをデーモンとして実行している場合:
kill $(cat pid)
- 5. 必要な変更を行います。
- 6. 変更したノードを再起動します。
ノードを起動し、ログファイルを確認するか、_cat/nodes
リクエストを送信してクラスターに参加していることを確認します:
Python
resp = client.cat.nodes()
print(resp)
Ruby
response = client.cat.nodes
puts response
Js
const response = await client.cat.nodes();
console.log(response);
コンソール
GET _cat/nodes
- 7. シャードの割り当てを再有効化します。
データノードの場合、ノードがクラスターに参加したら、cluster.routing.allocation.enable
設定を削除してシャードの割り当てを有効にし、ノードを使用し始めます:
Python
resp = client.cluster.put_settings(
persistent={
"cluster.routing.allocation.enable": None
},
)
print(resp)
Ruby
response = client.cluster.put_settings(
body: {
persistent: {
'cluster.routing.allocation.enable' => nil
}
}
)
puts response
Js
const response = await client.cluster.putSettings({
persistent: {
"cluster.routing.allocation.enable": null,
},
});
console.log(response);
コンソール
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": null
}
}
- 8. ローリング再起動の場合は繰り返します。
ノードが回復し、クラスターが安定したら、変更が必要な各ノードに対してこれらの手順を繰り返します。 - 9. 機械学習ジョブを再起動します。(オプション)
機械学習ジョブに関連するタスクを一時的に停止した場合は、アップグレードモードAPIを使用してアクティブな状態に戻します:
Python
resp = client.ml.set_upgrade_mode(
enabled=False,
)
print(resp)
Ruby
response = client.ml.set_upgrade_mode(
enabled: false
)
puts response
Js
const response = await client.ml.setUpgradeMode({
enabled: "false",
});
console.log(response);
コンソール
POST _ml/set_upgrade_mode?enabled=false
ノードを停止する前にすべての機械学習ジョブを閉じた場合は、Kibanaからジョブを開き、オープンジョブおよびデータフィードを開始 APIを使用してデータフィードを開始します。