ElasticSearch集群数据备份恢复详解

概述

官方推荐的ElasticSearch备份方案为Snapshot,对运行中集群做全量 + 增量备份,不影响读写。

Snapshot也就是快照,在某一时间点的集群一致性镜像。其原理为:

  • 基于文件系统块级快照:
    • 首次快照:复制所有分片数据块。可以理解成首次快照为全量备份
    • 后续快照:只复制新增 / 修改的块,共享未变块(节省空间)。可以理解成后续快照就是增量备份。
  • 快照存储在独立仓库,与集群数据目录分离。
  • 一致性保证:快照过程中,分片数据冻结时间点,新写入不影响已拍快照。

数据存储仓库

ES集群数据备份存储支持以下几种存储类型

存储类型 适用场景 要求
共享文件系统(NFS/NAS/CephFS) 自建机房、私有云集群 所有ES节点必须挂载同一个共享路径,且elasticsearch.yml中配置path.repo允许该路径
对象存储(S3/OSS/COS/OBS) 云原生集群、容灾备份 安装对应repository插件(如repository-s3/repository-oss)
HDFS 大数据生态集群 安装repository-hdfs插件

集群备份之NFS存储

节点设计

选3节点中的任意一个闲置节点(生产环境建议使用独立本地服务器)作为NFS存储服务器,另外两个节点通过NFS协议挂载共享目录,实现3节点统一访问备份路径:

角色 IP地址 备份路径 说明
NFS服务器(节点1) 192.168.1.10 /data00/nfs/es_backup 本地物理磁盘,作为共享存储源
ES节点2 192.168.1.11 /data00/nfs/es_backup 挂载节点1的NFS共享目录
ES节点3 192.168.1.12 /data00/nfs/es_backup 挂载节点1的NFS共享目录

备份基础配置

1.1 NFS服务端配置(节点1执行)

复制代码
# 下载nfs
root@master:~# apt install nfs-kernel-server rpcbind -y

# 创建备份目录
root@master:~# mkdir -p /data00/nfs/es_backup
root@master:~# chown -R elasticsearch:elasticsearch /data00/nfs/es_backup
root@master:~# chmod 777 /data00/nfs/es_backup

# 3. 配置NFS共享规则,允许3节点网段访问
# anongid和anongid为你集群elasticsearch用户的UID和GID,用id elasticsearch命令查看
root@master:~# echo "/data00/nfs/es_backup 10.37.0.0/16(rw,sync,no_root_squash,all_squash,anonuid=2002,anongid=2002,no_subtree_check)" >> /etc/exports

root@master:~# exportfs -ra
root@master:~# systemctl restart nfs-kernel-server

1.2 NFS客户端配置(节点2、3执行)

复制代码
# 下载nfs
root@node01:~# apt install -y nfs-common
# 创建共享目录,es集群的节点中,路径都需要保持一致
root@node01:~# mkdir -p /data00/nfs/es_backup
root@node01:~# chown elasticsearch:elasticsearch -R /data00/nfs/es_backup
# 挂载
root@node01:~# mount -t nfs 10.37.97.56:/data00/nfs/es_backup /data00/nfs/es_backup

# 验证
root@node01:~# df -h | grep es_backup

# 写一个文件

10.37.97.56:/data00/nfs/es_backup  492G   13G  454G   3% /data00/nfs/es_backup

1.2 NFS客户端配置(节点2、节点3执行)

复制代码
root@node01:~# apt install -y nfs-common
root@node01:~# mkdir -p /data00/nfs/es_backup
root@node01:~# chown elasticsearch:elasticsearch -R /data00/nfs/es_backup
# 挂载
root@node01:~# mount -t nfs 10.37.97.56:/data00/nfs/es_backup /data00/nfs/es_backup
# 检查
root@node01:~# df -h | grep es_backup

修改ES的配置文件(所有节点执行)

编辑每个节点的config/elasticsearch.yml,添加备份路径白名单:

复制代码
root@master:~# vim /usr/local/elasticsearch/config/elasticsearch.yml 
# 添加以下配置,路径必须和挂载路径完全一致,三个节点的路径必须完全相同,否则快照创建直接失败
path.repo: ["/data00/nfs/es_backup"]

