一、写作背景
有一个MD5数据库ELK项目(目前已经完成数据生成,变为只读项目),大概50多亿条,总量630G+,原来一直工作在本地网络,近期计划上线到阿里云,经研究计划使用ELK带的 snapshot 这个API来离线备份,做数据迁移。
Snapshot 支持nfs、s3、oss、hdfs等各种存储,这里选择nfs服务做为备份目录。
二、环境准备
本项目所有服务器均采用CentOS7系统
本项目ELK采用6.2.4版本,目前已经在本地系统,阿里云系统均有运行(其中阿里云中为空库)
Snapshot 只允许向同版本,或下一大版本还原备份,比如1.X版本可以向2.X版本还原,但是不能向5.X版本还原。
本项目使用Yum安装nfs系统
三、软件安装
3.1、安装NFS
在所有服务器上安装NFS并启动相关服务
yum install nfs-utils -y # 安装NFS
systemctl start rpcbind # 启动服务
systemctl start nfs # 仅在用做共享存储的服务器上启动此服务
# 如果开启了防火墙记得开启端口
四、软件配置
4.1 配置NFS服务
以下配置均在NFS服务器上执行,其它服务器上无需执行。
4.1.1 配置文件
修改 nfs-Server上的配置文件,给相应目录授权
vim /etc/exports
# 配置内容如下:
/nfs/elasticsearch 172.17.0.181(rw,sync,all_squash,anonuid=0,anongid=0,no_subtree_check) 172.17.0.182(rw,sync,all_squash,anonuid=0,anongid=0,no_subtree_check)
# /nfs/elasticsearch 这是要共享的目录
# 172.17.0.181 这是要主访问共享目录的主机,有几个添加几个,未添加的不能访问用空格隔离。
# (rw,sync,all_squash,anonuid=0,anongid=0,no_subtree_check) 这是对访问用户进行授权,这里授权每个远程用户均为root用户。
4.1.2 启动服务
# 创建共享目录,这个目录是自己定义的,可以随意设置。
mkdir -p /nfs/elasticsearch
# 重启 NFS 服务
systemctl restart nfs
4.2 挂载NFS共享
在所有客户端(本项目中为所有ES节点)挂载共享目录到同一路径下。
# 创建挂载目录
mkdir -p /data/backup/elasticsearch
# 挂载目录
mount -t nfs 172.17.0.59:/nfs/elasticsearch /data/backup/elasticsearc
# -t nfs 挂载来源文件格式,
# 172.17.0.59:/nfs/elasticsearch 远程目录
# /data/backup/elasticsearc 本地目录
# 查看挂载状态
mount
# 172.17.0.59:/nfs/elasticsearch on /data/backup/elasticsearch type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.17.0.181,local_lock=none,addr=172.17.0.59)
共享目录挂载完成后,即可让所有ES服务器使用使用。
可以在共享目录中创建文件查看其它服务器是否有相同文件来验证是否共享成功。
4.3 ES配置
修改elasticsearch.yml文件,创建repo备份库
vim /etc/elasticsearch/elasticsearch.yml
# 配置中添加,repo为共享目录
repo.path: ["/data/backup/elasticsearch", "/data/second/path/to/"]
# 重启ES服务,以加载备份设置(在生产环境要谨慎操作,应该依次关闭分片写入、重启服务,开启分片写入,具体操作以后附文)
systemctl restart elasticsearch
五、备份
以上步骤操作完成就可以执行备份了,要注意共享空间的大小。
可以使用 kibana 的 DevTools 中 或者 Curl 命令来执行操作,这里以DevTools为主介绍。
5.1、创建快照仓库
PUT _snapshot/md5_phone
{
"type": "fs",
"settings": {
"location": "md5_phone",
"compress": true
}
}
# _snapshot/md5_phone 快照仓库名称
# "type": "fs" 快照仓库存储类型
# ”location": "md5_phone" 快照仓库存储路径,这里可以是决对路径,也可以是相对路径,相对路径则对应上面配置的 repo.phth 的第一个目录
"compress": true 使用相对路径
# 确认仓库创建完成。
GET _snapshot/md5_phone
# {
# "md5_phone": {
# "type": "fs",
# "settings": {
# "compress": "true",
# "location": "md5_phone"
# }
# }
# }
5.2、创建快照
PUT _snapshot/md5_phone/snmphot_1?wait_for_completion=false
{
"indices": "md5_phone",
"ignore_unavailable": true,
"include_global_state": false
}
# _snapshot/md5_phone/snmphot_1 # 快照路径及名称
# wait_for_completion=false # 不实时显示快照状态
# "indices": "md5_phone" # 要创建的快照index,无此项则默认全部 多个Index 用”,"分割,如”md5_phone,index1,index2"等
#
# 查看快照
GET _snapshot/md5_phone/snmphot_1/_status
# {
# "snapshots": [
# {
# "snapshot": "snmphot_1",
# "repository": "md5_phone",
# "uuid": "bVDHwLmDRHuBMzUljNz2wQ",
# "state": "SUCCESS",
# "include_global_state": false,
# "shards_stats": {
# "initializing": 0,
# "started": 0,
# "finalizing": 0,
# "done": 4,
# "failed": 0,
# "total": 4
# },
# "stats": {
# "number_of_files": 1121,
# "processed_files": 1121,
# "total_size_in_bytes": 680299941585,
# "processed_size_in_bytes": 680299941585,
# "start_time_in_millis": 1564975289357,
# "time_in_millis": 6539774
# },
# "indices": {
# "md5_phone": {
# "shards_stats": {
# "initializing": 0,
# "started": 0,
# "finalizing": 0,
# "done": 4,
# "failed": 0,
# "total": 4
# },
# "stats": {
# "number_of_files": 1121,
# "processed_files": 1121,
# "total_size_in_bytes": 680299941585,
# "processed_size_in_bytes": 680299941585,
# "start_time_in_millis": 1564975289357,
# "time_in_millis": 6539774
# },
# "shards": {
# "0": {
# "stage": "DONE",
# "stats": {
# "number_of_files": 312,
# "processed_files": 312,
# "total_size_in_bytes": 169862877240,
# "processed_size_in_bytes": 169862877240,
# "start_time_in_millis": 1564975289399,
# "time_in_millis": 6459586
# }
# },
# "1": {
# "stage": "DONE",
# "stats": {
# "number_of_files": 284,
# "processed_files": 284,
# "total_size_in_bytes": 170112328580,
# "processed_size_in_bytes": 170112328580,
# "start_time_in_millis": 1564975289444,
# "time_in_millis": 6474304
# }
# },
# "2": {
# "stage": "DONE",
# "stats": {
# "number_of_files": 274,
# "processed_files": 274,
# "total_size_in_bytes": 170166763661,
# "processed_size_in_bytes": 170166763661,
# "start_time_in_millis": 1564975289405,
# "time_in_millis": 6462351
# }
# },
# "3": {
# "stage": "DONE",
# "stats": {
# "number_of_files": 251,
# "processed_files": 251,
# "total_size_in_bytes": 170157972104,
# "processed_size_in_bytes": 170157972104,
# "start_time_in_millis": 1564975289357,
# "time_in_millis": 6539774
# }
# }
# }
# }
# }
# }
# ]
# }
六、还原快照
6.1、本地还原
在 kibana 的 devtools 中执行还原命令
# 全部还原
post /_snapshot/md5_phone/snaphot_1/_restore
# 指定Index 还原
post /_snapshot/md5_phone/snaphot_1/_restore
{
"indices": "md5_phone",
"index_settings": {
"index.number_of_replicas": 0
},
"ignore_index_settings": [
"index.refresh_interval"
]
}
}
6.2、跨集群还原
跨集群还原要求新集群的软件版必须等于或高于原集群的版本,否则不能恢复成功。
参照第三节到第五节的流程,在新集群中添加共享,添加快照路径,然后执行还原,还原方式同 6.1节
七、文章引用
elasticsearch5使用snapshot接口备份索引
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 long@longger.xin