# 全集群重启和滚动重启.md

## 全集群重新启动和滚动重启

在某些情况下，您需要执行[全集群重启](https://www.elastic.co/guide/en/elasticsearch/reference/7.6/configuring-tls.html#tls-transport)或滚动重启。在[完全集群重新启动](https://www.elastic.co/guide/en/elasticsearch/reference/current/restart-cluster.html#restart-cluster-full)的情况下 ，您将关闭并重新启动集群中的所有节点，而在[滚动重新启动](https://www.elastic.co/guide/en/elasticsearch/reference/current/restart-cluster.html#restart-cluster-rolling)的情况下 ，您一次将仅关闭一个节点，因此服务不会中断。

### 全集群重启

1.  **禁用分片分配。**

    当您关闭一个节点时，分配过程将等待 `index.unassigned.node_left.delayed_timeout`一分钟（默认情况下为一分钟），然后再开始将该节点上的分片复制到集群中的其他节点，这可能涉及很多I/O。由于该节点不久将要重新启动，因此该I/O是不必要的。您可以通过在关闭节点之前[禁用分配](https://www.elastic.co/guide/en/elasticsearch/reference/current/shards-allocation.html)副本来避免争分夺秒 ：

    ```
     PUT _cluster/settings
     {
       "persistent": {
         "cluster.routing.allocation.enable": "primaries"
       }
     }
    ```
2.  **停止索引编制并执行同步刷新。**

    执行[同步刷新](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-synced-flush-api.html)可加快分片恢复。

    ```
     POST _flush/synced
    ```

    执行同步刷新时，请检查响应以确保没有失败。尽管请求本身仍返回200 OK状态，但在响应正文中列出了由于挂起索引操作而失败的同步刷新操作。如果失败，请重新发出请求。

    请注意，不建议使用同步刷新，并且将在8.0中将其删除。刷新与在Elasticsearch 7.6或更高版本上的同步刷新具有相同的效果。
3.  **暂时停止与活动的机器学习作业和数据馈送相关的任务。**（可选的）

    机器学习功能需要具有白金级许可或更高级别。有关弹性许可证级别的更多信息，请参阅[预订页面](https://www.elastic.co/subscriptions)。

    关闭集群时，有两个选项可以处理机器学习作业和数据馈送：

    *   通过使用[设置的升级模式API](https://www.elastic.co/guide/en/elasticsearch/reference/current/ml-set-upgrade-mode.html)暂时停止与您的机器学习作业和数据馈送相关的任务，并阻止新作业打开 ：

        ```
          POST _ml/set_upgrade_mode?enabled=true
        ```

        禁用升级模式时，作业将使用自动保存的上一个模型状态恢复。此选项避免了在关闭期间管理活动作业的开销，并且比显式停止数据馈送和关闭作业要快。
    * [停止所有数据馈送并关闭所有作业](https://www.elastic.co/guide/en/machine-learning/7.6/stopping-ml.html)。此选项在关闭时保存模型状态。在群集重新启动后重新打开作业时，它们使用完全相同的模型。但是，保存最新的模型状态要比使用升级模式花费更多的时间，尤其是当您有很多作业或具有较大模型状态的作业时。
4. **关闭所有节点。**
   *   如果您使用以下命令运行Elasticsearch `systemd`：

       ```bash
         sudo systemctl stop elasticsearch.service
       ```
   *   如果您正在使用SysV运行Elasticsearch `init`：

       ```bash
         sudo -i service elasticsearch stop
       ```
   *   如果您将Elasticsearch作为守护程序运行：

       ```bash
         kill $(cat pid)
       ```
5. **执行任何需要的更改。**
6.  **重新启动节点。**

    如果您有专用的主节点，请先启动它们，然后等待它们形成集群并选举一个主节点，然后再继续处理数据节点。您可以通过查看日志来检查进度。

    只要有足够的符合主机资格的节点相互发现，它们就会形成一个集群并选举一个主机。那时，您可以使用[cat health](https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-health.html)和[cat nodes](https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-nodes.html) API监视加入集群的节点：

    ```
     GET _cat/health

     GET _cat/nodes
    ```

    该`status`列中返回通过`_cat/health`显示每个节点的健康集群中：`red`，`yellow`，或`green`。
7.  **等待所有节点加入群集，并报告黄色状态。**

    当节点加入集群时，它开始恢复本地存储的所有主分片。该[`_cat/health`](https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-health.html)API最初将报告`status`中`red`，表明并非所有的初级碎片已被分配。

    一旦节点恢复了其本地分片，集群`status`就会切换到 `yellow`，表示所有主分片都已恢复，但并非所有副本分片都已分配。这是可以预期的，因为您尚未重新启用分配。将副本的分配延迟到所有节点都`yellow`可用之后，主服务器便可以将副本分配给已经具有本地分片副本的节点。
8.  **重新启用分配。**

    当所有节点都已加入集群并恢复了其主要分片后，可通过恢复`cluster.routing.allocation.enable`为其默认值来重新启用分配：

    ```
     PUT _cluster/settings
     {
       "persistent": {
         "cluster.routing.allocation.enable": null
       }
     }
    ```

    重新启用分配后，集群便开始将副本分片分配给数据节点。此时，恢复索引和搜索是安全的，但是如果您可以等待直到成功分配了所有主分片和副本分片并且所有节点的状态为，集群就会恢复得更快`green`。

    您可以使用[`_cat/health`](https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-health.html)和 [`_cat/recovery`](https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-recovery.html)API 监视进度：

    ```
     GET _cat/health

     GET _cat/recovery
    ```
9.  **重新启动机器学习作业。**（可选的）

    如果您暂时中止了与机器学习作业相关的任务，请使用 [设置的升级模式API](https://www.elastic.co/guide/en/elasticsearch/reference/current/ml-set-upgrade-mode.html)将它们恢复为活动状态：

    ```
     POST _ml/set_upgrade_mode?enabled=false
    ```

    如果你停止节点之前关闭了所有的机器学习作业，请打开作业，并开始从Kibana或与该数据传送专线[空缺职位](https://www.elastic.co/guide/en/elasticsearch/reference/current/ml-open-job.html)和 [启动数据传送专线](https://www.elastic.co/guide/en/elasticsearch/reference/current/ml-start-datafeed.html)的API。

### 滚动重启

1.  **禁用分片分配。**

    当您关闭一个节点时，分配过程将等待 `index.unassigned.node_left.delayed_timeout`一分钟（默认情况下为一分钟），然后再开始将该节点上的分片复制到集群中的其他节点，这可能涉及很多I / O。由于该节点不久将要重新启动，因此该I / O是不必要的。您可以通过在关闭节点之前[禁用](https://www.elastic.co/guide/en/elasticsearch/reference/current/shards-allocation.html)副本[分配](https://www.elastic.co/guide/en/elasticsearch/reference/current/shards-allocation.html)来避免争分夺秒 ：

    ```
     PUT _cluster/settings
     {
       "persistent": {
         "cluster.routing.allocation.enable": "primaries"
       }
     }
    ```
2.  **停止索引编制并执行同步刷新。**

    执行[同步刷新可](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-synced-flush-api.html)加快分片恢复。

    ```
     POST _flush/synced
    ```

    执行同步刷新时，请检查响应以确保没有失败。尽管请求本身仍返回200 OK状态，但在响应正文中列出了由于挂起索引操作而失败的同步刷新操作。如果失败，请重新发出请求。

    请注意，不建议使用同步刷新，并且将在8.0中将其删除。刷新与在Elasticsearch 7.6或更高版本上的同步刷新具有相同的效果。
3.  **暂时停止与活动的机器学习作业和数据馈送相关的任务。**（可选的）

    机器学习功能需要具有白金级许可或更高级别。有关弹性许可证级别的更多信息，请参阅[预订页面](https://www.elastic.co/subscriptions)。

    关闭集群时，有两个选项可以处理机器学习作业和数据馈送：

    *   通过使用[设置的升级模式API](https://www.elastic.co/guide/en/elasticsearch/reference/current/ml-set-upgrade-mode.html)暂时停止与您的机器学习作业和数据馈送相关的任务，并阻止新作业打开 ：

        ```
          POST _ml/set_upgrade_mode?enabled=true
        ```

        禁用升级模式时，作业将使用自动保存的上一个模型状态恢复。此选项避免了在关闭期间管理活动作业的开销，并且比显式停止数据馈送和关闭作业要快。
    * [停止所有数据馈送并关闭所有作业](https://www.elastic.co/guide/en/machine-learning/7.6/stopping-ml.html)。此选项在关闭时保存模型状态。在群集重新启动后重新打开作业时，它们使用完全相同的模型。但是，保存最新的模型状态要比使用升级模式花费更多的时间，尤其是当您有很多作业或具有较大模型状态的作业时。
    * 如果执行滚动重启，还可以使机器学习作业保持运行状态。关闭机器学习节点时，其作业将自动移至另一个节点并恢复模型状态。此选项使您的作业在关机期间可以继续运行，但会增加群集的负载。
4. **如果滚动重新启动，请关闭单个节点。**
   *   如果您使用以下命令运行Elasticsearch `systemd`：

       ```bash
         sudo systemctl stop elasticsearch.service
       ```
   *   如果您正在使用SysV运行Elasticsearch `init`：

       ```bash
         sudo -i service elasticsearch stop
       ```
   *   如果您将Elasticsearch作为守护程序运行：

       ```bash
         kill $(cat pid)
       ```
5. **执行任何需要的更改。**
6.  **重新启动您更改的节点。**

    启动节点并通过检查日志文件或提交`_cat/nodes`请求来确认其已加入集群：

    ```
     GET _cat/nodes
    ```
7.  **重新启用分片分配。**

    节点加入集群后，删除 `cluster.routing.allocation.enable`设置以启用分片分配并开始使用该节点：

    ```
     PUT _cluster/settings
     {
       "persistent": {
         "cluster.routing.allocation.enable": null
       }
     }
    ```
8.  **如果滚动重启，请重复。**

    当节点已恢复并且群集稳定后，对每个需要更改的节点重复这些步骤。
9.  **重新启动机器学习作业。**（可选的）

    如果您暂时中止了与机器学习作业相关的任务，请使用 [设置的升级模式API](https://www.elastic.co/guide/en/elasticsearch/reference/current/ml-set-upgrade-mode.html)将它们恢复为活动状态：

    ```
     POST _ml/set_upgrade_mode?enabled=false
    ```

    如果你停止节点之前关闭了所有的机器学习作业，请打开作业，并开始从Kibana或与该数据传送专线[空缺职位](https://www.elastic.co/guide/en/elasticsearch/reference/current/ml-open-job.html)和 [启动数据传送专线](https://www.elastic.co/guide/en/elasticsearch/reference/current/ml-start-datafeed.html)的API。

## 将节点添加到集群

当启动Elasticsearch实例时，就是在启&#x52A8;_&#x6E;ode_。Elasticsearch _集群_ 是一组具有相同`cluster.name`属性的节点。当节点加入或离开群集时，群集会自动重新组织以在可用节点之间平均分配数据。

如果您运行的是Elasticsearch的单个实例，那么您将拥有一个节点的集群。所有主分片都驻留在单个节点上。无法分配副本分片，因此群集状态保持黄色。群集可以完全正常运行，但是如果发生故障，则存在数据丢失的风险。

![具有一个节点和三个主分片的集群](https://www.elastic.co/guide/en/elasticsearch/reference/current/setup/images/elas_0202.png)

您将节点添加到群集以增加其容量和可靠性。默认情况下，节点既是数据节点，又有资格被选为控制群集的主节点。您还可以为特定目的配置新节点，例如处理摄取请求。有关更多信息，请参见 [节点](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html)。

将更多节点添加到群集时，它将自动分配副本分片。当所有主分片和副本分片均处于活动状态时，群集状态将变为绿色。

![具有三个节点的集群](https://www.elastic.co/guide/en/elasticsearch/reference/current/setup/images/elas_0204.png)

您可以在本地计算机上运行多个节点，以试验多个节点的Elasticsearch集群的行为。要将节点添加到本地计算机上运行的集群中，请执行以下操作：

1. 设置一个新的Elasticsearch实例。
2. 使用中的`cluster.name`设置 指定集群的名称`elasticsearch.yml`。例如，要将节点添加到`logging-prod`集群，请将行添加`cluster.name: "logging-prod"`到`elasticsearch.yml`。
3. 启动Elasticsearch。节点自动发现并加入指定的集群。

要将节点添加到在多台计算机上运行的集群中，还必须进行 [设置，`discovery.seed_hosts`](https://www.elastic.co/guide/en/elasticsearch/reference/current/discovery-settings.html#unicast.hosts)以便新节点可以发现其其余集群。

有关发现和分片分配的更多信息，请参阅 [_发现和集群形成_](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery.html)以及分片[_分配和集群级路由_](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-cluster.html)。