滚动重启所有ES节点

先重启节点2,等待集群状态变绿后再重启节点3,最后重启节点1,保证业务不受影响

检查三个节点的配置是否生效

复制代码
GET _nodes/settings?pretty

# 查看以下的响应
....
"path" : {
          "data" : "/data00/data/elasticsearch",
          "logs" : "/var/log/elasticsearch",
          "home" : "/usr/local/elasticsearch",
          "repo" : [
            "/data00/nfs/es_backup"
          ]
        }
....

备份案例实战测试

第一步:创建快照存储库

复制代码
PUT _snapshot/nfs_es_backup
{
  "type": "fs",
  "settings": {
    "location": "/data00/nfs/es_backup",
    "compress": true,
    "max_snapshot_bytes_per_sec": "50mb",
    "max_restore_bytes_per_sec": "200mb",
    "chunk_size": "1gb",
    "readonly": false
  }
}

# 参数详细解释
local_es_backup:存储库的名称,可指定
location:表示存储路径,和上文es配置文件中配置的保持一致
compress:开启压缩,节省30%-50%本地磁盘空间,生产环境必备优化参数
max_snapshot_bytes_per_sec:备份时的带宽 IO 限速,生产环境必备,不影响业务
max_restore_bytes_per_sec:恢复时的IO限速,恢复一般在非业务时间,所以可以比备份快
chunk_size:大文件分片,避免单个文件过大损坏
readonly:false表示允许写入、创建快照、删除快照,true表示仓库只读,不能写入,不能删除,防止误删备份,极高安全

# 查看存储库
GET /_snapshot
# 返回结果
{
  "nfs_es_backup" : {
    "type" : "fs",
    "settings" : {
      "chunk_size" : "1gb",
      "location" : "/data00/nfs/es_backup",
      "max_restore_bytes_per_sec" : "200mb",
      "readonly" : "false",
      "compress" : "true",
      "max_snapshot_bytes_per_sec" : "50mb"
    }
  }
}

第二步,创建一个索引进行备份删除恢复测试

复制代码
# 创建索引
PUT /user
{
  "settings": {
    "number_of_shards": 3, 
    "number_of_replicas": 1
  }
}

# 查看索引是否创建成功
{
  "user" : {
    "aliases" : { },
    "mappings" : { },
    "settings" : {
      "index" : {
        "routing" : {
          "allocation" : {
            "include" : {
              "_tier_preference" : "data_content"
            }
          }
        },
        "number_of_shards" : "3",
        "provided_name" : "user",
        "creation_date" : "1776410155455",
        "number_of_replicas" : "1",
        "uuid" : "2ezMKqpKTlSWHwMk0vV1Yg",
        "version" : {
          "created" : "7172699"
        }
      }
    }
  }
}

