携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情
下载并安装HDFS插件
所有ES节点均需要安装该插件
①下载插件:artifacts.elastic.co/downloads/e…
②将插件上传到对应的服务器上
③安装插件:sudo sh bin/elasticsearch-plugin install file:////path/to/plugin.zip
如果需要卸载插件则使用
remove命令
sudo sh bin/elasticsearch-plugin remove repository-hdfs
④安装完插件后,集群的各个节点需要重启,以此来让插件生效
HDFS的存储库
我们需要先创建一个(或多个)存储库,才能进行快照。
①创建仓库
PUT _snapshot/my_hdfs_repository
{
"type": "hdfs",
"settings": {
"uri": "hdfs://namenode:8020/",
"path": "elasticsearch/repositories/my_hdfs_repository"
}
}
其中,my_hdfs_repository为我们自定义的 HDFS 存储库的名称,hdfs://namenode:8020/为访问 HDFS 集群的地址。如果上述命令执行成功,则会返回
{
acknowledge: ture
}
除此之外,在创建 HDFS 存储库的时候,还可以指定其他参数,如快照的速度等,具体可参考「Configuration Properties」文档。
②查询仓库
GET _snapshot
③注销仓库
DELETE _snapshot/仓库名称
快照
①创建快照
PUT _snapshot/仓库名称/快照名称?wait_for_completion=true
{
"indices": "index_1,index_2",
"ignore_unavailable": true,
"include_global_state": false,
"metadata": {
"taken_by": "kimchy",
"taken_because": "backup test"
}
}
其中:
wait_for_completion=true参数表示阻塞该操作,直到该操作执行完成之后在返回。indices参数标识给哪些索引拍摄快照,如果不写,则是给所有索引拍摄快照ignore_unavailable将其设置为true将会在创建快照时忽略不存在的索引。默认情况下,当ignore_unavailable选项未设置且索引丢失时,快照请求将失败。include_global_state设置为false,可以防止集群全局状态存储为快照的一部分metadata可用于将任意元数据附加到快照。这可能是谁拍摄了快照的记录,为什么拍摄,或任何其他可能有用的数据。
②查询快照
GET _snapshot/仓库名称/快照名称
③查询快照状态
GET _snapshot/快照名称/_status
④删除快照
DELETE _snapshot/仓库名称/快照名称
还原
索引快照的还原,可以分为两种情况,分别是:
- 在同一个集群还原快照;
- 在不同的集群还原快照。
无论是否跨集群还原快照,其操作命令都是一样,即
POST _snapshot/仓库名称/快照名称/_restore?wait_for_completion=true
{
"indices": "cars", //指定索引恢复,不指定就是所有
"ignore_unavailable": true, //忽略恢复时异常索引
"include_global_state": false //是否存储全局转态信息,fasle代表有一个或几个失败,不会导致整个任务失败
}
此外,还可以在恢复的过程中,修改index的一些设置,比如下面的命令:
POST /_snapshot/my_hdfs_repository/snapshot_2/_restore
{
"indices": "index_1",
"index_settings": {
"index.number_of_replicas": 0,
"index.routing.allocation.include._name": "node-1,node-2,node-3,node-4,node-5,node-6"
},
"ignore_index_settings": [
"index.refresh_interval"
]
}
由于快照包含构成索引的磁盘上数据结构的副本,因此快照只能还原到可以读取索引的 Elasticsearch 版本:
- 在
6.x中创建的索引快照可以还原到7.0.0 - 在
5.x中创建的索引快照可以还原到6.x - 在
2.x中创建的索引快照可以还原到5.x - 在
1.x中创建的索引快照可以还原到2.x
而5.x及之前版本的索引快照不能还原到7.0.0版本,具体可以参阅「Snapshot And Restore」,其给出了最新版本的兼容性说明。要注意,每个快照可以包含在不同版本的 Elasticsearch 中创建的索引,并且在还原快照时,必须确定能够将所有索引还原到目标集群中;否则的话,如果快照中的任何索引是在不兼容的版本中创建的,则无法还原快照。
除此之外,在跨集群还原索引快照的时候,我们需要在目标集群中创建与原始集群具体相同名称的存储库。例如,
PUT localhost1:9200: _snapshot/my_hdfs_repository
{
"type": "hdfs",
"settings": {
"uri": "hdfs://namenode:8020/",
"path": "elasticsearch/repositories/my_hdfs_repository"
}
}
如上述命令所示,假设我们在原始集群中创建了名为my_hdfs_repository的存储库,并且想将其存储的索引快照还原到目标集群,则需要在目标集群中创建如下存储库:
PUT localhost2:9200: _snapshot/my_hdfs_repository
{
"type": "hdfs",
"settings": {
"uri": "hdfs://namenode:8020/",
"path": "elasticsearch/repositories/my_hdfs_repository"
}
}
如果我们仔细观察上面的两条命令,我们会发现,两者的区别仅在于localhost1和localhost2的不同。但是有一点需要我们特别注意,那就是:两个集群的节点配置一定要相同,如果原始集群在节点中使用node.attr.rack划分了hot和warm属性,那么在目标集群也需要划分对应的属性,否则会还原失败。
【补充】
在数据还原的过程中,可能会出现意料之外的情况。所以需要了解一下用来帮助我们排查问题的相关查询
①查看分配失败的原因
GET _cluster/allocation/explain?pretty
②查看未分配的分片
GET _cat/shards?v=true&h=index,shard,prirep,state,node,unassigned.reason&s=state
几个参数解释如下:
v=true, 代表显示字段含义;否则首行内容不显示。h=*,代表列名;s=state,代表基于state方式排序。等价于:s=state:asc,默认升序方式排序。prirep,代表分片类型。p:代表主分片;r:代表副本分片。
③查看未分配的分片原因
GET _cluster/allocation/explain?filter_path=index,node_allocation_decisions.node_name,node_allocation_decisions.deciders.*
{
"index": "order_info",
"shard": 0,
"primary": false
}
上面的几个参数解释如下:
index:索引名称,建议结合前一步指定。shard:分片序号。从0开始计数。primary:是否主分片;true代表是;false代表否。
③分片重新分配
POST _cluster/reroute?retry_failed=true