ELK生态系统——shell脚本定时备份elasticsearch数据

1、es备份说明:

第一个快照会是一个数据的完整拷贝,但是所有后续的快照会保留的是已存快照和新数据之间的差异。随着你不时的对数据进行快照,备份也在增量的添加和删除。

2、es备份思路:

我们需要的是对es单机或集群有一个真正的备份,在某些东西确实出问题的时候有一个完整的数据拷贝。另外一个es中可能会有很多个index,为了在恢复的时候尽可能的方便,强烈建议一个index备份对应一份单独的备份。因此es备份思路如下:

(1)每个index单独备份:

因此在shell脚本配合文件中会有一个要备份的索引参数,允许配置多个index。

(2)先删除旧备份再备份:

注意:删除对应index的备份,删除备份的名称要与之前备份时候的名称保持一致,因此强烈建议备份命名规则:index名称_backup_年月日,然后再备份index。这种情况多适用于备份记录保留天数>=2的。

(3)先备份再删除旧备份:

非常注意:在备份index的时候,要添加wait_for_completion=true的参数,这样删除index备份就会是同步的,等待删除完毕后脚本再继续往下执行,否则默认的是异步执行,数据还没有删除就执行脚本中以后的命令了。强烈建议备份命名规则:index名称_backup_年月日,然后再删除旧备份。这种情况多适用于备份记录保留天数为1天的。

3、es备份脚本:

定制开发了可配置shell脚本定时备份es数据,适用于各个es,只需配置对应es信息即可,并且如果备份过程中出现异常会自动发送邮件提醒管理员。具体脚本如下:

(1)配置文件:

ipAddress=192.168.99.164
portNumber=9200
warehouseName=data_backup
backupsFileDay=1
backupBeforeDelete=yes
indexNames=test_one,test_two
curlPath=/usr/bin/curl
[email protected]
sendEmailTitle=测试ES备份异常标题
sendEmailContent=测试ES备份异常内容

(2)代码:

#!/bin/sh

#db_backups_conf.txt文件路径
db_backups_conf="/wocloud/shell/elasticsearch_backup_config.txt"