第三步:备份索引

  • 单索引备份

    执行备份

    PUT _snapshot/nfs_es_backup/snapshot_user_test01
    {
    "indices": "user",
    "include_global_state": false
    }

    #参数解释
    nfs_es_backup:存储库名称
    snapshot_user_test01:快照名称
    indices:指定索引名称
    include_global_state:备份索引模板、ILM策略、用户权限、安全配置等全局状态,在全局备份时需要开启

    检查是否备份成功

    GET _snapshot/nfs_es_backup/snapshot_user_test01

    响应

    {
    "snapshots" : [
    {
    "snapshot" : "snapshot_user_test01",
    "uuid" : "JM6FcLzLQ6W-uN58A_k6tA",
    "repository" : "nfs_es_backup",
    "version_id" : 7172699,
    "version" : "7.17.26",
    "indices" : [ # 索引名称
    "user"
    ],
    "data_streams" : [ ],
    "include_global_state" : false,
    "state" : "SUCCESS", # 状态为成功
    "start_time" : "2026-04-17T07:23:33.014Z", #备份开始时间
    "start_time_in_millis" : 1776410613014,
    "end_time" : "2026-04-17T07:23:33.214Z", # 备份结束时间
    "end_time_in_millis" : 1776410613214,
    "duration_in_millis" : 200,
    "failures" : [ ],
    "shards" : {
    "total" : 3,
    "failed" : 0,
    "successful" : 3
    },
    "feature_states" : [ ]
    }
    ],
    "total" : 1,
    "remaining" : 0
    }

    查看一下磁盘中多了哪些内容?

    root@master:/data00/nfs/es_backup# ll
    total 24
    -rw-r--r-- 1 elasticsearch elasticsearch 648 Apr 17 15:23 index-0
    -rw-r--r-- 1 elasticsearch elasticsearch 8 Apr 17 15:23 index.latest
    drwxr-xr-x 3 elasticsearch elasticsearch 4096 Apr 17 15:23 indices
    -rw-r--r-- 1 elasticsearch elasticsearch 202 Apr 17 15:23 meta-JM6FcLzLQ6W-uN58A_k6tA.dat
    -rw-r--r-- 1 elasticsearch elasticsearch 315 Apr 17 15:23 snap-JM6FcLzLQ6W-uN58A_k6tA.dat
    drwxr-xr-x 2 kibana elasticsearch 4096 Apr 17 15:05 tests-ZXO9W4fjQVacYTs7HPAnzA

    解释:

    index-0:仓库的 "目录清单",记录这个仓库里有哪些快照,记录每个快照的名称、UUID、状态、包含索引,相当于仓库的目录表
    index.latest:指向最新的 index-xx 文件,内容只有一个数字:0,ES 用它快速找到当前清单,永远指向最新清单
    indices:这是一个目录,真正的数据备份目录,里面存放着所有索引的分片数据、 Lucene 段文件,增量快照也在这里,占空间99% 的就是它,恢复数据时,从这里读取真实数据
    meta-xxx.dat:快照元数据文件,记录着索引的 mapping,索引的 settings,集群配置,模板、ILM、SLM 策略,恢复时,ES 先读这个文件,重建结构
    snap-xxx.dat:快照本身信息文件,记录着快照开始 / 结束时间,备份了哪些索引,快照状态(SUCCESS/FAILED),分片备份成功数量,ES 通过它判断快照是否有效
    tests-xxxxxx:这是仓库验证临时目录,执行 PUT _snapshot 创建仓库时,ES 会自动创建这个目录,写一个测试文件,验证是否可读写,验证成功后不会自动删除,可以手动删除,不影响任何备份

  • 全集群备份

    PUT _snapshot/nfs_es_backup/snapshot_20260417_full?wait_for_completion=false
    {
    "indices": "*",
    "ignore_unavailable": true,
    "include_global_state": true,
    "partial": false,
    "slices": "auto"
    }

    参数解释

    nfs_es_backup:表示存储库名称
    snapshot_20260417_full:表示快照名称
    wait_for_completion=false:是否等待快照执行完成再返回结果,生产环境建议用false,不然大数据量备份会直接卡死 / 超时!
    indices:备份所有索引,可指定多个:"order_index,user_index"
    ignore_unavailable:忽略不存在的索引,避免备份中断,生产环境建议开启
    include_global_state:全集群备份时必须开启!备份索引模板、ILM策略、用户权限、安全配置等全局状态
    partial:有分片不可用时直接失败,避免生成不完整的备份,生产环境默认用false
    slices:7.3+版本专属:开启并行备份,速度提升2-3倍,生产环境建议用 auto

    查看备份结果:

    GET _snapshot/nfs_es_backup/snapshot_20260417_full

    #响应结果
    {
    "snapshots" : [
    {
    "snapshot" : "snapshot_20260417_full",
    "uuid" : "gjYuTksgRbuCeXNBQLDKmA",
    "repository" : "nfs_es_backup",
    "version_id" : 7172699,
    "version" : "7.17.26",
    "indices" : [
    ".kibana_task_manager_7.17.12_001",
    ".kibana-event-log-7.17.12-000001",
    ".tasks",
    ".ds-.logs-deprecation.elasticsearch-default-2026.04.15-000001",
    ".apm-agent-configuration",
    ".apm-custom-link",
    ".kibana_7.17.12_001",
    "test01",
    ".ds-ilm-history-5-2026.04.15-000001",
    "user",
    ".kibana_security_session_1",
    ".security-7"
    ],
    "data_streams" : [
    "ilm-history-5",
    ".logs-deprecation.elasticsearch-default"
    ],
    "include_global_state" : true,
    "state" : "SUCCESS",
    "start_time" : "2026-04-17T07:44:34.973Z",
    "start_time_in_millis" : 1776411874973,
    "end_time" : "2026-04-17T07:44:35.373Z",
    "end_time_in_millis" : 1776411875373,
    "duration_in_millis" : 400,
    "failures" : [ ],
    "shards" : {
    "total" : 16,
    "failed" : 0,
    "successful" : 16
    },
    "feature_states" : [
    {
    "feature_name" : "kibana",
    "indices" : [
    ".kibana_7.17.12_001",
    ".apm-custom-link",
    ".apm-agent-configuration",
    ".kibana_security_session_1",
    ".kibana_task_manager_7.17.12_001"
    ]
    },
    {
    "feature_name" : "tasks",
    "indices" : [
    ".tasks"
    ]
    },
    {
    "feature_name" : "security",
    "indices" : [
    ".security-7"
    ]
    }
    ]
    }
    ],
    "total" : 1,
    "remaining" : 0
    }

