- Search işlemi gerektiren uygulamalarda sıklıkla kullanılır.
- Auto-complition web sitelerinde gördüğümüz otomatik tamamlamada kullanılır.
- Sistem loglarını, metriclerini depolayıp analiz etmede kullanılır.
- Elasticsearch ve Kibananın birlikte bize sunduğu Machine learning modelleriyle veriyi gerçek zamanlı analiz etmede kullanılır.
- Büyük ölçekli datalarda analiz işlemlerinde başarılıdır. Gerçekten terabytlarca datayı çok kolay bir şekilde indexleyip sorgulama performasnı yüksek şekilde hizmet veri
Elastic search faydaları
- Büyük bir veri yığını içerisinde hızlı search edebilme.
- Yazım yanlışı: biiskilet kelimesini arattığımızı düşünürsek bisiklet olduğunu anlayıp eşleştirebilir.
- Eş anlamlılar: Arattığımız cümlede "taşıt" kelimesi geçiyorsa "vasıta" kelimesi geçen sonuçları da bize getirebilir.
- Türetme ve Öneri:Kullanıcı search için kelime girerken daha o sırada onun populer searchleri görebilmesini sağlayabiliriz, suggestionlarla en çok arananlar popular sonuçlar ya da eşanlamlıları da search edebiliriz.
- İstatistik: Elimizdeki search verilerinden istatistiksel datalar da çıkarabiliriz.
Elasticserachü direkt olarak bir NoSQL veritabanı olarak görmek yanlıştır. Elasticsearchün geliştirilme amacı bir search ve analitic engine olarak kullanmaktır. Yani elasticsearchü docüment based bir veritabanı olarak kullanmamalıyız. Böyle bir ihtiyacımız var ise MongoDBye yönelmeliyiz.
Elastic Stack
Elasticsearch tarafından geliştirilen logstash, kibana, x-pack, beats gibi ürünleride kapsayan yapıya verilen isimdir. Bu ürünler genelde birlikte kullanılır.
Kibana: Elasticsearchün yönetimsel işlevlerini gerçekleştirebildiğimiz veri görselleştirme ile alakalı özellikleri kullanabildiğimiz ve cluster yönetimiyle alakalı işlerde kullandığımız yönetimsel web arayüzüdür.
Logstash: Uygulama loglarının elasticserache gönderilmesini sağlar. input,printer ve output olmak üzere üç tane ana yapısı vardır. Kaynaktaki veriyi input aşamasında alıp veriyi filtreden geçirir ve output alanında verdiğimiz hedefe datanın gönderilmesinden sorumludur.
X-pack: Elastic ve Kibanaya extra özellik kazandıran extension gibi düşünülebilir. Security, LDAP entegrasyonu, User Role tanımları, Elastic monitoring, Alerting gibi birçok özelliği x-pack aracılığıyla kullanıyoruz.
Beats: Datanın toplanmasını sağlar.Collect data. Filebeat en yaygın olarak kullanılanıdır. Genelde logstash ile çalışırlar. Toplanan data logstash aracılığıyla elasticsearche gönderilir.
Elastic’in FileBeat adlı ürünü, container loglarını yakalayabilme kapasitesine sahip bir ürün. Ayrıca yakaladığı logları diğer Elastic ürünlerine de direkt olarak iletebiliyor (Logstash’ iletmek ya da direkt olarak Elasticsearch’e yazmak gibi). Kibana ile de bu logları görselleştirebiliyorsanız, container olarak koşan her uygulama için ayrı bir log yapısı kurmaya gerek kalmadan bütün bu operasyonu tek bir merkezden yönetebilirsiniz.
Arthitecture
Node: Elasticsearch instance'larına verilen isimdir. Her node datanın bir parçasını depolar. Bu sayede distributed ve scaleable bir ortam sunar. Node kavramı direkt olarak server kavramına denk gelmez. Çünkü bir adet server üzerinde birden çok elacticsearch instancesi farklı portlarda çalışabilir. Fakat bu production ortamlarında önerilen bir yöntem değildir. Her nodun farklı bir serverlarda çalıştırılması önerilmektedir.
Cluster: Bir veya daha çok elasticsearch node'unun iletişim halinde çalışmasıyla ortaya çıkan yapıdır. Her node bir clustera aittir. Single node çalışan bir elasticsearchte bile bir Cluster kavramı vardır. Bir node başlatıldığında otomatik olarak configurasyonda tanımlanmış clustera dahil olur.
Document: Elasticsearchte datalar documentler halinde tutulur.Documentler RDBMS'te row alanına denk gelmektedir. Documentlerde içerisinde field denilen ve datayı tanımlayan alanları barındırır. Fieldlarda RDMBSteki kolonlara denk gelmektedir.
Index: Datalar elastic searchte document olarak depolanır. Her bir document bir index içerisinde depolanır. İndexlerde benzer yapıda olan document objelerinin oluşturduğu gruptur. İndexler bir veya daha fazla sharddan meydana gelen logical yapılardır. Birden çok node üzerine dağıtılırlar.
Shard:
Shardingin ne olduğuna girmeden önce, neden shardinge ihtiyacımız olduğu üzerine biraz konuşalım. Çok fazla dökümana sahip olan bir indexiniz olduğunu ve totalde 1 terabyte boyutu olduğunu düşünelim. Ancak elinizde iki adet makinanız yani nodeunuz var. Her biri de 512 GB bilgi store edebiliyor. Açıkça hiç bir nodeunuz dökümanı komple taşıyacak kadar kapsamlı değil. Bu durumda dataları bölmemiz gerekecektir. Ve burada sharding konsepti imdadımıza yetişir. Sharding indexleri adı shard olan daha küçük parçalara böler. Bir veri bütününün yatayda bölümlenmiş halidir. Yani her shard indexin bir subsetini taşır ve kendi içinde bağımsızdır. Yani shardı bağımsız index olarak düşünebiliriz.
Sharlar büyük ölçekli dataların dağıtık mimaride depolanmasını sağlayan yapılardır. İndex datası shard adı verilen daha küçük parçalara bölünerek depolanır. Bir indexsin shardları clusterda birden çok node üzerinde dağıtılır. Primary ve replica olmak üzere iki tip shard vardır. Bir indexte yer alan her document bir primary sharda ait olmak zorundadır. Replica shardlar ise primary shardların kopyasıdır. Replica shardlar sayesinde diğer veritabanlarında olduğu gibi datanın bir kesinti yada hata durumda kaybolmamasını sağlar. Bunun dışında replica shadrlar üzerinde readonly işlemler yapılarak okuma işlemi yapılır ve performans arttırılır. Replicalar esasen bir kaç ana amaca hizmet eder. İlki high avalibilityi sağlayabilmektir. Yani node ya da shard fail olduğunda bu shardın eksikliğini replikasyon ile tamamlayabiliriz. Diğer bir amaç ise search performansını artırmaktır. Çünkü searchler replika serverlarda da paralelde çalıştırılabilir. Yani aslında replikalarda cluster’in search gücünün bir parçasıdır. Bir diğeri de load balancingi sağlayabilmesidir.
Dökümanları Shardlara Dağıtmak – Routing mekanizması
Peki elastik search bu shard yapısını nasıl yönetir. Dökümanın hangi shardda olacağını, dökümanların shardlara eşit olarak dağıtılmasını vs random yapmayacağı aşikar. Döküman boyutları eşit olmalı. Bu sürece routing denir ve routing süreci defaultta otomatik işler. Çoğu kullanıcı da bunu manuel yönetmek istemez.
Bu değer daha sonra bir hash fonksiyonuna bölme için kullanılmak üzere sayı üretmesi için geçer. Bu sayının kalanı shard sayısını veririr. Bu elastic searchin specific dokumanlarının yerini nasıl belirlediğidir. Search query çalıştırıldığında, süreç farklıdır. Query tüm shardlara paylaştırılır.
Shard sayısını değiştirirsek, routing formülünü çalıştırmanın sonucu dökümanlar için değişir. Beş shard varken bir belgenin Shard A’da depolandığı bir örneği düşünün, çünkü o sırada routing formülünün sonucu buydu. Shard sayısını değiştirebildiğimizi ve onu yedi olarak değiştirdiğimizi varsayalım. Dökümanı id’ye göre aramaya çalışırsak, routing formülünün sonucu farklı olabilir. Şimdi, document aslında Shard A’da saklansa bile formül Shard B’ye yönlendirilebilir. Bu, document hiçbir zaman bulunamayacağı ve gerçekten bazı baş ağrılarına neden olacağı anlamına gelir. Bu nedenle, bir index oluşturulduktan sonra shard sayısı değiştirilemez, bu nedenle yeni bir index oluşturmanız ve dökümanları ona taşımanız gerekir
Type: Benzer documentleri tanımlar.
Mapping: Indexlenecek doumentte yer alan fieldların yapısını belirler. Mapping işlemi otomatik yapılabilceği gibi manuelde yapılabilir.
Çalışma Prensibi
Aşağıdaki görselde node-1, node-2 ve node-3 nodelarının birleşimiyle Elastic_Prod_Cluster1 clusteri oluşturulmuştur.Toplamda index A, index B ve index C olmak üzere üç adet indeximiz bulunmaktadır. Her bir indexte üç adet sharda bölünmüştür. Her shardında bir adet replicası bulunmaktadır. index A için incelersek P1, P3 ve P3 index A için oluşturulmuş shardlardır. R1, R2 ve R3 te bu shardların replicalarıdır.
Bir shardın primarysi ve replicası aynı node üzerinde olamaz. Yani P1 ve bunun shardı olan R1 aynı node üzerinde olmaz. Görsele bakarsak P1 node-1 üzerindeyken R1 node-3 üzerindedir.Diyelimki node-1 de bir arıza çıktı. Böyle bir durumda node-3 üzerinde bulunan R1 replica shardı artık primary olacak ve artık read dışında write işlemide yapılabilecek. Aksi durumda eğer P1 ve R1 node-1 üzerinde olsaydı ve herhangi bir nedenle node-1e erişim sağlanamasaydı shard ve replica aynı anda kaybolmuş olcaktı. index A p1,p2 ve p3 shardlarından oluştuğu için index A nın p1 shardında bulunan dataları kaybetmiş olacaktık.
1 shardımız var ve 5 ayrı replikasını oluşturduk. Bu 5 ayrı replika nasıl orjinal sharda paralel update olacak? Yani aslında sistem nasıl çalışıyor?
Elastic search primary backup adında bir modeli data replikasyonu için kullanır. Yani replika grubunun primary shardı index operasyonları için entry point görevi görür. Yani biraz daha türkçeleştirirsek insert update delete gibi tüm operasyonlar primary sharda gider. Primary shard operasyonların validationu ve herşeyin doğru olduğunundan emin olmakla sorumludur. Bu görev, object beklenen bir alana number yollamaya çalışmak gibi her requestin yapısal olarak doğruluğunu denetleme gibi işleri de içerir. Operasyon primary shard tarafından kabul edildiğinde yine primary shard tarafından çalıştırılır. Operasyon tamamlandığında, aynı operasyon her replikaya yollanır. Eğer birden fazla replika varsa bu replikalar üzerinde paralel çalıştırılır. Yani güncel verinin snapshotı yerine operasyon elden ele taşınır. Bu operasyon tüm replikalarda doğru bir şekilde çalıştığında ve replikalar primary sharda response döndüğünde, primary shard da clienta operasyonun tamamlandığına dair response döner.

Elasticsearchün Sorgulamadaki Hızı
Elasticsearch veriyi indexlerken inverted index denilen bir indexleme mekanizması kullanır. Bu sayede çok hızlı bir şekilde text search işlemleri gerçekleştirilir.
Yukarıdaki görseli incelersek inverted indexler document içerisinde yer alan terimlerin hangi documentle ilişkisi olduğunu tutan yapılardır. örneğin yukarıdaki gibi she likes winter ve Wheather is too cold in winter olmak üzere iki adet documentimiz olsun. Bu documentler çeşitli filtrelerden geçirilerek termlere ayrılacaktır. Daha sonra termler hangi dökümanda hangi sırada ise ona göre inverted indexe kaydedilecektir. Termler tabloya sıralı bir şekilde kaydedilmektedir. Büyük küçük harf duyarlı olduğu için yukarıdaki tabloda ona göre sıralanmıştır.
örneğin
She termü 1. documentin 1. sırasındadır. Doc_Id 1 ve inverted Index 1,1
winter termü hem 1. documentte hemde 2. documentte yer almaktadır. Doc_ID 1,2 ve inverted indexi
{1,3} Yani 1. documenti 3. kelimesi winterdır. {2,6) Yani 2.documentin 6. kelimesi winterdır.
Hiç yorum yok:
Yorum Gönder