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.可以正常创建快照了
-
- 修改插件和ES配置