淘先锋技术网

首页 1 2 3 4 5 6 7

Elasticsearch集群的数据备份和迁移 – snapshot快照

背景 :
docker版的ES7集群 (集群搭建 见文章 ELK合集持续更新(十五):ELK所有部署与集成)
已安装Kibana
ES数据备份到HDFS文件系统 (默认 已有现成的HDFS可用)
再从HDFS恢复数据到任一ES7集群 (当前的集群 和跨集群 分别演示)

snapshot概述

snapshot 可以将ES集群的状态和数据 存储到一个外部文件系统(例如 HDFS)

首次备份是全量备份 之后增量备份

操作

0.安装repository-hdfs插件 (每个节点操作)

方式一 (慢 不用)

ES命令安装远程插件

$ ./bin/elasticsearch-plugin install repository-hdfs

重启集群

方式二
下载插件包 版本和ES一致

# 浏览器访问
https://artifacts.elastic.co/downloads/elasticsearch-plugins/repository-hdfs/repository-hdfs-7.2.0.zip

上传到Linux服务器
cp到docker中/usr/share/elasticsearch/bin/下
docker命令安装本地插件包

$ cd /usr/share/elasticsearch
$ .bin/elasticsearch-plugin install file:///usr/share/elasticsearch/bin/repository-hdfs-7.2.0.zip
1.验证安装成功

重启ES容器

# 操作每个节点
$ docker restart 容器ID

查看插件列表

# 浏览器访问
http://10.255.175.240:9200/_cat/plugins?v

在这里插入图片描述

2.创建备份仓库

ES数据的备份需要 存储在一个地方 这里存储在了HDFS文件系统上 ES自动将备份数据放在HDFS中的自定义目录(指定目录就是备份仓库了) 需要先创建这个目录 并给es用户附权限使可操作这个目录

在HDFS中创建目录并附权限

# 进入HDFS主机终端
# 切换到hdfs用户
$ su hdfs
# 创建目录
$ hdfs dfs -mkdir /es7_repository
# 给/es7_repository目录附es用户权限 (docker中默认es用户和组是elasticsearch)
$ hdfs dfs -chown -R elasticsearch:elasticsearch /es7_repository

在这里插入图片描述
查看效果
在这里插入图片描述

kibana中 -> 点击[管理工具按钮] -> 点击[Snapshot Repositories] -> 点击[Register a repository]
在这里插入图片描述
填写仓库信息
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
验证存储库 (确保该存储库在集群的所有节点上都可正常运行)
POST /_snapshot/es7_repository/_verify
在这里插入图片描述

3.快照索引

就是 给索引备份

方式一 快照所有索引
PUT /_snapshot/仓库名/自定义快照名

# kibana操作
PUT /_snapshot/es7_repository/snapshot_1

方式二 快照指定索引
PUT /_snapshot/仓库名/自定义快照名
{
“indices”: “索引名1,索引名2”,
“ignore_unavailable”: true, # 忽略不存在的索引
“include_global_state”: false # 不备份集群状态 只备份数据
}

# kibana操作
PUT /_snapshot/es7_repository/snapshot_1
{
  "indices": "kibana_sample_data_logs",
  "ignore_unavailable": true,
  "include_global_state": false
}
4.查看快照信息

监控指定快照/恢复运行状态
GET /_snapshot/仓库名/快照名
GET /snapshot/仓库名/快照名*,快照名2

GET /_snapshot/es7_repository/snapshot_1

在这里插入图片描述


监控指定快照/恢复详细运行状态
GET /_snapshot/仓库名/快照名/_status
GET /_snapshot/仓库名/快照名1,快照名2/_status

GET /_snapshot/es7_repository/snapshot_1/_status
从快照恢复数据restore

快照(就是备份)存在HDFS中 也就是从HDFS中恢复数据到ES集群

确保目标索引是close的

  • 如果目标索引不存在 则自动新建索引 直接恢复数据

  • 如果目标索引已存在 需关闭索引

    POST /rename_kibana_sample_data_logs/_close?wait_for_active_shards=1
    

方式一 恢复索引
POST _snapshot/仓库名/快照名/_restore