第四步:删除索引

复制代码
# 删除user索引
DELETE /user

# 查看user索引
GET /user

# 响应结果,可以看到索引已经被删除了
{
  "error" : {
    "root_cause" : [
      {
        "type" : "index_not_found_exception",
        "reason" : "no such index [user]",
        "index_uuid" : "_na_",
        "resource.type" : "index_or_alias",
        "resource.id" : "user",
        "index" : "user"
      }
    ],
    "type" : "index_not_found_exception",
    "reason" : "no such index [user]",
    "index_uuid" : "_na_",
    "resource.type" : "index_or_alias",
    "resource.id" : "user",
    "index" : "user"
  },
  "status" : 404
}

第五步:恢复索引

查看快照列表

复制代码
# 查看快照列表
GET _snapshot/nfs_es_backup/_all

## 响应结果
{
  "snapshots" : [
    {
      "snapshot" : "snapshot_user_test01",
      "uuid" : "JM6FcLzLQ6W-uN58A_k6tA",
      "repository" : "nfs_es_backup",
      "version_id" : 7172699,
      "version" : "7.17.26",
      "indices" : [
        "user"
      ],
      "data_streams" : [ ],
      "include_global_state" : false,
      "state" : "SUCCESS",
      "start_time" : "2026-04-17T07:23:33.014Z",
      "start_time_in_millis" : 1776410613014,
      "end_time" : "2026-04-17T07:23:33.214Z",
      "end_time_in_millis" : 1776410613214,
      "duration_in_millis" : 200,
      "failures" : [ ],
      "shards" : {
        "total" : 3,
        "failed" : 0,
        "successful" : 3
      },
      "feature_states" : [ ]
    },
    {
      "snapshot" : "snapshot_20260417_full",
      "uuid" : "gjYuTksgRbuCeXNBQLDKmA",
      "repository" : "nfs_es_backup",
      "version_id" : 7172699,
      "version" : "7.17.26",
      "indices" : [
        ".kibana_task_manager_7.17.12_001",
        ".kibana-event-log-7.17.12-000001",
        ".tasks",
        ".ds-.logs-deprecation.elasticsearch-default-2026.04.15-000001",
        ".apm-agent-configuration",
        ".apm-custom-link",
        ".kibana_7.17.12_001",
        "test01",
        ".ds-ilm-history-5-2026.04.15-000001",
        "user",
        ".kibana_security_session_1",
        ".security-7"
      ],
      "data_streams" : [
        "ilm-history-5",
        ".logs-deprecation.elasticsearch-default"
      ],
      "include_global_state" : true,
      "state" : "SUCCESS",
      "start_time" : "2026-04-17T07:44:34.973Z",
      "start_time_in_millis" : 1776411874973,
      "end_time" : "2026-04-17T07:44:35.373Z",
      "end_time_in_millis" : 1776411875373,
      "duration_in_millis" : 400,
      "failures" : [ ],
      "shards" : {
        "total" : 16,
        "failed" : 0,
        "successful" : 16
      },
      "feature_states" : [
        {
          "feature_name" : "kibana",
          "indices" : [
            ".kibana_7.17.12_001",
            ".apm-custom-link",
            ".apm-agent-configuration",
            ".kibana_security_session_1",
            ".kibana_task_manager_7.17.12_001"
          ]
        },
        {
          "feature_name" : "tasks",
          "indices" : [
            ".tasks"
          ]
        },
        {
          "feature_name" : "security",
          "indices" : [
            ".security-7"
          ]
        }
      ]
    }
  ],
  "total" : 2,
  "remaining" : 0
}
单索引恢复

