0 背景微信公众号:运维开发故事,作者:double冬
任何一个存储数据的软件,都需要定期的备份数据。es replica提供了运行时的高可用保障机制,可以容忍少数节点的故障和部分数据的丢失,但是整体上却不会丢失任何数据,而且不会影响集群运行。但是replica没法进行灾难性的数据保护,比如说机房彻底停电,所有机器全部宕机,等等情况。对于这种灾难性的故障,我们就需要对集群中的数据进行备份了,集群中数据的完整备份。
Elasticsearch提供了replica解决方案,它可以帮我们解决了如果有一个或多个node失败了,那么我们的数据还是可以保证完整的情况,并且搜索还可以继续进行。但是,有一种情况是我们的所有的node,或者有一部分node失败,可能会造成我们的数据的丢失。也就是说replca不能提供一种灾难性的保护机制。我们需要一种完整的备份机制。
在Elastic里,我们提供了一个叫做snapshot及restore API的接口。使您可以使用数据和状态快照备份您的Elasticsearch索引和集群。快照很重要,因为快照会在出现问题时提供您数据的副本。如果需要回滚到旧版本的数据,则可以从存储库中还原快照。如上图所示,我们可以把当前index的状态及数据存入到一个repository里去。Elasticsearch 的 snapshot 是由其自身控制的,整个系统保持了一个如下的从下到上的控制结构,他们具备包含关系:
snapshot --> repository --> single snapshot --> indices
为了能够做备份,我们首先必须创建一个repository,也就是一个仓库。你可以为一个cluster创建多个仓库。目前支持的仓库类型有:这个仓库应该是一组 snapshot 备份的集合,也可以认为是一个目标的选择。在一个 Elasticsearch 系统中你可以根据自己的意愿设定不同的 Repository。
Elasticsearch支持仓库类型
| Respository | 配置类型 |
|---|---|
| Shared file system | “type”: “fs” |
| Read-only URL | “type”: “url” |
| S3 | “type”: “s3” |
| HDFS | “type”: “hdfs” |
| Azure | “type”: “azure” |
| Google Cloud Storage | “type”: “gcs” |
这里需要注意的是:S3, HDFS, Azure and GCS 需要相应的插件进行安装才可以。
Single snapshot这个指的是在 Repository 中我们进行的每个备份内容,他更像一个集合,包含了这次 snapshot 中所有的 Indices。
Indices在一个 snapshot 当中,可以包含多个 Indices 文件内容。他可以在执行 snapshot 的时候用 pattern 识别,也可以一个一个的指定。
S3 插件如果要想让 Elasticsearch 备份到 S3 当中需要单独安装一个插件 S3 Repository Plugin。
1 ES集群中插件安装和配置修改 1.1 自建ES集群下载repository-s3插件首先先要在es插件目录安装repository-s3的插件,必须在每个节点上都安装。
./bin/elasticsearch-plugin install repository-s31.2 修改elasticsearch的jvm.options
集群所有服务器节点都要操作,在配置文件最后添加如下内容
-Des.allow_insecure_settings=true
重启各节点上的elasticsearch服务,然后在浏览器中输入http://esip地址/_cat/plugins,马上能看到所有节点安装的插件,则表示安装成功
elastic官网文档,主要是介绍的对AWS上的S3如果配置进行说明,实际上如果公司没有使用AWS的话,还是不太适用的,这里主要是以国产云平台华为云上的对象存储OBS为例,大家可以根据自己公司的业务情况进行选择腾讯云COS、阿里云OOS;只需要我们的Repository类型使用的是s3就行
可以在kibana中使用dev_tools来调用API进行操作,如下所示,创建了一个仓库名为es_s3_repository,其中bucket是刚才创建的桶,access_key,secret_key,endpoint根据实际情况填写,compress为true表示为会对数据进行压缩
PUT _snapshot/es_s3_repository
{
"type": "s3",
"settings": {
"access_key": "xxxxxxxxxxxxxxx",
"secret_key": "xxxxxxxxxxxxxxxxx",
"bucket": "es-centre",
"endpoint":"xxxxxxxxxxxx",
"compress":"true"
}
}
执行之后返回为true,则为创建成功,如果返回其他错误,可能需要检查一下插件是否安装和jvm.options是否设置,集群重启成功
# 查看所有的仓库 GET /_snapshot/_all
返回结果
{
"es_s3_repository" : {
"type" : "s3",
"settings" : {
"bucket" : "es-centre",
"compress" : "true",
"endpoint" : "obs.cn-north-2.myhuaweicloud.com"
}
}
}
如果所示则为创建成功
3.2 创建快照测试(快照名index_bak)数据量太大会出问题,只能一个索引一个索引的做快照,如下为创建一个快照名为index_bak的快照,主要对index1,index2,两个索引进行创建快照
PUT /_snapshot/es_s3_repository/index_bak?wait_for_completion=true
{
"indices": "index1,index2",
"ignore_unavailable": true,
"include_global_state": false,
"metadata": {
"taken_by": "kimchy",
"taken_because": "backup before upgrading"
}
}
常用的API命令
# 查看所有的仓库 GET /_snapshot/_all # 查看某一个具体的仓库的快照情况 GET /_snapshot/es_s3_repository/_all?pretty # 列出所有当前正在运行的快照以及显示他们的详细状态信息 GET /_snapshot/_status?pretty # 列出所有当前正在运行的快照以及显示他们的详细状态信息 GET /_snapshot/es_s3_repository/_status?pretty # 查看指定快照的详细状态信息即使不是正在运行 GET /_snapshot/es_s3_repository/snapshot_2/_status?pretty #删除某一个快照 DELETE /_snapshot/es_s3_repository/snapshot_23.3 在kibana上添加快照策略
这种创建方式,是对es上所有的所有的索引都会创建快照,这里需要注意,如果是有特殊需求可以调用API来进行创建
创建策略基本信息,这里的策略名称可以自己修改,快照名称名称,是表示一天创建一个快照,命名为snapshot加日期,频率设置为天,计划就是定时任务,这里的设置,实际上会+8h,表示为每天的凌晨00点10分进行前一天的索引快照备份
image.png
参考文档:
https://blog.csdn.net/UbuntuTouch/article/details/103045482?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159819053019725211918411%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=159819053019725211918411&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_blog_default-1-103045482.pc_v2_rank_blog_default&utm_term=snapshot&spm=1018.2118.3001.4187 https://www.elastic.co/guide/en/elasticsearch/reference/7.9/snapshots-take-snapshot.html
公众号:运维开发故事
github:https://github.com/orgs/sunsharing-note/dashboard
爱生活,爱运维
如果你觉得文章还不错,就请点击右上角选择发送给朋友或者转发到朋友圈。您的支持和鼓励是我最大的动力。喜欢就请关注我吧~
扫码二维码
关注我,不定期维护优质内容
温馨提示
如果你喜欢本文,请分享到朋友圈,想要获得更多信息,请关注我。
........................