POST _snapshot/es7_repository/snapshot_1/_restore

方式二 恢复索引并重命名
POST /_snapshot/仓库名/快照名/_restore
{
“indices”: “index1name”,
“ignore_unavailable”: true, # 忽略不存在的索引
“include_global_state”: true, # 不恢复集群状态 只恢复数据
“rename_pattern”: “index1name”, # 匹配原索引名
“rename_replacement”: “rename_index1name” # 新索引名
}

POST /_snapshot/es7_repository/snapshot_1/_restore
{
  "indices": "kibana_sample_data_logs",
  "ignore_unavailable": true,
  "include_global_state": true,
  "rename_pattern": "kibana_sample_data_logs",
  "rename_replacement": "rename_kibana_sample_data_logs"
}

查看恢复数据进度
GET 索引名/_recovery

GET kibana_sample_data_logs/_recovery

查看备份效果

在这里插入图片描述


其他可能遇到的操作

其他可能用到的操作快照和仓库的API

停止并删除快照
DELETE /_snapshot/仓库名/快照名

DELETE /_snapshot/es7_repository/snapshot_1

查询所有快照信息
GET /_snapshot/仓库名/_all

GET /_snapshot/es7_repository/_all

查询当前运行的快照

GET /_snapshot/仓库名/_current

GET /_snapshot/es7_repository/_current

查询当前运行的快照状态
GET /_snapshot/es7_repository/_status

GET /_snapshot/es7_repository/_status

删除仓库
DELETE /_snapshot/仓库名

DELETE /_snapshot/es7_repository

其他可能用到的HDFS命令

删除仓库目录

# 删除
$ hdfs dfs -rm -r /es7_repository
# 查看确认
$ hdfs dfs -ls /

在这里插入图片描述


Elasticsearch5版本会遇到的问题

0.创建快照时报错could not read repository data from index blob

背景 : ES5 单点服务

  • 原因
    • repository-hdfs插件中配置的java的权限问题
  • 解决
    • 修改插件和ES配置
      • 0.修改plugin-security.policy文件

        # 进入插件安装目录
        $ cd /opt/elasticsearch-5.3.3/plugins/repository-hdfs
        $ vi plugin-security.policy
        添加如下
        grant {
          // Hadoop UserGroupInformation, HdfsConstants, PipelineAck clinit
          permission java.lang.RuntimePermission "getClassLoader";
        
          // UserGroupInformation (UGI) Metrics clinit
          permission java.lang.RuntimePermission "accessDeclaredMembers";
          permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
        
          // org.apache.hadoop.util.StringUtils clinit
          permission java.util.PropertyPermission "*", "read,write";
        
          // org.apache.hadoop.util.ShutdownHookManager clinit
          permission java.lang.RuntimePermission "shutdownHooks";
        
          // JAAS is used always, we use a fake subject, hurts nobody
          permission javax.security.auth.AuthPermission "getSubject";
          permission javax.security.auth.AuthPermission "doAs";
          permission javax.security.auth.AuthPermission "modifyPrivateCredentials";
        ##### ------ 以下为我添加的配置 -------------------
          permission java.lang.RuntimePermission "accessDeclaredMembers";
          permission java.lang.RuntimePermission "getClassLoader";
          permission java.lang.RuntimePermission "shutdownHooks";
          permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
          permission javax.security.auth.AuthPermission "doAs";
          permission javax.security.auth.AuthPermission "getSubject";
          permission javax.security.auth.AuthPermission "modifyPrivateCredentials";
          permission java.security.AllPermission;
          permission java.util.PropertyPermission "*", "read,write";
          permission javax.security.auth.PrivateCredentialPermission "org.apache.hadoop.security.Credentials * \"*\"", "read";
        };
        
      • 1.修改ES的JVM配置

        # 进入ES配置目录
        $ cd /opt/elasticsearch-5.3.3/config
        $ vi jvm.options
        最后一行添加
        -Djava.security.policy=/opt/elasticsearch-5.3.3/plugins/repository-hdfs/plugin-security.policy
        
      • 2.重启ES服务

      • 3.可以正常创建快照了