找到我们的快照名称,开始恢复

复制代码
# 恢复user索引
POST _snapshot/nfs_es_backup/snapshot_user_test01/_restore
{
  "indices": "user",
  "include_global_state": false
}

# 查看user
GET user

# 响应结果
{
  "user" : {
    "aliases" : { },
    "mappings" : { },
    "settings" : {
      "index" : {
        "routing" : {
          "allocation" : {
            "include" : {
              "_tier_preference" : "data_content"
            }
          }
        },
        "number_of_shards" : "3",
        "provided_name" : "user",
        "creation_date" : "1776410155455",
        "number_of_replicas" : "1",
        "uuid" : "EdPqsnqgROWfr9K_2FUKTA",
        "version" : {
          "created" : "7172699"
        }
      }
    }
  }
}

全集群恢复:集群故障时使用

复制代码
POST _snapshot/nfs_es_backup/snapshot_20260417_full/_restore?wait_for_completion=false
{
  "indices": "*",
  "ignore_unavailable": true,
  "include_global_state": true,
  // 恢复时临时优化提升速度
  "index_settings": {
    "index.number_of_replicas": 0,
    "index.refresh_interval": "-1"
  },
  // 可选:恢复时重命名索引,避免覆盖现有索引
  // "rename_pattern": "(.+)",
  // "rename_replacement": "restored_$1"
}

