<commit_before>---
title: 维护节点
category: how-to
---

# 维护节点

TiDB 是高可用数据库，可以在部分数据库节点下线的情况下正常运行，因此，我们可以安全地对底层 Kubernetes 节点进行停机维护。在具体操作时，针对 PD/TiKV/TiDB 实例的不同特性，我们还需要采取不同的操作策略。本文档将详细介绍如何对 Kuberentes 节点进行临时或长期的维护操作。

> **注意：**
>
> 长期维护节点前，需要保证 Kubernetes 集群的剩余资源足够运行 TiDB 集群。

## 维护 PD/TiDB 实例所在节点

PD/TiDB 实例的迁移较快，可以采取主动驱逐实例到其它节点上的策略进行节点维护：

1. 检查待维护节点上是否 TiKV 实例，假如存在 TiKV 实例，请参考 [维护 TiKV 实例所在节点](#维护-TiKV-实例所在节点):
    
    ```shell
    $ kubectl get pod --all-namespaces -o wide | grep <node-name>
    ```
	
2. 使用 `kubectl cordon` 命令防止新的 Pod 调度到待维护节点上：

    ```shell
    $ kubectl cordon <node-name>
    ```

3. 使用 `kubectl drain` 命令将待维护节点上的数据库实例迁移到其它实例上：

    ```shell
    $ kubectl drain <node-name> --ignore-daemonsets --delete-local-data
    ```

    运行后，该节点上的 TiDB 实例会自动迁移到其它可用节点上，PD 实例则会在 5 分钟后触发[自动故障转移](/TODO/link-to-auto-failover)补齐节点。

4. 此时，假如希望下线该 Kubernetes 节点，则可以将该节点删除：

    ```shell
    $ kubectl delete node <node-name>
    ```

    假如希望恢复 Kubernetes 节点，则需要在恢复节点后确认其健康状态：

    ```shell
    $ watch kubectl get node <node-name>
    ```
    
    观察到节点进入 `Ready` 状态后，继续操作。

5. 使用 `kubectl uncordon` 命令解除节点的调度限制:

    ```shell
    $ kubectl uncordon <node-name>
    ```

6. 观察 Pod 是否全部恢复正常运行

    ```shell
    $ watch kubectl get -n $namespace pod -o wide
    # 或者
    $ watch tkctl get all
    ```

    Pod 恢复正常运行后，操作结束。

## 维护 TiKV 实例所在节点

TiKV 实例迁移较慢，并且会对集群造成一定的数据迁移负载，因此在维护 TiKV 实例所在节点前，需要根据维护需求选择操作策略：假如是短期节点维护，则不迁移 TiKV 节点，在维护结束后原地恢复节点；假如是短期内不可恢复的节点维护，则需要规划 TiKV 的迁移工作。

### 短期内可恢复的节点维护

针对短期维护，我们可以通过调整 PD 集群的 `max-store-down-time` 配置来增大集群所允许的 TiKV 实例下线时间，在此时间内维护完毕恢复 Kubernetes 节点后，所有该节点上的 TiKV 实例会自动恢复。

调整 `max-store-donw-time` 到合理的的值后，后续的操作方式与 [维护 TiDB/PD 实例所在节点](#维护-TiDB-PD-实例所在节点) 相同。 


### 短期内不可恢复的节点维护

针对短期内不可恢复的节点维护，如节点长期下线等情形，需要使用 `pd-ctl` 主动通知 TiDB 集群下线对应的 TiKV 实例，再手动解除 TiKV 实例与该节点的绑定。

1. 使用 `kubectl cordon` 命令防止新的 Pod 调度到待维护节点上：

    ```shell
    $ kubectl cordon <node-name>
    ```

2. 查看待维护节点上的 TiKV 实例:

    ```shell
	$ tkctl get -A tikv | grep <node-name>
    ```<commit_msg>Fix anchor link<commit_after>---
title: 维护节点
category: how-to
---

# 维护节点

TiDB 是高可用数据库，可以在部分数据库节点下线的情况下正常运行，因此，我们可以安全地对底层 Kubernetes 节点进行停机维护。在具体操作时，针对 PD/TiKV/TiDB 实例的不同特性，我们还需要采取不同的操作策略。本文档将详细介绍如何对 Kuberentes 节点进行临时或长期的维护操作。

> **注意：**
>
> 长期维护节点前，需要保证 Kubernetes 集群的剩余资源足够运行 TiDB 集群。

## 维护 PD/TiDB 实例所在节点

PD/TiDB 实例的迁移较快，可以采取主动驱逐实例到其它节点上的策略进行节点维护：

1. 检查待维护节点上是否 TiKV 实例，假如存在 TiKV 实例，请参考 [维护 TiKV 实例所在节点](#维护-tikv-实例所在节点):
    
    ```shell
    $ kubectl get pod --all-namespaces -o wide | grep <node-name>
    ```
	
2. 使用 `kubectl cordon` 命令防止新的 Pod 调度到待维护节点上：

    ```shell
    $ kubectl cordon <node-name>
    ```

3. 使用 `kubectl drain` 命令将待维护节点上的数据库实例迁移到其它实例上：

    ```shell
    $ kubectl drain <node-name> --ignore-daemonsets --delete-local-data
    ```

    运行后，该节点上的 TiDB 实例会自动迁移到其它可用节点上，PD 实例则会在 5 分钟后触发[自动故障转移](/TODO/link-to-auto-failover)补齐节点。

4. 此时，假如希望下线该 Kubernetes 节点，则可以将该节点删除：

    ```shell
    $ kubectl delete node <node-name>
    ```

    假如希望恢复 Kubernetes 节点，则需要在恢复节点后确认其健康状态：

    ```shell
    $ watch kubectl get node <node-name>
    ```
    
    观察到节点进入 `Ready` 状态后，继续操作。

5. 使用 `kubectl uncordon` 命令解除节点的调度限制:

    ```shell
    $ kubectl uncordon <node-name>
    ```

6. 观察 Pod 是否全部恢复正常运行

    ```shell
    $ watch kubectl get -n $namespace pod -o wide
    # 或者
    $ watch tkctl get all
    ```

    Pod 恢复正常运行后，操作结束。

## 维护 TiKV 实例所在节点

TiKV 实例迁移较慢，并且会对集群造成一定的数据迁移负载，因此在维护 TiKV 实例所在节点前，需要根据维护需求选择操作策略：假如是短期节点维护，则不迁移 TiKV 节点，在维护结束后原地恢复节点；假如是短期内不可恢复的节点维护，则需要规划 TiKV 的迁移工作。

### 短期内可恢复的节点维护

针对短期维护，我们可以通过调整 PD 集群的 `max-store-down-time` 配置来增大集群所允许的 TiKV 实例下线时间，在此时间内维护完毕恢复 Kubernetes 节点后，所有该节点上的 TiKV 实例会自动恢复。

调整 `max-store-donw-time` 到合理的的值后，后续的操作方式与 [维护 PD/TiDB 实例所在节点](#维护-pdtidb-实例所在节点) 相同。 


### 短期内不可恢复的节点维护

针对短期内不可恢复的节点维护，如节点长期下线等情形，需要使用 `pd-ctl` 主动通知 TiDB 集群下线对应的 TiKV 实例，再手动解除 TiKV 实例与该节点的绑定。

1. 使用 `kubectl cordon` 命令防止新的 Pod 调度到待维护节点上：

    ```shell
    $ kubectl cordon <node-name>
    ```

2. 查看待维护节点上的 TiKV 实例:

    ```shell
	$ tkctl get -A tikv | grep <node-name>
    ```
{'fraction_non_alphanumeric': 0.12255508789304283, 'fraction_numerical': 0.004456548650656103, 'mean_word_length': 3.5291479820627805, 'pattern_counts': {'":': 0, '<': 19, '<?xml version=': 0, '>': 25, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5280599', 'n_tokens_mistral': 2733, 'n_tokens_neox': 3181, 'n_words': 368}