#判断文件是否存在
if [ -f "${db_backups_conf}" ];then
	
	echo $(date +'%Y-%m-%d %H:%M:%S')" 发现文件配置信息文件存在"

	#获取等号前内容,作为map中的Key值
	dbArrOne=($(awk -F'[=]' '{print $1}' ${db_backups_conf} ))
	
	#获取等号后内容,作为map中的value值
	dbArrTwo=($(awk -F'[=]' '{print $2}' ${db_backups_conf}))

	#创建一个空map
	declare -A map=()
	
	#通过循环,将db_backups_conf配置文件中的信息存储在map中
	for((i=0;i<${#dbArrOne[@]};i++))
	do
		map[${dbArrOne[i]}]=${dbArrTwo[i]}
	done	

	#获取要备份的索引名称的字符串
	indexNames=${map["indexNames"]}
	
	#获取收件人的邮件账号的字符串
	semdEmailTo=${map["semdEmailTo"]}
	
	#获取默认的字符串分隔符
	old_ifs="$IFS"
	
	#设置字符串分隔符为逗号
	IFS=","

	#将要备份的索引名称value值的字符串进行分隔,获取一个数组
	indexNamesArr=($indexNames)
	
	#将收件人的邮件账号value值的字符串进行分隔,获取一个数组
	semdEmailToArr=($semdEmailTo)

	#将字符串的分隔符重新设置为默认的分隔符
	IFS="$old_ifs"
	
	#获取当前年月日
	saveday=$(date +%Y%m%d)

	#获取超出备份天数的年月日
	delday=$(date -d ${map["backupsFileDay"]}' days ago' +%Y%m%d)
	
	#定义一个是否需要发送异常提醒邮件变量
	isSendEmailStr=0
	
	#执行命令,备份es数据
	{
	
		#检测es访问地址是否有效
		esStatus=$(curl -s -m 5 -IL http://${map["ipAddress"]}:${map["portNumber"]}|grep 200)
		if [ "$esStatus" != "" ];then
			
			echo $(date +'%Y-%m-%d %H:%M:%S')" es地址访问正常:http://"${map["ipAddress"]}":"${map["portNumber"]}",开始备份数据"
			
			#遍历备份索引名称,逐个删除旧备份,重新全量备份
			for indexName in ${indexNamesArr[@]};
			do
			
				#逐个判断该索引是否存在
				indexStatus=$(curl -s -m 5 -IL http://${map["ipAddress"]}:${map["portNumber"]}/${indexName}|grep 200)
				if [ "$indexStatus" != "" ];then
				
					#先备份,然后再删除旧备份
					if [ ${map["backupBeforeDelete"]} == "yes" ];then
					
						echo $(date +'%Y-%m-%d %H:%M:%S')" 开始同步备份索引:"${indexName}_backup_${saveday}
						${map["curlPath"]} -H "Content-Type: application/json" -XPUT http://${map["ipAddress"]}:${map["portNumber"]}/_snapshot/${map["warehouseName"]}/${indexName}_backup_${saveday}?wait_for_completion=true -d '{"indices":"'${indexName}'"}'
						
						echo $(date +'%Y-%m-%d %H:%M:%S')" 完成同步备份索引:"${indexName}_backup_${saveday}
					
						echo $(date +'%Y-%m-%d %H:%M:%S')" 开始删除备份索引:"${indexName}_backup_${delday}
						#删除该索引旧备份数据
						${map["curlPath"]} -XDELETE http://${map["ipAddress"]}:${map["portNumber"]}/_snapshot/${map["warehouseName"]}/${indexName}_backup_${delday}
									
						echo $(date +'%Y-%m-%d %H:%M:%S')" 完成删除备份索引:"${indexName}_backup_${delday}
						
					
					fi
					
					#先删除旧备份,然后再备份
					if [ ${map["backupBeforeDelete"]} == "no" ];then
					
						echo $(date +'%Y-%m-%d %H:%M:%S')" 开始删除备份索引:"${indexName}_backup_${delday}
						#删除该索引旧备份数据
						${map["curlPath"]} -XDELETE http://${map["ipAddress"]}:${map["portNumber"]}/_snapshot/${map["warehouseName"]}/${indexName}_backup_${delday}
						
						echo $(date +'%Y-%m-%d %H:%M:%S')" 完成删除备份索引:"${indexName}_backup_${delday}
						
						echo $(date +'%Y-%m-%d %H:%M:%S')" 开始同步备份索引:"${indexName}_backup_${saveday}
						#同步备份该索引数据
						${map["curlPath"]} -H "Content-Type: application/json" -XPUT http://${map["ipAddress"]}:${map["portNumber"]}/_snapshot/${map["warehouseName"]}/${indexName}_backup_${saveday}?wait_for_completion=true -d '{"indices":"'${indexName}'"}'
						
						echo $(date +'%Y-%m-%d %H:%M:%S')" 完成同步备份索引:"${indexName}_backup_${saveday}
					
					fi
				
				else
					echo $(date +'%Y-%m-%d %H:%M:%S')" es中不能存在索引:"${indexName}
					isSendEmailStr=1
				fi
				
			
			done
		else
			echo $(date +'%Y-%m-%d %H:%M:%S')" es地址访问异常:http:"//${map["ipAddress"]}":"${map["portNumber"]}
			isSendEmailStr=1
		fi
	} || {
		isSendEmailStr=1
	}
	

	#判断命令执行是否有异常,如果有异常就发送邮件
	if [ ${isSendEmailStr} == "0" ];then
			echo $(date +'%Y-%m-%d %H:%M:%S')" 执行elasticsearch备份命令全部正常"
		else 
			echo $(date +'%Y-%m-%d %H:%M:%S')" 执行elasticsearch备份命令有异常,开始发送邮件通知管理员"
			
			#遍历收件人的邮箱地址,逐个发送邮件
			for email in ${semdEmailToArr[@]};
			do
				echo $(date +'%Y-%m-%d %H:%M:%S')" 开始发送邮件:"${email}

				echo ""${map["sendEmailContent"]} | mail -s ""${map["sendEmailTitle"]} ${email}
			done
			
			echo $(date +'%Y-%m-%d %H:%M:%S')" 执行elasticsearch备份命令有异常,成功发送邮件通知管理员"
	fi
	
	echo $(date +'%Y-%m-%d %H:%M:%S')" 脚本执行完毕"


else
	echo "文件不存在"
fi

(3)配置参数说明:

参数意义如下:
ipAddress=访问es的ip地址
portNumber=访问es端口
warehouseName=备份仓库名称
backupsFileDay=备份保留几天记录
backupBeforeDelete=是否先备份然后删除旧备份,yes、no
indexNames=要备份的索引名称或索引别名,多个索引用英文逗号分隔
curlPath=命令curl绝对路径
semdEmailTo=收件人邮箱,多个收件人邮箱用逗号隔开
sendEmailTitle=测试邮件主题(文本内容中一定不能包含=)
sendEmailContent=测试邮件内容(文本内容中一定不能包含=)

(4)使用注意事项:

使用注意事项:
1、默认的是.sh、.txt文件都要放在/woclod/shell脚本下,如果放置的路径变了,需要修改.sh中读取.txt配置文件的路径
2、备份异常发送邮件提醒采用的是mail,运行的linux上提前先安装好mail并配置到mail.rc发送邮件的信息才可以。
3、备份es的前提条件一:是es的elasticsearch.yml配置文件中配置好了备份仓库的实际路径。
4、备份es的前提条件二:在服务器上创建好了elasticserch.yml中配置的备份仓库对应的实际路径。
5、备份es的前提条件三:在es中创建了对应的备份仓库,就是一个备份仓库名称,可以设定备份速度、存储速度等。

(5)定时crond配置:

1 23 * * * /data/shell/esBackupsSql.sh &>/data/shell/esBackupsLogs/fileBackupsEcho_`date +\%Y-\%m-\%d-\%H-\%M-\%S`.txt 2>&1

猜你喜欢

转载自blog.csdn.net/LSY_CSDN_/article/details/91398893