elasticsearch数据迁移备份还原

需求一:elasticsearch中的数据需要每天备份
需求二:elasticsearch5.2中的数据要迁移到elasticsearch6.5.4中
方案:采用repository-hdfs插件进行数据的迁移备份和还原

疑问一
elasticsearch本来分布式有副本为什么要备份数据??
任何一个存储数据的软件,都需要定期的备份我们的数据。es replica提供了运行时的高可用保障机制,可以容忍少数节点的故障和部分数据的丢失,但是整体上却不会丢失任何数据,而且不会影响集群运行。但是replica没法进行灾难性的数据保护,比如说机房彻底停电,所有机器全部当即,等等情况。对于这种灾难性的故障,我们就需要对集群中的数据进行备份了,集群中数据的完整备份

疑问二
ES为什么采用hdfs备份
要备份集群数据,就要使用snapshot api。这个api会将集群当前的状态和数据全部存储到一个外部的共享目录(HDFS)中去。而且备份过程是非常智能的,第一次会备份全量的数据,但是接下来的snapshot就是备份两次snapshot之间的增量数据了。数据是增量进入es集群或者从es中删除的,那么每次做snapshot备份的时候,也会自动在snapshot备份中增量增加数据或者删除部分数据。因此这就意味着每次增量备份的速度都是非常快的。

废话不多了,开始吧

es5.2和es6.5分别按照repository-hdfs插件,我都是在线安装的,这个简单,如果有需求的话 我后期可以补上

1 在es5.2中备份数据

#0 环境说明  nameNode高可用 192.168.8.21(active)192.168.8.22(standby)
 # 1 基于hdfs创建仓库
PUT /_snapshot/my_hdfs_repository
{
  "type": "hdfs",
  "settings": {
    "uri": "hdfs://192.168.8.21:8020/",
    "path": "elasticsearch/respositories/my_hdfs_repository",
	  "conf.dfs.client.read.shortcircuit": "true",
	  "max_snapshot_bytes_per_sec" : "50mb", 
    "max_restore_bytes_per_sec" : "50mb"
  }
}

# 提出一个问题哈 我们的namenode 生产上 都是高可用 如果192.168.8.21这个namenode变成了standby的,那么仓库是否可用?
# 回答:上面的仓库不可用!!!
#解决方法 基于现在active的name在init一下仓库的地址即可
PUT /_snapshot/my_hdfs_repository
{
  "type": "hdfs",
  "settings": {
    "uri": "hdfs://192.168.8.22:8020/",
    "path": "elasticsearch/respositories/my_hdfs_repository",
	  "conf.dfs.client.read.shortcircuit": "true",
	  "max_snapshot_bytes_per_sec" : "50mb", 
    "max_restore_bytes_per_sec" : "50mb"
  }
}


# 2 验证
POST /_snapshot/my_hdfs_repository/_verify
# 3 结果
{
  "nodes": {
    "avi9bA0AQeG7vHNtJCqPAA": {
      "name": "node-5"
    },
    "JD16f2hASOCp3lXb5BlFRA": {
      "name": "node-4"
    },
    "BtaGkSuWQGG57ApoASPm7w": {
      "name": "node-3"
    }
  }
}
# 4 对指定的索引进行snapshotting备份
PUT _snapshot/my_hdfs_repository/snapshot_1
{
    "indices": "poc13,poc8",
	"ignore_unavailable": true,
	"include_global_state": false,
	"partial": true
}
#indices 也支持 poc*

# 5 查看snapshot_1备份信息 进度
GET /_snapshot/my_hdfs_repository/snapshot_1

# "state": "SUCCESS": 表示备份成功

2 在es6.5中还原数据

# 1 创建仓库的信息
PUT /_snapshot/my_hdfs_repository
{
  "type": "hdfs",
  "settings": {
    "uri": "hdfs://192.168.8.21:8020/",
    "path": "elasticsearch/respositories/my_hdfs_repository",
	  "max_snapshot_bytes_per_sec" : "100mb", 
    "max_restore_bytes_per_sec" : "100mb"
  }
}

#2 还原数据 恢复指定的索引 并且进行重命名
# 将es备份的poc8库的数据 重命名为poc15
POST /_snapshot/my_hdfs_repository/snapshot_1/_restore
{
    "indices": "poc8", 
	"ignore_unavailable": true,
	"include_global_state": true,
    "rename_pattern": "poc8", 
    "rename_replacement": "poc15" 
}

# 3 监控还原restore的进度
GET poc8/_recovery

#4 删除历史snapshot_1备份
DELETE /_snapshot/my_hdfs_repository/snapshot_1

3 定期备份shell脚本

hdfs保存7天的备份数据,每天凌晨备份昨天的数据,并将备份的结果写到es库中,在kibana中图表展示是否备份成功

 #!/bin/bash
#在windows编写的代码可能运行有问题执行以下 1>vim redisshell.sh  2>:set ff=unix
esip=192.168.8.23
esbakindex=poc14,poc8
#需要提前创建eslogindex的mapping信息
eslogindex=poc9/resultdata9
esbakfile=/bigdata/bak/es/baklogs
day1=$(date -d -1day +%Y%m%d)
day7=$(date -d -7day +%Y%m%d)
transTime=$(date '+%Y-%m-%d')

if [ ! -d $esbakfile ]; then
 mkdir -p $esbakfile
fi
echo -e "\r\n"  >> $esbakfile/bak_es_log.logs

