Elasticsearch 快照和恢复

  • Post author:
  • Post category:其他




简介

快照是正在运行的Elasticsearch集群的备份。可以使用快照来:

  • 定期备份群集,无需停机
  • 删除或硬件故障后恢复数据
  • 在群集之间传输数据等

默认情况下,集群的快照包含集群状态、所有常规数据流和所有常规索引

快照必须存储在存储库中,存储库的内容不能修改,否则会造成快照损坏或导致数据不一致等一系列问题。所以在创建快照之前,需要先创建存储库



快照存储库



说明

  • 存储库需要集群中的节点可以共享访问(共享文件系统、云存储等)
  • 多个集群之间不要使用同一个储存库。避免多个集群修改同样的存储库,造成不必要的问题。
  • 存储库的内容不要修改,避免操作数据损坏等问题



创建或更新存储库

PUT /_snapshot/my_repository
{
  "type": "url",
  "settings": {
    "url": "https://pan.baidu.com/disk/main#/transfer/send?surl=ABkAAAAddddAABEHbw"
  }
}

type 表示存储库的类型,存储库支持多种类型,我们示例是使用的 url 类型。



接口说明

PUT /_snapshot/<repository>

POST /_snapshot/<repository>



路径参数

repository:存储库的名称。



查询参数

  • master_timeout

    (可选,时间单位)指定等待连接到主节点的时间段。如果超时之前未收到响应,则请求失败并返回错误。默认为30s.
  • timeout

    (可选,时间单位)指定等待响应的时间段。如果超时之前未收到响应,则请求失败并返回错误。默认为30s.
  • verify

    (可选,布尔值)如果true,则请求验证存储库在集群中的所有主节点和数据节点上是否正常运行。如果false,则跳过此验证。默认为 true.



