Using Elasticsearch snapshots with Minio repository

This article shows you how to configure Elasticsearch to store snapshots and metadata in Minio. Minio is an object storage server built for cloud application developers and devops and compatible with Amazon S3 object storage.

The current aws cloud plugin of Elasticsearch has been build with an older version of the Amazon SDK, causing several issues. We’ve created a pull request to bump the aws sdk for Elasticsearch 5 here.

A patchfile to update the aws sdk for older versions can be found here.

Compiled plugins for Elasticsearch 2.3.4 and 2.4 can be found at this repository. These contain the bumped version of aws sdk together with a fix for double hashing.

To build the updated aws cloud plugin of Elasticsearch:

Custom building

Elasticsearch 2.x

git clone https://github.com/elastic/elasticsearch/
git reset — hard v2.3.4

Update pom.xml references to your Elasticsearch version. This is because otherwise during installation the plugin will complain about an incompatible version.

sed -i”.bak” s/”2.3.4-SNAPSHOT”/”2.3.4"/g **pom.xml

Apply the patch containing the newer SDK version, and fix the double hashing issue.

curl https://gist.githubusercontent.com/nl5887/95352af849089e69150bdf7129a83c92/raw/c36b172ea2c69a3e566194af59c9c3c8ff104010/aws-sdk-upgrade.patch|git apply -

Compile cloud aws plugin.

mvn package -pl plugins/cloud-aws

Elasticsearch 5.x

Elasticsearch 5 is using gradle. You can compile the updated plugin using:

gradle build -p plugins/repository-s3

Plugin install

We have to install the plugin so it can be used by Elasticsearch.

Plugin install on Elasticsearch 2.x (2.3.4)

sudo bin/plugin remove cloud-awssudo bin/plugin install file:/{path to elasticsearch}/plugins/cloud-
aws/target/releases/cloud-aws-2.3.4.zip

Plugin install on Elasticsearch 5.x

sudo bin/elasticsearch-plugin remove repository-s3sudo bin/elasticsearch-plugin install file:/plugins/repository-s3/build/distributions/repository-s3–5.0.0-alpha5-SNAPSHOT.zip

Configuration

Configure Elasticsearch to use V4 signing for S3, by adding the following to elasticsearch.yml.

cloud:    
    aws:        
        s3:            
            signer: "AWS4SignerType"

Now you should restart Elasticsearch. The new configuration and the installed plugins will become active.

With the following command you can verify the installed and active plugins.

curl http://127.0.0.1:9200/_cat/plugins?v

Working with snapshots

First we need to create a new bucket in Minio where the snapshots can be put../mc mb myminio/elasticsearch

Create repository:

Now we’ll configure a Elasticsearch repository using Minio as a backend.

curl -X POST http://127.0.0.1:9200/_snapshot/my_minio_repository — 
data ‘{ 
“type”: “s3”, 
“settings”: { 
“bucket”: “elasticsearch”, 
“region”: “us-east-1”, 
“endpoint”: “http://127.0.0.1:9000",  
“access_key”: “AJBCFEV8M5Q8XIQPRITQ”, 
“secret_key”: “TBPnPHamh6r7ypXACfO4Nxz59PjE+3SanplAZDzq”, 
“protocol”: “http” 
    }
        }’

Retrieve repository info

To confirm the repository has been created succesfully, we’ll use the get repository.

curl -X GET http://127.0.0.1:9200/_snapshot/my_minio_repository?pretty
{ “my_minio_repository” : { 
“type” : “s3”, 
“settings” : { 
“bucket” : “elasticsearch”, 
“endpoint” : “http://127.0.0.1:9000", 
“protocol” : “http”, 
“region” : “us-east-1” 
    } 
    }
}

Create snapshot

We’ll create a snapshot and wait for completion of it.

curl -X PUT 
http://127.0.0.1:9200/_snapshot/my_minio_repository/snapshot_1/\?wait_for_completion=true
{“snapshot”:{“snapshot”:”snapshot_1",”version_id”:2030399,”version”:”2.3.3",”indices”:[“minio”],”state”:”SUCCESS”,”start_time”:”2016–07–18T14:58:05.492Z”,”start_time_in_millis”:1468853885492,”end_time”:”2016–07–18T14:58:36.526Z”,”end_time_in_millis”:1468853916526,”duration_in_millis”:31034,”failures”:[],”shards”:{“total”:41,”failed”:0,”successful”:41}}}

Verify snapshot status

Retrieve the snapshot status.

curl -X GET http://127.0.0.1:9200/_snapshot/my_minio_repository/snapshot_1/{“snapshots”:[{“snapshot”:”snapshot_1",”version_id”:2030399,”version”:”2.3.3",”indices”:[“minio”],”state”:”SUCCESS”,”start_time”:”2016–07–18T14:58:05.492Z”,”start_time_in_millis”:1468853885492,”end_time”:”2016–07–18T14:58:36.526Z”,”end_time_in_millis”:1468853916526,”duration_in_millis”:31034,”failures”:[],”shards”:{“total”:41,”failed”:0,”successful”:41}}]}

Restore snapshot

Restore an existing index, make sure the index has been closed.

curl -X POST http://127.0.0.1:9200/_snapshot/my_minio_repository/snapshot_1/_restore{“accepted”:true}

References: