Bu yazıda Java ile ElasticSearch’de Yedekleme işleminin nasıl yapılacağını ifade edeceğiz.
ElasticSearch diğer veritabanları gibi veriyi karmaşık halde text üzerinde tutmaktadır. Bundan dolayı elasticsearch data klasörünü kopyalamak ve taşımak kolaydır. Buna karşın ortaya çıkacak birçok sorun düzgün çalışmama ihtimalinden dolayı fiziksel yedekleme mantıklı bir çözüm değildir.
ElasticSearch standart paketi içinde yedekleme modülü mevcuttur. Bu modül ile index’lenen veriyi ve kritik metadata’yı yedekleyebilir veya yedekten geri yükleyebilir. Örneğimizde bu yedekleme işlemini çok özet şekilde anlatacağız.
Orjinal ElasticSearch sayfasında ElasticSearch’de Yedekleme süreci çok ayrıntılı olarak şu linkte anlatılmıştır. Ben 6 adım da kısaca anlatacağım
1) Reporsitory Oluşturma
İlk olarak yedeklerimizi dosya sistemine kaydetmemiz için bir reporsitory oluşturmalıyız. Bu reporsitory oluştururken yedeklerin nereye kaydedileceği bilgisini vermeliyiz.
Bu örneği hem Java ile hemde Sense ile yaptım.
Eğer sense kullanıyorsanız doğru komut;
PUT http://localhost:9200/_snapshot/my_backup {“type”: “fs”, “settings”: { “location”: “/root/backup”, “compress”: true }}
Java’da ise
JSONObject cred = new JSONObject();
JSONObject auth = new JSONObject();
JSONObject parent = new JSONObject();
auth.put(“compress”, true);
auth.put(“location”, “/root/backup”);
parent.put(“settings”, auth);
parent.put(“size”, “1000”);
parent.put(“type”, “fs”);
String category = “_snapshot/my_backup”;
Bu metodu bir kere çalıştırdıktan sonra bir daha ihtiyaç duymayacağız. Şimdi yedekleme yapabiliriz.
Eğer reporsitry’inizi kontrol etmek isterseniz java’da “/_snapshot/_all” komutunu kullanabilirsiniz.( http://localhost:9200/_snapshot/my_backup/ )
Not: Bazı ElasticSearch sürümlerinde reporsitory adresini elasticsearch.yml ‘ye tanımlamanız gerekbilir. path.repo = “/var/www/test” şeklinde tanımlamak yeterlidir. Ayrıntılar için bkz
Step 2) Snapshot Alma
Snapshut o an için sistemin bir kopyasını al demek oluyor,
Sense: PUT http://localhost:9200/_snapshot/my_backup/snapshot_snapismi { “indices”: “nodename”}
Eğer Ubuntu kullanıyorsanz, Ubuntunun büyük harf’e izin vermediğini unutmayın.Diğerlerinin aksine burada bağlantı metodu “PUT” olmalıdır.
JAVA: String category = “_snapshot/my_backup/snapshot-1?wait_for_completion”;
category = category.toLowerCase();
Aynı isimde sadece 1 backup alabilir, eğer 2 kere alınırsa ilk alınan mevcudiyetini korur. Yedeğiniz alınıp kaydedilmiştir. Bundan sonra yedeğinizi kolayca taşıyabilir / depolayabilirsiniz. Eğer clustering bir sistem kullanyorsanız master node’dan alınan yedek tüm sistemi kapsar.
Stem 3) Geri Yükleme
Geri yükleme yapmadan önce indexleme özelliği kapatılmalıdır. Eğer elasticsearch’iniz birden fazla index içeriyorsa hepsi kapatılmalıdır.
İndexlemeyi Kapatmak İçin : Sense: XPOST localhost:9200/my_index/_close
Yedek Almak İçin: Sense: POST _snapshot/my_backup/snapshot_14/_restore
JAVA: String category = “_snapshot/my_backup/backupname/_restore”;
Restore komutundan sonra indexlemeler otomatik olarak açılır. Java’da Geri yükleme işleminde normalden farklı bir durum söz konusudur.
Normalde tüm elasticsearch metodlarımız OutputStreamWriter wr = new OutputStreamWriter(con.getOutputStream()); wr.write(parent.toString()); wr.flush(); ‘dan oluşmaktadır.
Buna karşın Geri Yükleme Metodu sadece con.getOutputStream(); ‘den oluşur. Diğer bir deyiş ile hiçbir parametre gönderilmez.
Kaynakça
- http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-open-close.html#indices-open-close
- http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-snapshots.html
- http://chrissimpson.co.uk/elasticsearch-snapshot-restore-api.html
- https://github.com/elasticsearch/elasticsearch/issues/3826
- If you have any trouble to install sense http://joshslauson.com/blog/how-to-install-sense-chrome-extension-from-source/
Bu Makale de Kullandığım Tüm Sense Komutları
PUT _snapshot/my_backup {“type”: “fs”, “settings”: { “location”: “/root/backup”, “compress”: true }}
GET /_snapshot
GET /_snapshot/_all
GET _snapshot/my_backup?pretty { “my_backup” : { “type” : “fs”, “settings” : { “compress” : “true”, “/root/backup” } }}
PUT _snapshot/my_backup/snapshot_14?wait_for_completion=true
POST _snapshot/my_backup/11_sep_2014_03_44_16/_restore
POST /articles/_close
POST /articles/_open