ElasticSearch Temel Bilgiler

Temel Bilgiler

Cluster

Cluster verilerin tümünün tutan bir yada birden çok node’un (server’ın) kümelenmiş halidir. Cluster’lar eşsiz isimlere sahiptir ve default isimleri “elasticsearch”tür. Bu isim önemli çünkü bir node sadece – isimle belirlenmiş olan, katılmasının mümkün olduğu cluster’a katılabilir. Production’da özel bir isim koymak faydalı olacaktır. Ayrıca içerisinde tek bir node bulunan bir cluster kullanmanın da herhangi bir sakıncası olmadığı gibi, her biri eşsiz isimlere sahip birden çok cluster’da kullanılabilir.

Node

Node, bir cluster’ın parçası olan tek bir server’dır. Node’lar verileri tutar ve cluster’ın indexleme ve arama becerilerine katkıda bulunur. Aynı cluster’lar gibi node’larda isimlere sahiptir (rastgele bir Marvel karakterinin adı) ve bu isim node başlatıldığı anda atanır. İsteğe bağlı olarak node’ların isimleri değiştirilebilmektedir. Bu sayede, mantıklı isimler vererek hangi node’un hangi cluster’da olduğu anlaşılabilir.

Bir node cluster ismi ile, belirlenmiş özel bir cluster’a katılmak üzere konfigüre edilebilir. Default olarak her node oluşturulduğu anda, “elasticsearch” ismindeki cluster’a katılma davranışı gösterir. Tek bir cluster içerisinde istenilen miktarda node oluşturulabilir. Eğer networkte çalışan başka bir node yoksa, bir node oluşturulduğunda aynı zamanda “elasticsearch” isminde bir cluster oluşturur.

Index

Bir index benzer özelliklere sahip belgeler topluluğudur. Örneğin müşteri bilgilerinin tutulduğu, ürünlerin tutulduğu, siparişlerin tutulduğu ayrı ayrı index’ler olabilir. Index’ler tümü küçük harften oluşan isimler ile tanımlanır.

Type

Bir index içerisinde bir veya birden çok type tanımlanabilir. Type – herhangi bir index içerisinde ki mantıksal bir kategori/partition’ı temsil eden yapıdır. Örneğin bir blog siteniz olduğunu var sayın, bu site için tanımladığınız index’te, ortak özelliklere sahip kullanıcı bilgilerini tutan bir type, gönderileri tutan bir type ve yorumları tutan bir type tanımlayabilirsiniz.

Document

Document indexlenebilir en küçük bilgi parçasıdır. Örneğin bir döküman tek bir müşterinin bilgileri, tek bir ürünün bilgileri veya tek bir siparişin bilgilerini tutabilir. Tüm dökümanlar JSON olarak tutulmaktadır. Herhangi bir index veya type içerisinde istenilen miktarda document tutulabilir. Bir döküman index’lenebilmesi için mutlaka index içerisinde ki bir type’a atanmış olmalıdır.

Shards & Replicas

Bir index, çok fazla veri barındırdığı zaman node’un donanımsal depolama limitlerini zorlayabilecek duruma gelebilir. Örneğin, içerisinde trilyonlarca document olan tek bir index düşünün ve bu index 1TB disk alanı kaplasın. Bu boyutta bir indexin diske sığmama olasılığı olduğu gibi, bu index’te tek bir node’dan gelen arama istekleride çok yavaş ceveplanabilecektir.

Bu sorunu çözmek için elasticsearch, bir index’i birden çok parçaya bölmemize olanak tanıyan “shards” yapısını kullanmakta. Bir index oluşturduğunuzda çok kolay bir şekilde kaç tane shard kullanmak istediğinizi tanımlayabilirsiniz. Her bir shard, bir index’in sahip olduğu tüm özelliklere sahip olan ve cluster’da ki herhangi bir node’da barındırılabilen tamamen bağımsız bir indexe sahiptir.

Sharding iki sebepten ötürü önemlidir:

  1. Yığının yatak olarak bölünebilmesini ve ölçeklenebilmesini sağlar.
  2. İşlemleri shard’lar üzerinde (muhtemelen farklı node’lar üzerinde ki) bölmenize ve paralel işlemler yürütmenize olanak tanıyarak performans artışı sağlar.

Shard mekanizması ve shardların nasıl dağıtık hale getirildiği tamamen elasticsearch tarafından yönetilen – ancak kullanıcı tarafından da görülebilen süreçlerdir.

Bir ağda veya bulut ortamında herhangi bir zamanda kesinti yaşanması mümkündür. Bu yüzden de, shard’ın veya node’un devre dışı kalmasına karşı mutlaka durumun üstesinden gelecek bir kurgu yapılmalıdır. Bu amaçla elasticsearch’te – index shard’larının bir veya birden çok kopyasının oluşturulabilmesini sağlayan replica shard (replika) yapısı bulunur. Replikalar iki sebepten dolayı önemlidir:

  1. Herhangi bir shard veya node erişilemez olduğunda yüksek erişilebilirlik sağlar. Bu yüzden de, replica shard’lar asla kopyası olduğu shard ile aynı node üzerinde bulunmamalıdır!
  2. Aramalar tüm replikalar üzerinde paralel bir şekilde yürütülebildiği için, hızlı ölçeklenebilir arama sağlar.

