Bazı Kavramlar (index, inverted index, shard, segment)
“index” kelimesi Elasticsearch’de biraz istismar edilmiş. Anlamak için kısaca bakalım:
Elasticsearch’de bir index ilişkili bir veritabanındaki veritabanları gibidir. Verileri sakladığınız yerlerdir. Ama gerçekte, bu sadece senin uygulamanın gördüğüdür. Temelde, bir index bir veya daha fazla shardı temsil eden mantıksal bir alan adıdır.
Ayrıca, “to index” (index’lemek) kavramıda veriyi Elasticsearch’e koymak/yüklemek anlamına gelmektedir. Verinizin geri istenebilecek şekilde saklandığını ve arama yapılabileceğini ifade eder.
inverted index Lucene’in verileri aranabilir yapmak için kullandığı bir veri yapısıdır. Bu işlemde dökümanın içerdiği verilerden tokenlar ve tekil terimler ortaya çıkarılır. Bu konu hakkında daha fazla bilgi almak için buraya bakabilirsiniz.
shard bir Lucene instance’ıdır. Kendi başına tamamen işlevsel bir arama motorudur. Bir index tek başına bir sharddan oluşabilir, ama genellikle index in büyüyebilmesi ve bir kaç node üzerinde dağıtılabilmesi için bir kaç sharddan oluşmaktadır.
primary shard bir döküman için ev sahipliği yapmaktadır. Bir replica shard ise primary shard bir kopyasıdır ve (1) primary bir şekilde hata verdiğinde ya da düştüğünde, (2) okuma çok arttığında, kullanılmaktadır.
Her shard birden fazla segment içermektedir ve bu segmentler bir inverted indextir. Bir shard üzerindeki bir arama sırayla her bir segment‘de aranacaktır ve sonra sonuçlar bu shard için son bir sonuçlar kümesinde toplanacaktır.
Siz bir dökümanı indexlerken(indexing), Elasticsearch onları bellekte(memory) toplayacaktır (ve güvenlik için transaction log‘da), sonra her saniye veya daha fazla zamanda bir bunu yapar, disk’e yeni bir segment oluşturur, ve aramaları refresh eder.
Bu veriyi yeni bir segment içerisinde aranabilir yapar, ama bu segment diske fsync edilmemiş haldedir. (Bende aynı soruyu kendime sordum. fsync nedir?) Veri halen kaybolma riskine sahiptir.
Elasticsearch, sık sık fsync anlamına gelen flush işlemini yapar, (şimdi veri işlenmiştir.) ve artık gereksiz hale gelen transaction logu temizler. Çünkü biz artık biliyoruz ki veri diske yazılmıştır.
Ne kadar çok segment varsa aramalar o kadar uzun sürer. Yani Elasticsearch arkaplanda çalışan birleştirici işlemler (merge process) ile benzer büyüklükteki bir kaç segmenti daha büyük bir segmente birleştirecektir. Yeni oluşan daha büyük segment diske yazıldıktan sonra eskileri silinecektir. Bu işlem bir çok aynı büyüklükte segment olduğu sürece tekrar eder.
Segmentler değişmezdir. Bir döküman update edildiğinde, eski döküman silindi olarak işaretlenir, ve yeni bir döküman eklenir. Birleştirme işlemleri aynı zamanda silinen dökümanlarıda çıkarır.