#恢复完成后手动恢复索引配置:
PUT /*/_settings
{
  "index.number_of_replicas": 1,
  "index.refresh_interval": "1s"
}

集群备份之S3存储

ES 官方原生支持对象存储作为备份存储库,所有操作逻辑和本地NFS备份完全一致,仅存储库配置不同,备份/恢复API 100%复用,无需修改原有备份流程。

S3存储适用于亚马逊AWS S3、MinIO本地对象存储、腾讯云COS、华为云OBS、金山云KS3等所有支持S3协议的对象存储

方案优势

  • 无需搭建维护共享存储,容量无限弹性扩容
  • 天然多副本冗余,数据可靠性达99.9999%,适合容灾备份
  • 单位存储成本比本地磁盘低50%以上
  • 支持跨区域复制,实现异地容灾

S3存储配置步骤

插件安装

所有节点需要安装repository-s3插件

  • 在线安装

    root@master:~# elasticsearch-plugin install repository-s3 --batch

    查看

    root@node01:~# elasticsearch-plugin list
    repository-s3

  • 离线安装

先下载对应版本插件包:

官方地址:https://artifacts.elastic.co/downloads/elasticsearch-plugins/repository-s3/repository-s3-<你的ES版本>.zip

MinIO兼容无修改,直接用官方包即可

复制代码
elasticsearch-plugin install file:///本地路径/repository-s3-<版本>.zip --batch

所有节点滚动重启

一个一个节点重启,当一个节点重启完成之后查看集群状态,避免影响业务进行

AK和SK配置

优先选密钥存储到Keystore,避免明文泄露

所有节点执行,把AK/SK存入ES密钥库:

复制代码
# 输入你的access key
root@node01:~# elasticsearch-keystore add s3.client.default.access_key
Enter value for s3.client.default.access_key: 

# 输入你的secret key
root@node01:~# elasticsearch-keystore add s3.client.default.secret_key
Enter value for s3.client.default.secret_key: 

# 修改用户组权限
root@node01:~# chown elasticsearch:elasticsearch -R /data00/software/elasticsearch-7.17.26
# 查看
root@node01:~# elasticsearch-keystore show s3.client.default.access_key
<your access key>
root@node01:~# elasticsearch-keystore show s3.client.default.secret_key
<your secret key>

ES中重载密钥库配置(无需重启ES)

复制代码
POST _nodes/reload_secure_settings

#响应
{
  "_nodes" : {
    "total" : 3,
    "successful" : 3,
    "failed" : 0
  },
  "cluster_name" : "elasticsearch-v7",
  "nodes" : {
    "fx4zORHiRpKFIqdd1dUg3Q" : {
      "name" : "node01"
    },
    "5Hv3CL3zQpGD69QWlQs0Kg" : {
      "name" : "master"
    },
    "si-N5X65SCSxPafqWOFqoA" : {
      "name" : "node02"
    }
  }
}

备份恢复实战

创建存储库

  • minio创建存储库

    PUT _snapshot/minio_backup_repo
    {
    "type": "s3",
    "settings": {
    "bucket": "es-backup",
    "base_path": "es_backup", # 存储路径
    "endpoint": "http://你的MinIO地址:9000", # MinIO服务地址
    "access_key": "MinIO的AK", # 如果没用keystore存可以在这里传(不推荐)
    "secret_key": "MinIO的SK",
    "path_style_access": true, # 必须开启!MinIO强制要求路径风格访问
    "compress": true,
    "chunk_size": "512mb"
    }
    }

  • 亚马逊aws

    PUT _snapshot/aws_backup_repo
    {
    "type": "s3",
    "settings": {
    "bucket": "你的S3桶名",
    "region": "ap-beijing", # 桶所在区域
    "base_path": "es_prod_backup", # 桶内备份路径
    "compress": true, # 开启压缩节省空间
    "max_snapshot_bytes_per_sec": "50mb", # 备份限速
    "max_restore_bytes_per_sec": "100mb", # 恢复限速
    "chunk_size": "1gb", # 大文件分片
    "server_side_encryption": true # 开启服务端加密,满足合规要求
    }
    }

  • 腾讯云COS/华为云OBS 等S3兼容存储

和S3配置完全一致,只需要修改endpoint为对应云厂商的S3兼容地址,开启path_style_access: true即可。

备份恢复

备份恢复参考上面NFS的即可,步骤完全一样

阿里云OSS存储配置

阿里云的和普通的S3配置有点区别。

插件安装(阿里云官方维护,必须和ES版本严格一致)

所有节点滚动重启集群生效。

安全配置(推荐密钥存Keystore)

所有节点执行:

复制代码
# 存储OSS AccessKeyId
elasticsearch-keystore add oss.client.default.access_key_id
# 存储OSS AccessKeySecret
elasticsearch-keystore add oss.client.default.secret_access_key

重载密钥库

复制代码
POST _nodes/reload_secure_settings

创建存储库

复制代码
PUT _snapshot/oss_backup_repo
{
  "type": "oss",
  "settings": {
    "endpoint": "oss-cn-beijing-internal.aliyuncs.com", # 同区域推荐用内网地址,流量免费速度快
    "bucket": "你的OSS桶名",
    "base_path": "es_prod_backup", # OSS内备份路径
    "compress": true,
    "max_snapshot_bytes_per_sec": "100mb", # 阿里云内网速度快可适当调大
    "max_restore_bytes_per_sec": "200mb",
    "chunk_size": "1gb",
    "server_side_encryption": true # 开启OSS服务端加密
  }
}

备份恢复和上文完全一致

ES备份之SLM自动备份策略(生产环境推荐)

SLM 是快照生命周期管理,作用是:

  • 定时自动创建快照(基于 cron)
  • 自动清理旧快照(按时间 / 数量保留)
  • 一次配置,长期生效,由 master 节点调度
  • 快照是增量的,只备份变化的数据,速度快、节省空间

SLM核心策略为:

  • Policy(策略):定义 "何时备、备什么、保留多久"。
  • Snapshot(快照):某时间点的索引 / 数据副本,存于仓库。
  • Repository(仓库):存储快照的介质(本地 FS / S3 / 火山 TOS / OSS 等)。
  • Retention(保留策略):自动删旧快照,避免存储爆满。

创建/更新SLM策略

复制代码
# 创建/更新 SLM 策略:每天凌晨 2 点备份,保留 30 天,最少 5 份、最多 50 份
PUT _slm/policy/es_daily_backup
{
  "schedule": "0 0 2 * * ?",          # 定时:每天 02:00(UTC 时间,注意时区换算)
  "name": "<snapshot_{now/d}>",     # 快照名:snapshot_2026.04.17 自动带日期
  "repository": "nfs_es_backup",      # 你的 NFS 仓库名(必须已存在)
  "config": {
    "indices": "*",                    # 备份所有索引
    "ignore_unavailable": true,       # 忽略不可用索引(防失败)
    "include_global_state": true,     # 备份集群全局状态(模板/权限/ILM)
    "partial": false,                  # 不允许部分备份(保证完整)
    "slices": "auto"                   # 自动并行加速
  },
  "retention": {
    "expire_after": "30d",             # 快照 30 天后过期
    "min_count": 5,                     # 最少保留 5 份(防止删光)
    "max_count": 50                     # 最多保留 50 份(防止磁盘爆)
  }
}

参数完整解析

  • 定时调度 schedule(Cron 表达式)

    • 格式:秒 分 时 日 月 周(ES 用 UTC 时间)
      示例:

      "0 0 2 * * ?" → 每天 UTC 02:00 执行(北京时间 10:00)
      "0 0 0/12 * * ?" → 每 12 小时一次
      "0 30 1 * * ?" → 每天凌晨 1:30(官方默认)

  • 快照命名 name

    • <snapshot_{now/d}> → 自动生成 snapshot_2026.04.17
    • 支持变量:{now/d}(日期)、{now/H}(小时)等
  • 仓库 repository

    • 必须和你已创建的仓库名一致:nfs_es_backup
  • 备份配置 config

    • indices: *:备份所有索引
    • ignore_unavailable: true:跳过已关闭 / 不存在的索引,避免整体失败
    • include_global_state: true:备份集群元数据(恢复时不用重配模板 / 权限)
    • partial: false:任一主分片异常则快照失败,保证备份完整性
    • slices: auto:自动并行,提升备份速度
  • 保留策略 retention(生产核心)

    • expire_after: "30d":30 天后自动删除旧快照
    • min_count: 5:至少保留 5 份,即使超过 30 天(防止删光无备份)
    • max_count: 50:最多保留 50 份,防止磁盘溢出

SLM常用运维命令

  • 查看所有 SLM 策略

    GET _slm/policy

    响应结果

    {
    "es_daily_backup" : {
    "version" : 1,
    "modified_date_millis" : 1776419066650,
    "policy" : {
    "name" : "<snapshot_{now/d}>",
    "schedule" : "0 0 2 * * ?",
    "repository" : "nfs_es_backup",
    "config" : {
    "include_global_state" : true,
    "slices" : "auto",
    "indices" : "*",
    "ignore_unavailable" : true,
    "partial" : false
    },
    "retention" : {
    "expire_after" : "30d",
    "min_count" : 5,
    "max_count" : 50
    }
    },
    "next_execution_millis" : 1776477600000,
    "stats" : {
    "policy" : "es_daily_backup",
    "snapshots_taken" : 0,
    "snapshots_failed" : 0,
    "snapshots_deleted" : 0,
    "snapshot_deletion_failures" : 0
    }
    }
    }

  • 立即手动执行一次策略(测试用)

    POST _slm/policy/es_daily_backup/_execute

    #响应结果
    {
    "snapshot_name" : "snapshot_2026.04.17-zo_rwr-ms-oymjzvhbpqiw"
    }

  • 查看 SLM 执行历史

    GET .slm-history-*/_search
    {
    "sort": [{"@timestamp": "desc"}],
    "size": 10
    }

  • 删除 SLM 策略

    DELETE _slm/policy/es_daily_backup

注意事项:

时区注意(极易踩坑)

ES 的 Cron 是 UTC 时间,北京时间 = UTC+8

想北京时间 02:00 备份 → Cron 写 "0 0 18 * * ?"(UTC 18:00)

生产环境使用注意:

每日全量快照:保留 30 天,最少 5 份

恢复测试:每周至少恢复一次快照验证可用性