长期运维elasticsearch时,你可能会遇到一个非常实用的需求:elasticsearch集群的存储空间有限,而每天都有海量的日志数据流入集群中。但是旧数据往往使用频率极低,那么是不是可以定期将过期数据从集群中移除,当必须要使用的时候再移入。
一般使用Elasticsearch的公司都有hadoop集群,那么我们可以这么做:把 Elasticsearch 索引数据转移到 HDFS 上,以解决 Elasticsearch 上的磁盘空间;而在我们需要的时候,又可以从 HDFS 上把索引恢复回来继续使用。
我们可以利用snapshot/restore两个api做到这一点。注:如果想使用HDFS作为快照的存储介质,必须事先安装repository-hdfs插件(官方还提供了S3,HDFS,Azure,GoogleCloudStorage对应插件)
sudo bin/elasticsearch-plugin install repository-hdfs
创建repository
curl -XPUT 'localhost:9200/_snapshot/hdfs_repository' -d
'{
"type": "hdfs",
"settings": {
"uri": "hdfs://172.168.1.39:8020/",
"path": "elasticsearch/122_123_es-test"
}
}'
如果遇到问题你可以看我的文章:[ElasticSearch填坑]创建hdfs repository: Permission Denied
创建snapshot
curl -XPUT 'localhost:9200/_snapshot/hdfs_repository/snapshot_1' -d
'{
"indices": "logs-181998",
"ignore_unavailable": true,
"include_global_state": false
}'
"ignore_unavailable": true
忽略有问题的shard,"include_global_state": false
快照里不放入集群global信息。
如果遇到问题你可以看我的文章:[ElasticSearch填坑]创建Snapshot: SecurityException
还原restore
curl -XPUT 'localhost:9200/_snapshot/hdfs_repository/snapshot_1/_restore' -d
'{
"indices": "logs-181998",
"ignore_unavailable": true,
"include_global_state": false,
"rename_pattern": "logs(.+)",
"rename_replacement": "restored_logs$1"
}'
rename_pattern
和rename_replacement
用于重命名index,因为无法将index还原到open的index。
如果你想更深入的了解snapshot,可以看我的文章[Elasticsearch实战]snapshot 探索