备份和还原,为何elasticsearch还须要备份呢,明明能够设置副本作到高可用,那怕啥呢?html
其实在实际的生产环境中,通常最终的结果数据都是要备份的,这样的作的目的,就是可以以最快的速度还原数据,找回数据。明明mysql能够有主从,es有副本,备份干啥呢?不就是为了万无一失吗,生产环境有时候压力会很大,像mysql频繁的插入和删除数据也会致使binlog日志同步延迟,有时候就不必定可以作到同步,还有就是误操做删除了一些有用的数据呢,对吧,这个叫作有备无患。es也一样,万一一波操做猛如虎,一把把某个索引删除了呢,没有备份,到时候怎么死的都不知道呢,因此呢,从集群的角度去思考,权限,数据备份,高可用,节点拓展等都很重要。elasticsearch备份数据有不少选择,本地呀,Amazon S3, HDFS, Microsoft Azure, Google Cloud Storage这些均可以,可是我这里选择了hdfs,由于作大数据的熟悉呀,还有就是hdfs就是一个分布式的存储系统,也是数据高可用的呀,只要集群不椡,我数据依然完整,因此一点都不方了,因此这篇文章是基于HDFS的Elasticsearch的数据备份和还原。mysql
如何存储:能够存储在本地,或者远程的存储库:Amazon S3, HDFS, Microsoft Azure, Google Cloud Storage等sql
操做步骤:第一步:须要注册快照存储库,第二步:才能进行建立快照api
快照原则:快照属于增量快照,每一个快照只存储上一个快照没有的数据,可是均可以经过制定参数进行制定索引进行快照备份安全
恢复原则:默认恢复所有, 也能够根据需求指定恢复本身须要的索引或者数据流,能够指定索引就行单独还原dom
注意点:可使用快照的生命周期来自动的建立和管理快照,备份的时候不能直接经过复制数据进行备份,由于复制的过程当中es可能会改变数据的内容,会致使数据不一致的问题socket
具体的备份和还原细节就交给下文了,看下版本是否支持,若是不支持经过备份还原迁移数据的,可使用_reindex作跨集群的数据迁移:elasticsearch跨集群数据迁移elasticsearch
本地安装hdfs的插件(每个es节点都须要安装):分布式
下载:https://artifacts.elastic.co/downloads/elasticsearch-plugins/repository-hdfs/repository-hdfs-7.8.1.zipide
安装文档:https://www.elastic.co/guide/en/elasticsearch/plugins/7.9/plugin-management-custom-url.html #7.9的文档不影响哈
具体执行:./bin/elasticsearch-plugin install file:///data/hd07/car/repository-hdfs-7.8.1.zip #这里不要忘记加file:///
而后须要重启ES的集群
cd elasticsearch-7.8.1/plugins && ll
一看,没毛病,一个hdfs插件就这么装好了,接下来咱们在hdfs上建立用来存储elasticsearch备份的文件目录(注:这里咱们的hadoop是3.x的,chh6.3.2的,虽然官方说是hadoop2.7(2.x),好像也没什么影响)
hadoop fs -mkdir /es_bak hadoop fs -chmod 777 /es_bak #这里我就简单了,省得其余用户没权限写
这里咱们就完成了hdfs的设置了,接下来就是elasticsearch的备份和还原操做了
elasticsearch的备份分为两步,第一步:须要注册快照存储库,第二步:才能进行建立快照
快照存储库能够包含同一个集群的多个快照。快照是经过集群中的惟一名称标识的,接下来咱们就看看基于hdfs的快照存储库的建立:
put _snapshot/my_snapshot { "type": "hdfs", "settings": { "uri": "hdfs://ip:8020/", "path": "/es_bak", "conf.dfs.client.read.shortcircuit": "true", #其实这个参数是hdfs的一个dfs.client.read.shortcircuit,用来作节点移动计算,而不是移动数据的理念,数据本地化 "conf.dfs.domain.socket.path": "/var/run/hdfs-sockets/dn" #配置了上面那个参数,若是hdfs集群没这参数dfs.domain.socket.path就会报错 } }
其实CDH版本的hadoop的HDFS默认这两个都是配置了的
因此上面的两个参数是能够不配置的,由于主机HDFS默认都有配置了的呢
如今咱们查看下咱们建立好了的快照存储库:
get _snapshot/
有图有证据,这个快照存储库就建立好了,接下来咱们看看建立快照存储库的时候参数设置:
uri #hdfs的地址hdfs://<host>:<port> #这里须要注意一点,通常公司的hadoop都是高可用集群,这里要配置高可用的地址,不能写死了 path #快照须要存储在hdfs上的目录/es_bak (必填) conf.<key> #这个是用来添加hadoop的一些配置的,好比上面例子"conf.dfs.client.read.shortcircuit": "true" load_defaults #是否加载hadoop的配置,默认加载 compress #是否压缩元数据,默认false max_restore_bytes_per_sec #每一个节点的恢复速率。默认为无限 max_snapshot_bytes_per_sec #每一个节点快照速率。默认值为每秒40mb readonly #设置快照存储库为只读,默认false chunk_size #覆盖块大小,默认disabled security.principal #链接到安全的HDFS集群时使用的Kerberos主体
这部分就说到这里了,这个是官方文档:https://www.elastic.co/guide/en/elasticsearch/plugins/7.9/repository-hdfs-config.html
官方网址:https://www.elastic.co/guide/en/elasticsearch/reference/current/snapshots-take-snapshot.html
使用格式:
PUT /_snapshot/<repository>/<snapshot>
POST /_snapshot/<repository>/<snapshot>
快照建立细节:
先来个例子:
PUT /_snapshot/my_snapshot/snapshot_1?wait_for_completion=true { "indices": "index_name_word", "ignore_unavailable": true, "include_global_state": false, "metadata": { "taken_by": "lgh", "taken_because": "backup test" } }
而后咱们看看hdfs上面:
hadoop fs -ls /es_bak
hadoop fs -ls /es_bak/indices
单独的索引算是备份完成了,接下来咱们看看参数:
ignore_unavailable #默认false,表示对于任何的请求丢失或关闭的数据流或索引,返回一个错误 indices #默认状况下,快照包括集群中的全部数据流和索引,要来设置须要备份的索引,多个之间用逗号(,)分隔,支持正则est* or *test or te*t or *test*或者使用(-)减号排除-test3 include_global_state #快照中包含当前集群状态。默认值为true,主要包括这些元数据:Persistent cluster settings,Index templates,Legacy index templates,Ingest pipelines,ILM lifecycle policies master_timeout #指定等待链接到主节点的时间。若是在超时到期前没有收到响应,则请求失败并返回错误。默认为30秒 metadata #可添加一些备注信息,如上个例子所示 partial #默认false,表示若是快照中包含的一个或多个索引没有全部的主分片可用,则整个快照将失败 wait_for_completion #默认false,请求在快照初始化时返回响应,不然要等待完成才返回
官网还提供了根据时间后缀来建立快照名:
可是实验了一下,失败了:
不过稍微修改下就行了:
put _snapshot/my_snapshot/<yy{now{yyyy.MM.dd}}> #参考https://www.elastic.co/guide/en/elasticsearch/reference/current/date-math-index-names.html
get _snapshot/my_snapshot/_all
官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/snapshots-restore-snapshot.html
还原语法:POST /_snapshot/my_backup/snapshot_1/_restore
默认状况下,快照中的全部数据流和索引都将恢复,但不会恢复集群状态。不过可使用indices参数指定索引进行还原恢复。
注意1:每一个数据流都须要一个匹配的索引模板。使用此模板建立新的索引。若是不存在能够建立一个匹配的索引模板,或者恢复集群的元数据。否则的话,数据流不能滚动的建立新的索引
注意2:恢复索引时,若是索引名存在是不会被还原的,除非该索引被关闭了,还要保证分片数相同,才会进行还原,还原的过程当中会自动打开已经关闭的索引,若是索引不存在则会建立新的索引
看下具体的参数:
ignore_unavailable #默认false,表示对于任何的请求丢失或关闭的数据流或索引,返回一个错误 ignore_index_settings #一个逗号分隔的索引设置列表,忽略不须要恢复的索引 include_aliases #默认true,恢复时是否恢复别名 include_global_state #是否恢复集群的状态,元数据信息,默认false index_settings #设置索引设置,能够用来覆盖原索引的索引配置 indices ##默认状况下,快照包括集群中的全部数据流和索引,要来设置须要还原的索引,多个之间用逗号(,)分隔,支持正则est* or *test or te*t or *test*或者使用(-)减号排除-test3 partial ##默认false,表示若是快照中包含的一个或多个索引没有全部的主分片可用,则整个快照将失败 rename_pattern #定义用于恢复数据流和索引的重命名模式。与重命名模式匹配的数据流和索引将根据rename_replacement进行重命名。可以使用正则 rename_replacement #定义重命名替换字符串 wait_for_completion #默认false,请求在快照初始化时返回响应,不然要等待完成才返回
实例一(没有试验,官方实例):
POST /_snapshot/my_backup/snapshot_1/_restore { "indices": "data_stream_1,index_1,index_2", "ignore_unavailable": true, "include_global_state": false, "rename_pattern": "index_(.+)", "rename_replacement": "restored_index_$1", "include_aliases": false }
实例二(没有试验,官方实例):
POST /_snapshot/my_backup/snapshot_1/_restore { "indices": "index_1", "ignore_unavailable": true, "index_settings": { #修改索引配置 "index.number_of_replicas": 0 }, "ignore_index_settings": [ #忽略的索引 "index.refresh_interval" ] }
使用_current参数检索集群中当前运行的全部快照
GET /_snapshot/my_backup/_current
检索关于单个快照的信息
GET /_snapshot/my_backup/snapshot_1
如上能够检索多个快照,可使用逗号隔开,或者使用*这样的通配符以及_all表示全部,例如:
GET /_snapshot/my_backup/snapshot_*,some_other_snapshot GET /_snapshot/_all GET /_snapshot/my_backup,my_fs_backup GET /_snapshot/my* GET /_snapshot/my_backup/_all
对快照存储库和快照的状态经过_status查看:
GET /_snapshot/_status GET /_snapshot/my_backup/_status GET /_snapshot/my_backup/snapshot_1/_status
详情见:https://www.elastic.co/guide/en/elasticsearch/reference/current/get-snapshot-status-api.html
删除快照:
DELETE /_snapshot/my_backup/snapshot_1
一种是经过crontab定时备份(这里不说,很简单),还有一种是经过Elasticsearch的SLM策略进行定时备份。
咱们都知道备份这种事情呢不是单单去备份一次,也不能每次都去手动备份,因此es的备份提供相似crontab同样的时间调度。能够设置快照生命周期策略来自动化快照的计时、频率和保留。快照策略能够应用于多个数据流和索引。
使用SLM策略自动化Elasticsearch数据流和索引的平常备份。该策略获取集群中全部数据流和索引的快照,并将它们存储在本地存储库中。它还定义了一个保留策略,并在再也不须要快照时自动删除快照。
要使用SLM,您必须配置一个快照存储库。存储库能够是本地(共享文件系统)或远程(云存储)。远程存储库能够驻留在S三、HDFS、Azure、谷歌云存储或存储库插件支持的任何其余平台上
因此有两个步骤:第一步,建立快照存储库,第二步:建立SLM策略
第一步:建立快照存储库(查看3.1.一、注册快照存储库)
第二步:建立SLM策略
官方实例:
PUT /_slm/policy/nightly-snapshots { "schedule": "0 30 1 * * ?", #配置定时调度,参考https://www.elastic.co/guide/en/elasticsearch/reference/current/trigger-schedule.html#schedule-cron "name": "<nightly-snap-{now/d}>", #配置快照名字,能够经过时间为后缀名 "repository": "my_repository", #快照存储库名 "config": { #用于快照请求的配置,能够从建立快照中的参数配置 "indices": ["*"] #好比对某些索引进行快照 }, "retention": { #保留策略:将快照保存30天,不管快照的年龄如何,至少保留5个且不超过50个快照 "expire_after": "30d", "min_count": 5, "max_count": 50 } }
实验:
put _slm/policy/nightly-snapshots { "schedule": "0 30 1 * * ?", "name": "<lgh-{now{yyyy.MM.dd}}>", "repository": "my_snapshot", "config": { "indices": ["*"] }, "retention": { "expire_after": "30d", "min_count": 5, "max_count": 50 } }
POST /_slm/policy/nightly-snapshots/_execute #手动执行快照策略
get _snapshot/my_snapshot/_all #查看建立的快照信息
GET /_slm/policy/nightly-snapshots?human #检索策略以获取成功或失败信息
本篇文章差很少结束了,还有要拓展的最好去官网看看,好比要进行SML安全相关的:https://www.elastic.co/guide/en/elasticsearch/reference/current/slm-and-security.html