Özetlemek gerekirse, her bir index birden çok parçaya (shard) bölünebilir. Bir index ayrıca hiç replika edilmeyebilir ve istendiği kadar da replika edilebilir. Herhangi bir index replika edildiği zaman bir tane birincil shard’ı bir tanede replika shard’ı (birincilin kopyası) oluşur. Kaç tane shard kullanılacağı ve replikaların sayısı herhangi bir index oluşturulurken tanımlanabilir. İndex oluşturulduktan sonra ise replikaların sayısı dinamik olarak değiştirilebilirken, shard’ların sayısı değiştirilemez.

Default olarak elasticsearch’te ki bir bir index 5 tane birincil shard’a ve 1 tane replikaya sahiptir. Bu da, eğer cluster’ınızda 2 tane node’unuz varsa, indexinizin 5 tane birincil shard’ının ve 5 tanede replika (yani 1 tam replika) shard’ının – yani toplamda 10 shard’ınızın olacağı anlamına gelir.

Her bir shard bir Lucene indexidir ve bir Lucene indexinde en fazla 2.147.483.519 tane document bulunabilir. Shard’ların boyutları _cat/shards API’si ile kontrol edilebilir.


Kurulum

ElasticSearch en iyi performans için Oracle Java’ya ihtiyaç duymaktadır.

ile java sürümü ve Oracle mı yoksa OpenJDK mı olduğu kontrol edilebilir.

OracleJDK

Öncelikle sisteminde OpenJDK veya OracleJDK kurulu olmalıdır. Ubuntu’da güncel OpenJDK ile sorunsuz çalışmakla birlikte, Debian 7 sürümünde Oracle JDK kurulumu gerektirdi. Yine de OracleJDK kullanmakta fayda var.

Ubuntu’da OracleJDK kurulumu:

Ubuntu’da herşey yolundaysa “java -version” çıktısı şöyle birşey olacaktır:

  • Java8 environment variable’ları otomatik olarak SET etmek için şunu da kurun:

Elasticsearch deb paketi üzerinden kurulabilir. Kurmadan önce güncel dökümana bakınız:


Cluster İşlemleri

Cluster Sağlığı

Cluster’ın sağlık durumu curl ile (veya herhangi bir HTTP client ile) kontrol edilebilir.

Cluster Durumu

Cluster Stats

Node’ların Kontrolü

“elasticsearch” cluster olarak tüm network’te broadcast yaptığı için devel vb. makinalarda görünür durumda.

Indexlerin Kontrolü

Yeni Bir Index Oluşturma

Customer adında bir index oluşturalım ve “pretty” ekleyerek JSON yanıtının güzel görünmesini söyleyelim.

Yeni oluşan customer index’i şuan yellow durumda bunun sebebi ise bazı replikaların henüz ayrılmamış olması. Çünkü elasticsearch default olarak bu indexe bir tane replika oluşturdu ve şuan çalışan bir tane node’umuz var. Bu yüzden de bir replikamız, başka bir node eklenene kadar ayrılamıyor. Bu replika, başka bir node’a ayrılana kadar sarı durumda kalacak – başka node’a gittiği zaman ise durum yeşile dönecek.

Bir Dökümanı Indexe Ekleme

Customer index’imize “external” tipinde ve 1 ID’li herhangi bir döküman eklemek için:

Eğer bir döküman olmayan bir index’e eklenmeye çalışılırsa – o index otomatik olarak oluşturulur.

Bir dökümanı ayrıca ID belirtmeden de index’e ekleyebiliriz. Bu durumda elasticsearch o döküman için otomatik olarak ID oluşturur. Dikkat edilmesi gereken nokta, ID belirtildiğinde PUT, belirtilmediğinde POST kullanılmasıdır.

  • Dökümanı Index’e ID ile ekleme =>

  • Dökümanı Index’e ID’siz ekleme =>

Index’ten Dökümanı Görüntüleme

Bir Index’i Silme

Tüm Index’leri Silme

API Yapısı

Elasticsearch sorgularının tümü RESTful bir yapıya sahiptir. Aşağıda ki yapı kavrandığında tüm işlemlere uygulanabilir:

Dökümanların Yerini Değiştirme

Bir dökümanın yerini değiştirmek için, bir dökümanı index’e ekleme işlemi aynen yapılır.

Yukarıda ki komut ID’si 1 olan John Doe kaydını – Serhat Dundar kaydı ile yer değiştirir. Aynı Ruby’de ki hash mantığı gibi – ekleme ve değiştirme aynı şekilde yapılıyor.

Dökümanları Güncelleme

Ayrıca herhangi bir document’e başka bir alanda ekleyebiliriz:

Dökümanları Silme

Tek bir dökümanı silme:

Bir kriterle eşleşen bütün dökümanları silme:

Bir Node’u Kapatma

Shard’ları Kontrol Etme

Dynamic Allocation


Konfigürasyon

  • Bir paket nereye kurulmuş görmek için:
  • Elasticsearch konfigürasyonu muhtemelen şurada olacak:

2 thoughts on “ElasticSearch Temel Bilgiler”

Leave a Reply