Elasticsearch snapshot and restore

Sanjeev Rohila
3 min readApr 17, 2020

Elasticsearch snapshot is the backup of the one or more indexes in the elasticsearch cluster.

Backup

Create a snapshot directory

mkdir -p /esdata/esbackup

Give elasticsearch the permission to write on these directories

chown -R elasticsearch:elasticsearch /esdata/esbackup

Add the path to the elasticsearch config file

vim /etc/elasticsearch/elasticsearch.yml

path.repo: ["/esdata/esbackup"]

Restart the elasticsearch services

service elasticsearch restart

make sure the elasticsearch service is in active state.

Create the repository, creating the repository backup

curl -XPUT -H "Content-Type: application/json;charset=UTF-8" 'http://localhost:9200/_snapshot/backup' -d '{
"type": "fs",
"settings": {
"location": "/esdata/esbackup",
"compress": true
}
}'

Check the repository

curl -XGET http://localhost:9200/_snapshot/_all?pretty
{
"backup" : {
"type" : "fs",
"settings" : {
"compress" : "true",
"location" : "/esdata/esbackup"
}
}
}

Create a snapshot by name backup2, the important thing is there it backs up all the indexes

curl -XPUT  "http://localhost:9200/_snapshot/backup/mybackup2?wait_for_completion=true&pretty=true" -H "Content-Type: application/json;charset=UTF-8"
{
"snapshot" : {
"snapshot" : "mybackup2",
"uuid" : "5X60QHBNRhOddJOgVI7j9Q",
"version_id" : 7060299,
"version" : "7.6.2",
"indices" : [
"course",
"blog",
"test"
],
"include_global_state" : true,
"state" : "SUCCESS",
"start_time" : "2020-04-19T17:08:58.181Z",
"start_time_in_millis" : 1587316138181,
"end_time" : "2020-04-19T17:08:58.381Z",
"end_time_in_millis" : 1587316138381,
"duration_in_millis" : 200,
"failures" : [ ],
"shards" : {
"total" : 10,
"failed" : 0,
"successful" : 10
}
}
}

Now lets create a snapshot by name backup3, where were going to take two indexes blog & course

curl -XPUT  "http://localhost:9200/_snapshot/backup/mybackup3?wait_for_completion=true&pretty=true" -H "Content-Type: application/json;charset=UTF-8" -d '{
"indices": "blog,course",
"ignore_unavailable": true,
"include_global_state": false
}'
{
"snapshot" : {
"snapshot" : "mybackup3",
"uuid" : "e4dLWT8FRYu7WP-6kJWozg",
"version_id" : 7060299,
"version" : "7.6.2",
"indices" : [
"course",
"blog"
],
"include_global_state" : false,
"state" : "SUCCESS",
"start_time" : "2020-04-19T17:14:34.237Z",
"start_time_in_millis" : 1587316474237,
"end_time" : "2020-04-19T17:14:34.237Z",
"end_time_in_millis" : 1587316474237,
"duration_in_millis" : 0,
"failures" : [ ],
"shards" : {
"total" : 2,
"failed" : 0,
"successful" : 2
}
}
}

Restore

Create a snapshot directory

mkdir /esdata

On Source Elasticsearch instance go to the directory /esdata and create a tar of the esbackup directory, and copy the tar to the destination server at /esdata location using scp or whatever

tar -xvf esbackup.tar esbackup

scp esbackup.tar userid@dest_ip:~/esdata/

On destination server, untar the esbackup.tar at /esdata directory, and the directory esbackup is created with the data

tar -xvf esbackup.tar

On destination give elasticsearch user permission to write on these directories

chown -R elasticsearch:elasticsearch /esdata/esbackup

Add the path to the elasticsearch config file

vim /etc/elasticsearch/elasticsearch.yml

path.repo: ["/esdata/esbackup"]

Restart the elasticsearch services

service elasticsearch restart

make sure the elasticsearch service is in active state.

Create the repository, creating the repository esrestore

curl -XPUT -H "Content-Type: application/json;charset=UTF-8" 'http://localhost:9200/_snapshot/esrestore' -d '{
"type": "fs",
"settings": {
"location": "/esdata/esbackup",
"compress": true
}
}'

Verify the repository, the esrestore repo is created, as per output below

curl -XGET 'http://localhost:9200/_snapshot/_all?pretty'
{
"esrestore" : {
"type" : "fs",
"settings" : {
"compress" : "true",
"location" : "/esdata/esbackup"
}
}
}

Restoring the backup for single index

curl  -XPOST -H "Content-Type: application/json;charset=UTF-8" "http://localhost:9200/_snapshot/esrestore/mybackup/_restore?wait_for_completion=true&pretty=true" -d '{
"indices": "test",
"ignore_unavailable": true,
"include_global_state": true
}'
{
"snapshot" : {
"snapshot" : "mybackup",
"indices" : [
"test"
],
"shards" : {
"total" : 1,
"failed" : 0,
"successful" : 1
}
}
}

Restoring the backup for multiple indexes

curl  -XPOST -H "Content-Type: application/json;charset=UTF-8" "http://localhost:9200/_snapshot/esrestore/mybackup/_restore?wait_for_completion=true&pretty=true" -d '{
"indices": "blog,course",
"ignore_unavailable": true,
"include_global_state": false,
"rename_pattern": "index_(.+)",
"rename_replacement": "restored_index_$1"
}'
{
"snapshot" : {
"snapshot" : "mybackup",
"indices" : [
"course",
"blog"
],
"shards" : {
"total" : 2,
"failed" : 0,
"successful" : 2
}
}
}

Restoring the backup for all indexes is simple, just send request without any data to the above request.

References

Sign up to discover human stories that deepen your understanding of the world.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

Sanjeev Rohila
Sanjeev Rohila

Written by Sanjeev Rohila

A Infra2Qe automation engineer

No responses yet

Write a response