请求正文

  • type 存储库类型

    • azure Azure 存储库(微软)
    • gcs 谷歌云存储库
    • s3 S3存储库(MinIO对此进行了适配,所以也可以使用S3方式配置MinIO)
    • fs 共享文件系统存储库(如NFS等)
    • url 只读 URL 存储库(支持 file、ftp、http、https、jar 协议),只读存储库不能创建快照
    • hdfs Hadoop 分布式文件系统 (HDFS) 存储库(需安装 ES 官方插件)
  • settings 对应类型的配置(注意:每种类型不一样,本文只介绍url方式,其余方式请参考 官方文档:

    创建储存库 API

注意:除了 file 协议,其他协议需要 elasticsearch.yml 配置 repositories.url.allowed_urls,此设置为数组。

repositories.url.allowed_urls: ["https://pan.baidu.com/disk/main#/transfer/send?surl=ABkAAAAddddAABEHbw"]

url 方式的 file 协议,以及 fs 方式,需要配置地址的父级目录到 elasticsearch.yml 的 path.repo 。



使用 fs 方式创建存储库

PUT /_snapshot/my_fs_repo
{
  "type": "fs",
  "settings": {
    "location": "/DATA/soft/bak/my_test_bak"
  }
}

结果

{
    "acknowledged": true
}

请先配置 elasticsearch.yml 的 path.repo: [“/DATA/soft/bak”]


本示例以及本文下面的示例都需要关闭其他节点,只启动一个节点来使用,配置的文件地址也是启动的节点的文件路径。这样做是为了简化讲解、简化示例,存储库在集群下的 fs 路径需要共享文件系统挂载到每个主节点和数据节点的同样的路径下且每个节点都能访问的。要在集群环境使用本示例,请至少使用 NFS 等共享文件系统。



验证储存库

# /_snapshot/<repository>/_verify
POST /_snapshot/my_fs_repo/_verify

结果:

{
    "nodes": {
        "AST-4rnFRdagsd0juerSaw": {
            "name": "myNode2"
        },
        "oj5FEiVMRpuWV386zdwy3w": {
            "name": "myNode1"
        }
    }
}

我们的示例是单节点的,所以结果应该只有一个节点。



获取存储库信息

# /_snapshot/<repository>
GET /_snapshot/my_fs_repo
{
    "my_fs_repo": {
        "type": "fs",
        "settings": {
            "location": "/DATA/soft/bak/my_test_bak"
        }
    }
}



删除存储库

# DELETE /_snapshot/<repository>
DELETE /_snapshot/my_fs_repo



清理储存库

# POST /_snapshot/<repository>/_cleanup
POST /_snapshot/my_fs_repo/_cleanup



快照



创建快照

PUT /_snapshot/<repository>/<snapshot>

POST /_snapshot/<repository>/<snapshot>



路径参数

  • repository:储存库名
  • snapshot:快照名



查询参数

  • master_timeout

    (可选,时间单位)等待连接到主节点的时间。如果在超时到期之前没有收到响应,则请求将失败并返回错误。默认为30s .
  • wait_for_completion

    (可选,布尔)true:快照完成后,请求将返回响应。false:当快照初始化时,请求返回响应。默认为false



请求正文

  • expand_wildcards

    (可选,字符串)确定通配符模式在indices参数匹配数据流和索引。支持逗号分隔的值,例如open,closed。默认为all

    • all

      匹配任何数据流或索引,包括隐藏个
    • open

      匹配开放索引和数据流。
    • closed

      匹配关闭的索引和数据流。
    • hidden

      匹配隐藏的数据流和索引。必须与结合open ,关闭或两者兼而有之
    • none

      不要展开通配符模式
  • include_global_state

    (可选,布尔)true,在快照中包含群集状态。默认为 true。
  • indices

    (可选,字符串或字符串数组)要包含在快照中的数据流和索引的逗号分隔列表。默认为空数组 []。
  • feature_states

    (可选,字符串数组)哪些功能状态包含在快照中,与 include_global_state 配置共同作用,include_global_state 为true时才生效。默认为空数组[],表示所有。[“none”]表示不包含任何功能状态。
  • metadata

    (可选,对象)将任意元数据附加到快照,例如快照的拍摄者、拍摄原因或任何其他有用数据的记录。元数据必须小于1024字节。可使用来对快照进行相关描述。
  • partial

    (可选,布尔)false,如果快照中包含的一个或多个索引没有所有主分片可用,则整个快照将失败。默认为false。true,允许对具有不可用分片的索引进行部分快照。



示例

PUT /_snapshot/my_fs_repo/snapshot_test1
{
    "indices":"*",
    "include_global_state": false,
    "metadata": {
        "message": "测试快照"
    }
}

结果

{
    "accepted": true
}



获取快照

GET /_snapshot/<repository>/<snapshot>



查询参数

  • master_timeout

    (可选,时间单位)等待连接到主节点的时间。如果在超时到期之前没有收到响应,则请求将失败并返回错误。默认为30s .
  • ignore_unavailable

    (可选,布尔)

    • false,对于任何不可用的快照,请求都会返回错误。默认为false .
    • true,请求将忽略不可用的快照,例如损坏或暂时无法返回的快照。
  • verbose

    (可选,布尔)true,返回有关每个快照的附加信息,例如拍摄快照的Elasticsearch版本、快照的开始和结束时间以及快照的分片数。默认为true。false,省略附加信息
  • index_names

    (可选,布尔)true,返回响应中每个快照中包含的索引名称列表。默认为true .
  • index_details

    (可选,布尔)true返回快照中每个索引的附加信息,包括索引中的分片数、索引的总大小(以字节为单位)以及索引中每个分片的最大段数。默认为false,表示此信息被省略
  • include_repository

    (可选,布尔)true,返回响应中每个快照的存储库名称。默认为true.
  • sort

    (可选,字符串)允许设置结果的排序顺序。默认为start_time,即按快照开始时间戳排序。

    • start_time

      按开始时间戳对快照进行排序。
    • duration

      按持续时间对快照进行排序。
    • name

      按名称对快照进行排序。
    • repository

      按存储库名称对快照进行排序。
    • index_count

      按快照包含的索引数对快照进行排序。
    • shard_count

      按快照包含的分片数对快照进行排序。
    • failed_shard_count

      按快照失败的分片数对快照进行排序。
  • size

    (可选,整数)要返回的最大快照数。默认为0表示无限制地返回所有与请求匹配的内容。
  • order

    (可选,字符串)排序顺序。默认为asc,表示升序。desc 降序
  • from_sort_value

    (可选,字符串)要开始检索的当前排序列的值。在按快照或存储库名称排序时,可以是字符串快照,也可以是存储库名称,在按索引或分片计数排序时,则可以是毫秒时间值或数字。
  • after

    (可选,字符串)从返回的偏移量标识符开始分页next响应正文中的字段。
  • offset

    (可选,整数)基于匹配此请求的快照开始分页的数值偏移量。为该参数使用非零值与after参数对应。默认为 zero .
  • slm_policy_filter

    (可选,字符串)通过快照所属的SLM策略名称的逗号分隔列表筛选快照。还接受通配符(*)和通配符组合



示例

GET /_snapshot/my_fs_repo/snapshot_test1?index_details=true

结果

{
    "snapshots": [ // 快照列表
        {
            "snapshot": "snapshot_test1", // 快照名称
            "uuid": "vn2YN19iRr6aG8YJ97paTw", // 快照统一标识符
            "repository": "my_fs_repo", // 存储库名称
            "version_id": 8060299, // 用于创建快照的 es 版本id
            "version": "8.6.2", // 用于创建快照的 es 版本号
            "indices": [ // 快照包含的索引列表
                ".ds-.logs-deprecation.elasticsearch-default-2023.07.19-000002",
                "users",
                "person",
                ".ds-ilm-history-5-2023.07.19-000002",
                "students",
                ".ds-ilm-history-5-2023.06.19-000001",
                ".ds-.logs-deprecation.elasticsearch-default-2023.06.19-000001",
                "person1"
            ],
            "index_details": { // 快照中索引的信息(分片数、索引总大小等)
                ".ds-.logs-deprecation.elasticsearch-default-2023.06.19-000001": {
                    "shard_count": 1, // 分片数
                    "size_in_bytes": 10572, // 索引索引分配的总大小(单位字节)
                    "max_segments_per_shard": 1 // 每个分片的最大段数
                },
                "students": {
                    "shard_count": 2,
                    "size_in_bytes": 450,
                    "max_segments_per_shard": 0
                },
                ".ds-ilm-history-5-2023.06.19-000001": {
                    "shard_count": 1,
                    "size_in_bytes": 19887,
                    "max_segments_per_shard": 2
                },
                ".ds-.logs-deprecation.elasticsearch-default-2023.07.19-000002": {
                    "shard_count": 1,
                    "size_in_bytes": 225,
                    "max_segments_per_shard": 0
                },
                ".ds-ilm-history-5-2023.07.19-000002": {
                    "shard_count": 1,
                    "size_in_bytes": 23206,
                    "max_segments_per_shard": 2
                },
                "person1": {
                    "shard_count": 1,
                    "size_in_bytes": 5667,
                    "max_segments_per_shard": 1
                },
                "users": {
                    "shard_count": 1,
                    "size_in_bytes": 6123,
                    "max_segments_per_shard": 1
                },
                "person": {
                    "shard_count": 1,
                    "size_in_bytes": 62979852,
                    "max_segments_per_shard": 3
                }
            },
            "data_streams": [ // 快照中的数据流
                "ilm-history-5",
                ".logs-deprecation.elasticsearch-default"
            ],
            "include_global_state": false, // 是否包含集群状态
            "metadata": { // 创建快照时设置的信息
                "message": "测试快照"
            },
            "state": "SUCCESS", 
            // 快照状态(IN_PROGRESS 快照当前正在运行)
            // SUCCESS 快照已完成,所有分片已成功存储。
            // FAILED 快照完成时出错,无法存储任何数据。
            // PARTIAL 已存储全局群集状态,但至少一个分片的数据未成功存储
            "start_time": "2023-08-02T06:11:55.210Z",// 快照创建的开始时间(时间戳)
            "start_time_in_millis": 1690956715210,// 快照创建的开始时间(毫秒)
            "end_time": "2023-08-02T06:11:58.212Z",// 快照创建的结束时间(时间戳)
            "end_time_in_millis": 1690956718212,// 快照创建的结束时间(毫秒)
            "duration_in_millis": 3002,// 快照创建所用时间(毫秒)
            "failures": [],// 创建时的故障
            "shards": { // 快照中的分片数
                "total": 9, // 总分片数
                "failed": 0, // 快照中未包含的分片数
                "successful": 9 // 快照中包含的分片数
            },
            "feature_states": [] // 功能状态,需要快照包含功能状态时才有值
        }
    ],
    "total": 1, 
    "remaining": 0
}



克隆快照

PUT /_snapshot/<repository>/<source_snapshot>/_clone/<target_snapshot>



查询参数

  • master_timeout

    (可选,时间单位)指定等待连接到主节点的时间段。如果在超时之前没有收到响应,则请求将失败并返回错误。默认为30s .
  • timeout

    (可选,时间单位)指定等待响应的时间段。如果在超时到期之前没有收到响应,则请求失败并返回错误。默认为30s .
  • indices

    (必需,字符串)要包含在快照中的以逗号分隔的索引列表。



示例

PUT /_snapshot/my_fs_repo/snapshot_test1/_clone/snapshot_test2



获取快照状态

GET _snapshot/_status

GET _snapshot/<repository>/_status

GET _snapshot/<repository>/<snapshot>/_status



示例

GET /_snapshot/my_fs_repo/snapshot_test1/_status

结果

{
    "snapshots": [ // 快照列表
        {
            "snapshot": "snapshot_test1", // 快照名
            "repository": "my_fs_repo", // 存储库名
            "uuid": "vn2YN19iRr6aG8YJ97paTw", // 快照统一标识符
            "state": "SUCCESS", // 当前状态
            "include_global_state": false, //是否包含集群状态
            "shards_stats": { // 分片状态
                "initializing": 0, // 正在初始化的分片数
                "started": 0, // 启动但尚未完成的分片数
                "finalizing": 0, // 正在完成但尚未完成的分片数
                "done": 9, // 成功初始化、启动和完成的分片数
                "failed": 0,// 快照中未包含的分片数
                "total": 9// 快照中包含的分片总数
            },
            "stats": {
                "incremental": { // 
                    "file_count": 39,
                    "size_in_bytes": 63045982
                },
                "total": { // 快照引用的总大小
                    "file_count": 39,
                    "size_in_bytes": 63045982
                },
                "start_time_in_millis": 1690956715210, // 快照创建的初始时间
                "time_in_millis": 3002 // 快照创建总时间
            },
            "indices": {// 快照中包含的索引信息
                ".ds-ilm-history-5-2023.06.19-000001": {
                    "shards_stats": {
                        "initializing": 0,
                        "started": 0,
                        "finalizing": 0,
                        "done": 1,
                        "failed": 0,
                        "total": 1
                    },
                    "stats": {
                        "incremental": {
                            "file_count": 7,
                            "size_in_bytes": 19887
                        },
                        "total": {
                            "file_count": 7,
                            "size_in_bytes": 19887
                        },
                        "start_time_in_millis": 1690956715410,
                        "time_in_millis": 401
                    },
                    "shards": {
                        "0": {
                            "stage": "DONE",
                            "stats": {
                                "incremental": {
                                    "file_count": 7,
                                    "size_in_bytes": 19887
                                },
                                "total": {
                                    "file_count": 7,
                                    "size_in_bytes": 19887
                                },
                                "start_time_in_millis": 1690956715410,
                                "time_in_millis": 401
                            }
                        }
                    }
                },
                "person1": {
                    "shards_stats": {
                        "initializing": 0,
                        "started": 0,
                        "finalizing": 0,
                        "done": 1,
                        "failed": 0,
                        "total": 1
                    },
                    "stats": {
                        "incremental": {
                            "file_count": 4,
                            "size_in_bytes": 5667
                        },
                        "total": {
                            "file_count": 4,
                            "size_in_bytes": 5667
                        },
                        "start_time_in_millis": 1690956715410,
                        "time_in_millis": 401
                    },
                    "shards": {
                        "0": {
                            "stage": "DONE",
                            "stats": {
                                "incremental": {
                                    "file_count": 4,
                                    "size_in_bytes": 5667
                                },
                                "total": {
                                    "file_count": 4,
                                    "size_in_bytes": 5667
                                },
                                "start_time_in_millis": 1690956715410,
                                "time_in_millis": 401
                            }
                        }
                    }
                },
                ".ds-ilm-history-5-2023.07.19-000002": {
                    "shards_stats": {
                        "initializing": 0,
                        "started": 0,
                        "finalizing": 0,
                        "done": 1,
                        "failed": 0,
                        "total": 1
                    },
                    "stats": {
                        "incremental": {
                            "file_count": 7,
                            "size_in_bytes": 23206
                        },
                        "total": {
                            "file_count": 7,
                            "size_in_bytes": 23206
                        },
                        "start_time_in_millis": 1690956715410,
                        "time_in_millis": 401
                    },
                    "shards": {
                        "0": {
                            "stage": "DONE",
                            "stats": {
                                "incremental": {
                                    "file_count": 7,
                                    "size_in_bytes": 23206
                                },
                                "total": {
                                    "file_count": 7,
                                    "size_in_bytes": 23206
                                },
                                "start_time_in_millis": 1690956715410,
                                "time_in_millis": 401
                            }
                        }
                    }
                },
                "person": {
                    "shards_stats": {
                        "initializing": 0,
                        "started": 0,
                        "finalizing": 0,
                        "done": 1,
                        "failed": 0,
                        "total": 1
                    },
                    "stats": {
                        "incremental": {
                            "file_count": 10,
                            "size_in_bytes": 62979852
                        },
                        "total": {
                            "file_count": 10,
                            "size_in_bytes": 62979852
                        },
                        "start_time_in_millis": 1690956715410,
                        "time_in_millis": 2802
                    },
                    "shards": {
                        "0": {
                            "stage": "DONE",
                            "stats": {
                                "incremental": {
                                    "file_count": 10,
                                    "size_in_bytes": 62979852
                                },
                                "total": {
                                    "file_count": 10,
                                    "size_in_bytes": 62979852
                                },
                                "start_time_in_millis": 1690956715410,
                                "time_in_millis": 2802
                            }
                        }
                    }
                },
                "students": {
                    "shards_stats": {
                        "initializing": 0,
                        "started": 0,
                        "finalizing": 0,
                        "done": 2,
                        "failed": 0,
                        "total": 2
                    },
                    "stats": {
                        "incremental": {
                            "file_count": 2,
                            "size_in_bytes": 450
                        },
                        "total": {
                            "file_count": 2,
                            "size_in_bytes": 450
                        },
                        "start_time_in_millis": 1690956715410,
                        "time_in_millis": 201
                    },
                    "shards": {
                        "0": {
                            "stage": "DONE",
                            "stats": {
                                "incremental": {
                                    "file_count": 1,
                                    "size_in_bytes": 225
                                },
                                "total": {
                                    "file_count": 1,
                                    "size_in_bytes": 225
                                },
                                "start_time_in_millis": 1690956715410,
                                "time_in_millis": 201
                            }
                        },
                        "1": {
                            "stage": "DONE",
                            "stats": {
                                "incremental": {
                                    "file_count": 1,
                                    "size_in_bytes": 225
                                },
                                "total": {
                                    "file_count": 1,
                                    "size_in_bytes": 225
                                },
                                "start_time_in_millis": 1690956715410,
                                "time_in_millis": 201
                            }
                        }
                    }
                },
                ".ds-.logs-deprecation.elasticsearch-default-2023.07.19-000002": {
                    "shards_stats": {
                        "initializing": 0,
                        "started": 0,
                        "finalizing": 0,
                        "done": 1,
                        "failed": 0,
                        "total": 1
                    },
                    "stats": {
                        "incremental": {
                            "file_count": 1,
                            "size_in_bytes": 225
                        },
                        "total": {
                            "file_count": 1,
                            "size_in_bytes": 225
                        },
                        "start_time_in_millis": 1690956715410,
                        "time_in_millis": 0
                    },
                    "shards": {
                        "0": {
                            "stage": "DONE",
                            "stats": {
                                "incremental": {
                                    "file_count": 1,
                                    "size_in_bytes": 225
                                },
                                "total": {
                                    "file_count": 1,
                                    "size_in_bytes": 225
                                },
                                "start_time_in_millis": 1690956715410,
                                "time_in_millis": 0
                            }
                        }
                    }
                },
                ".ds-.logs-deprecation.elasticsearch-default-2023.06.19-000001": {
                    "shards_stats": {
                        "initializing": 0,
                        "started": 0,
                        "finalizing": 0,
                        "done": 1,
                        "failed": 0,
                        "total": 1
                    },
                    "stats": {
                        "incremental": {
                            "file_count": 4,
                            "size_in_bytes": 10572
                        },
                        "total": {
                            "file_count": 4,
                            "size_in_bytes": 10572
                        },
                        "start_time_in_millis": 1690956715410,
                        "time_in_millis": 601
                    },
                    "shards": {
                        "0": {
                            "stage": "DONE",
                            "stats": {
                                "incremental": {
                                    "file_count": 4,
                                    "size_in_bytes": 10572
                                },
                                "total": {
                                    "file_count": 4,
                                    "size_in_bytes": 10572
                                },
                                "start_time_in_millis": 1690956715410,
                                "time_in_millis": 601
                            }
                        }
                    }
                },
                "users": {
                    "shards_stats": {
                        "initializing": 0,
                        "started": 0,
                        "finalizing": 0,
                        "done": 1,
                        "failed": 0,
                        "total": 1
                    },
                    "stats": {
                        "incremental": {
                            "file_count": 4,
                            "size_in_bytes": 6123
                        },
                        "total": {
                            "file_count": 4,
                            "size_in_bytes": 6123
                        },
                        "start_time_in_millis": 1690956715410,
                        "time_in_millis": 601
                    },
                    "shards": {
                        "0": {
                            "stage": "DONE",
                            "stats": {
                                "incremental": {
                                    "file_count": 4,
                                    "size_in_bytes": 6123
                                },
                                "total": {
                                    "file_count": 4,
                                    "size_in_bytes": 6123
                                },
                                "start_time_in_millis": 1690956715410,
                                "time_in_millis": 601
                            }
                        }
                    }
                }
            }
        }
    ]
}



恢复快照

POST /_snapshot/<repository>/<snapshot>/_restore



查询参数

  • master_timeout

    (可选,时间单位)等待连接到主节点的时间。如果在超时到期之前没有收到响应,则请求将失败并返回错误。默认为30s .
  • wait_for_completion

    (可选,布尔)true,当恢复操作完成时,请求返回响应。完成所有尝试后,即使一次或多次恢复失败。false,当restore操作初始化时,请求返回响应。默认为 false .



请求正文

  • ignore_unavailable

    (可选,布尔)true,请求将忽略中的任何索引或数据流指数那是快照中缺少的。false,请求将为任何缺少的索引或数据流返回错误。默认为 false .
  • ignore_index_settings

    (可选,字符串或字符串数组)不从快照恢复的索引设置。
  • include_aliases

    (可选,布尔)true,该请求将恢复所有已恢复数据流和磁盘的别名。false,请求不会恢复别名。默认为true .
  • include_global_state

    (可选,布尔)如果true,恢复群集状态。默认为false
  • feature_states

    (可选,字符串数组)要恢复的功能状态列表
  • index_settings

    (可选,对象)索引设置,用于添加或更改恢复的索引,包括支持索引。此设置不能更改 index.number_of_shards 设置
  • indices

    (可选,字符串或字符串数组)要恢复的索引和数据流的逗号分隔列表。默认为快照中的所有常规索引和常规数据流。
  • partial

    (可选,布尔)false,如果快照中包含的一个或多个索引没有主分片可用,则整个恢复操作将失败。默认为 false.

    true,允许还原包含不可用分片的索引的部分快照。只有成功包含在快照中的分片才会被恢复。所有丢失的分片都将重新创建为空。
  • rename_pattern

    (可选,字符串)定义要应用于恢复的数据流和索引的重命名模式
  • rename_replacement

    (可选,字符串)定义重命名替换字符串。



示例

POST /_snapshot/my_fs_repo/snapshot_test1/_restore?wait_for_completion=true

{
    "indices":"person,person1"
}

示例为恢复索引 person 和 person1

注意:在恢复索引之前 person 和 person1 必须关闭或者删除,否则将提示已经存在索引,无法执行恢复操作。关闭和删除的索引在恢复后会自动打开。

结果

{
    "snapshot": {
        "snapshot": "snapshot_test1",
        "indices": [
            "person1",
            "person"
        ],
        "shards": {
            "total": 2,
            "failed": 0,
            "successful": 2
        }
    }
}



删除快照

DELETE /_snapshot/<repository>/<snapshot>

示例

DELETE /_snapshot/my_fs_repo/snapshot_2,snapshot_3

多个快照用逗号隔开



版权声明:本文为forlinkext原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。