echo "=================start====$(date '+%Y-%m-%d %H:%M:%S')=================" >> $esbakfile/bak_es_log.logs

#备份新的数据,指定新的索引库 
param=`curl -XPUT "http://$esip:9200/_snapshot/my_hdfs_repository/snapshot_$day1?wait_for_completion=true" -d '{
    "indices": "'${esbakindex}'",
    "ignore_unavailable": true,
    "include_global_state": false,
    "partial": true
}'`

echo -e "\r\n"  >> $esbakfile/bak_es_log.logs

result1=$(echo $param | grep "SUCCESS")
if [[ "$result1" != "" ]]; then  
  echo " create new snapshot_$day1 success" >> $esbakfile/bak_es_log.logs
  #发送数据到es库
  curl -XPUT "http://$esip:9200/${eslogindex}/${transTime}create" -d'
{
  "transTime":"'$transTime'",
  "operation":"create",
  "snapshotname":"snapshot_'$day1'",
  "status":"success"
}'

else
  echo -e "create new snapshot_$day1 fail !!! " >> $esbakfile/bak_es_log.logs
  echo -e ${param} >> $esbakfile/bak_es_log.logs
  curl -XPUT "http://$esip:9200/${eslogindex}/${transTime}create" -d'
{
  "transTime":"'$transTime'",
  "operation":"create",
  "snapshotname":"snapshot_'$day1'",
  "status":"fail"
}'
fi


echo -e "\r\n"   >> $esbakfile/bak_es_log.logs


#删除7天以前的数据
param2=`curl -XDELETE "http://$esip:9200/_snapshot/my_hdfs_repository/snapshot_$day7?pretty"`
result2=$(echo $param2 | grep "acknowledged")
if [[ "$result2" != "" ]]; then
  echo " delete  snapshot_$day7 success " >> $esbakfile/bak_es_log.logs
  curl -XPUT "http://$esip:9200/${eslogindex}/${transTime}delete" -d'
{
  "transTime":"'$transTime'",
  "operation":"delete",
  "snapshotname":"snapshot_'$day7'",
  "status":"success"
}'
else
  echo " delete snapshot_$day7 fail !!! " >> $esbakfile/bak_es_log.logs
  echo  $param2 >> $esbakfile/bak_es_log.logs
  curl -XPUT "http://$esip:9200/${eslogindex}/${transTime}delete" -d'
{
  "transTime":"'$transTime'",
  "operation":"delete",
  "snapshotname":"snapshot_'$day7'",
  "status":"fail"
}'
fi

echo -e "\r\n"   >> $esbakfile/bak_es_log.logs


echo "======================end====$(date '+%Y-%m-%d %H:%M:%S')=======================" >> $esbakfile/bak_es_log.logs

### Elasticsearch 数据备份方法 #### 修改配置文件 `elasticsearch.yml` 为了能够执行快照操作,需先设置存储库路径。通过向配置文件`elasticsearch.yml`追加如下内容来指定用于保存快照的位置[^1]: ```bash echo 'path.repo: ["/home/esbackup"]' >> /etc/elasticsearch/elasticsearch.yml ``` 此命令会将 `/home/esbackup` 添加为允许创建快照的目标目录。 #### 使用 Elasticdump 工具导出索引数据至 JSON 文件 对于特定索引的数据迁移或存档需求,可以利用第三方工具如 `elasticdump` 来实现简单快速的全量备份工作。下面的例子展示了如何把名为 `index` 的索引里的文档迁移到本地磁盘上的 `test.json` 文件中去[^2]: ```bash elasticdump --input=http://ip:9200/index --output=D:/date/test.json ``` 这里需要注意替换实际服务器 IP 地址以及目标文件的具体位置。 #### 创建并管理快照仓库 除了上述基于文件系统的直接复制方式外,更推荐的做法是借助内置功能——快照(Snapshot),它支持多种类型的外部介质作为目的地,比如 S3、HDFS 或者 NFS 等共享网络驱动器。首先定义一个新的快照仓库: ```json PUT _snapshot/my_backup_repo { "type": "fs", "settings": { "location": "/home/esbackup" } } ``` 这段 RESTful API 请求告知集群关于新建立好的快照资源的信息,其中 `"location"` 参数对应之前在 YAML 中声明过的物理地址。 #### 执行完整的集群状态快照 一旦准备好合适的储存空间之后就可以发起整个节点或者选定部分索引集合作为对象来进行一次性抓取动作了。例如要获取全部现有资料,则发送 POST 请求给 `_snapshot/<repository>/_all` 接口即可完成这项任务;如果只想针对单个集合做处理的话只需调整 URL 路径参数就好。 ```json POST _snapshot/my_backup_repo/snapshot_1?wait_for_completion=true ``` 该指令将会异步启动一个名称叫做 `snapshot_1` 的进程,并等待其结束再返回响应体(因为附加了查询字符串 `wait_for_completion=true`)。如果不希望阻塞当前线程则省略这部分选项。 #### 验证与恢复过程概述 当需要验证已有的镜像是否完好无损时,可以通过 GET 方法读取出有关详情记录;而真正实施回滚计划前务必确认源端环境已经停止写入活动以免造成冲突现象发生。具体来说就是调用相应接口查看进度条直至显示成功标志位为止,随后按照官方指南逐步还原历史版本的内容结构和服务行为模式。 ```json GET _snapshot/my_backup_repo/_all ``` 以上便是围绕着Elasticsearch平台开展的一系列维护活动中涉及到的关键环节和技术要点介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值