Elasticsearch Nedir? | Nasıl Kurulur? | Elasticsearch Örneği

Elasticsearch Nedir?

Elasticsearch, full-text arama motorudur(search engine).
Java ile geliştirilmiştir ve Lucene alt yapılıdır. 

Eğer siz de benim gibi elasticsearch gibi teknolojileri daha önceden bilmiyorsanız, full-text search ve Lucene tabanlı olduğunu okuduğunuzda zihninizde pek bir şey canlanmayacaktır.

Bunu biraz anlayabilinecek dilde ifade etmeye çalışalım;

Büyük veri ile ilgili yazdığım önceki yazılarımı okuduysanız, her geçen gün büyüyen ve gelişen teknolojilerin ürünü olan yazılımların bizler tarafından kullanılması sonucu, büyük ölçekli verilerin oluştuğunu artık biliyorsunuz. Bu verilerin her birinin yapılandırılmış biçimde kayıtlanması çoğu zaman mümkün olmuyor ve genelde bu büyük ölçekli veriler yapısal olmayan(unstructured) biçimde kayıtlanıyor. Haliyle bu yapısal olmayan verilerin analizi, işlenmesi, bu veriler içinde arama yapılması geleneksek yöntemlerle zorlaşıyor hatta imkansızlaşıyor. İşte tam da bu noktada büyük veri teknolojileri devreye giriyor.

Elasticsearch’de hem Near Realtime (Gerçek zamana yakın) hem de Distributed(dağıtık) yapısıyla veriler içerisinden içerik aramaları, veri analizi ve sorgulamalar yapıyor. 

Peki Lucene tabanlı derken kastedilen nedir? 

En basitinden  açıklamak gerekirse, her şeyin başta bir ihtiyaçla başladığı ve tüm teknolojilerin ihtiyaç üzerine geliştirildiği bir dünyada bir metin arama aracına ihtiyaç duyuldu ve ilk olarak Lucene geliştirildi.
Lucene, full-text search için geliştirilirken temelinde bazı mantık ve metodolojilerle geliştirildi ve oldukça işlevsel biçimde büyük boyutlu metinler üzerinde arama yaparak çalışmaya başladı.
Lucene, tek makinede “devasa boyutta” metin dosyaları üzerinde arama yapıyorken harika iş çıkartıyordu.
Ancak gelişen dünyada veriler de hızlı ve anlık(real-time) olarak akmaya başladı. Ve bunları ölçeklemek için dağıtık(distributed) sistemler geliştirildi. Ancak Lucene bu sistemlere artık uyum sağlayamıyordu. Bunun için dağıtık sistemlere uyum sağlayabilecek teknolojiler üretilmeye başlandı. Elasticsearch’de bu ürünlerden bir tanesi.

Elasticsearch’te tıpkı atası olan Lucene gibi full-text search yapıyor. Ancak dağıtık olarak indexlemeye izin veriyor, dağıtık veriler üzerinden aramalar yapabiliyor.

Elasticsearch’ün özelliklerini inceleyelim;

  • Java tabanlıdır.
  • Apache Lucene alt yapılıdır. (Shared ve Replica kavramları ES’te de aynen geçerlidir.)
  • Açık kaynaktır.
  • Veri saklama biçimi ilişkisel değil document-oriented şeklindedir.
  • Dağıtık ve ölçeklenebilir yapıda çalışabilir.
  • Gerçek zamanlı verileri analiz etmeyi sağlar.
  • Type, Fields, Documents, Fields, Indicates, Full-text search, Index gibi kavramlara sahiptir(Aşağıda açıklamalarınu göreceksiniz.)
  • RestfullAPI üzerinden hizmet verdiğinden dolayı tüm programlama dilleriyle kullanılabilir.
  • Veri tipine uygun biçimde otomatik Mapping yapabilir.
  • Cluster yapıya sahiptir ve cluster yapısı oldukça basittir.
  • Elasticsearch’ü monitör edebilen Kibana ve log barındırmak için Logstash araçları ile bilirkte kullanılabilir.
  • Kendi içinde yüksek erişilebilirlik (high availability) sunar.
  • Dökümanları JSON olarak indexler.
  • Hızlı kurulum ve kolay konfigürayon vadeder.
  • Elasticsearch’e veri aktarmak oldukça kolaydır. (Veri aktarımı için River gibi yapıları mevcuttur.)
  • HBase, Cassandra, MongoDB gibi NOSQL veritabanlarından da ES’e aktarım yapmayı mümkün kılar.

Elasticsearch bileşenlerine ve temel prensiplerine değinelim,

Indice
Yukarıda görüldüğü üzerine klasik ilişkisel veritabanlarında Database’lerin yerine Elasticsearch’te Indice kavramları kullanılmakta.
Bir  Elasticsearch Cluster’ı birden fazla indices(veritabanları) bulundurabilir.

Type
İlişkisel veritabanlarındaki tablolar için ES “Type” kavramını kullanır. 
Bir indice, birden fazla type(tablo) barındırabilir.

Document
Elasticsearch’te, ilişkisel veritabanlarındaki Rows (satılar), Documents (Dökümanlar) olarak temsil edilirler. Her type, birden fazla document’a sahiptir.

Field
Klasik veritabanlarındaki Column’lar, Elasticsearch’te Field(Alan/kolon) olarak nitelendirilir. 
Her document bir den fazla fileld’a sahiptir.

Full-text search (Tam metin arama)

Herhangi bir kaynaktan alınan metin belgeleri içinden, herhangi bir anahtar kelimenin aratılarak, anahtar kelime ile eşleşen dökümanların bulduğu  sonuca hızlı şekilde erişime verilen isimdir.

Örneğin, wikipedia.com‘da bir bilim adamının ismini aratıp bununla ilgili yazılan yazıları okuyacağınızı varsayalım.
Wikipedia’nın arama çubuğuna Nicola Tesla yazdığınızda onunla ilgili yazıları bulmak için kayıtlı tüm yazılarda arama yapmak yerine, önceden indekslenmiş veriler içinden Nikola Tesla’nın adının geçtiği metinlerin olduğu index’e hemen gidip hızlıca size sonuç döndürmeyi sağlayan yapıdır.

Index

Elasticsearch’e eklenen her kayıt JSON belgesi olarak yapılandırılır. Yani, dökümanlarınızın içindeki her bir kelime(terim) için hangi döküman yada dökümanlarda o kelimenin olduğu bilgisini tutan bir endeksleme sistemi vardır. Bir nevi veritabanı gibi düşünebilirsin. Veritabanındaki verilerde olan düzen gibi, Elasticsearch’ün indexleri de JSON formatı şeklinde düzenlidir.

Mapping

Verileri indexlerken bu verilerin hangi tipte olduğunu göstermemiz gerekir. Yani bir kelimeyi indexlerken o kelimenin hangi veri tipinde(string, integer, boolean) olduğu bilgisinin tanımlandığı işlemdir.

Mapping Örneği

RestfullAPI

REST, istemci-sunucu iletişimi ile ilgili bir mimari. Restfull servisler, istemci-sunucu arasında bir çok farklı tipte yanıt(response) dönebilirler (JSON, XML, CSV, HTTP). RestfullAPI ise bu servisleri kullanan bir API.

Near Realtime (Yakın gerçerk zamanlı)

Elasticsearch gerçek zamana yakın bir hızla çalışır. Gerçek zamanlı yerine “yakın gerçek zamanlı” denmesindeki sebep, bir dökümanı, gerçek zamandan çok az farklı bir gecikme süresi ile indexlemesi. (Bu süre genelde bir saniyelik bir gecikme oluyor.)

Cluster

Tüm verilerinizi bir arada tutan ve tüm indexleme ve arama yeteneklerinin yürütüldüğü birden çok Node’dan oluşan bir küme veya node koleksiyonu şeklinde adlandırılabilir.

Bir küme, varsayılan olarak “elasticsearch” şeklinde benzersiz bir adla tanımlanır Bu isimlendirme isteğe bağlı olarak değiştirilebilir. İsimlendirmeler önemlidir çünkü bir node yalnızca bir cluster’ın parçası olabilir. Node, cluster adıyla kümeye katılmak için ayarlanmışsa bu isim tanımlamalarının doğruluğuna ihtiyaç olacaktır.

Node

Tek bir server’a verilen isimdir. Verilerin depolandığı makinelerin her biridir. Cluster’ların indexleme ve arama yetenekleri bu node’lar sayesinde gerçekleşir. Cluster’lardaki isimlendirme mantığındaki gibi node’lara da başlangıçta benzersiz bir id atanır (Universally Unique IDentifier (UUID)).

Bu isimlendirmeler, nodelar arasındaki bilgi alışverişinin yönetimi için oldukça önemlidir. Eğer istenirse bu isimler de değiştirilebilir.
Varsayılan olarak her node “elasticsearch” şeklinde isimlendirilen bir cluster’da çalışmak üzere ayarlanmıştır. Hangi node’un hangi cluster’a gitmesini isterseniz, o cluster ismine yönlendirmelisiniz.

Shard

Bir seferde milyonlarca dökümanı indexlemek için yeterli donanıma/server kapasitesine sahip olunmayabilir. Bir seferde 2TB lık veriyi indexlemek zorunda kaldığınızı varsayalım, bu durumda bu indexlemeyi tek bir node ile yapamak istediğinizde, disk kapasitesinin dolması veya aşırı yavaş bir indexleme hızı ile karşı karşıya kalabilirsiniz. Bunun önüne geçmek için Shard ve Replika kavramları bulunmakta.

Yapılacak olan bir index, bir node da yeniden shard’lara bölünür. Bu shardları arzunuza göre ayarlayabilmektesiniz.

Shard’lı mimarinin kullanılmasındaki temel iki amaç;

  • Birden fazla node üzerinde işlemleri dağıtmanızı ve paralelleştirmeyi sağlar. Böylece performans artar.
  • İçerik hacmini yatay olarak bölme ve ölçeklendirmeye olanak tanır.

Replica

Shard’ın devre dışı kalması ihtimaline karşı index shard’larının bir veya birden çok kopyasının oluşturulabilmesini sağlayan replica-shard yapısı bulunur.
Bir shard’a ait replica, aynı node’da barındırılmamalıdır. Bir node çöktüğünde o node’daki shard(lar)’ınyedeklerinin diğer nodelarda bulunması veri kaybını önlemek için şarttır.

 

Shard ve Replica’ların farklı nodelara bölünmesinin örnek şeması

Elasticsearch’de Replica ve Shard’ların baştan belirlenmesi zorunluluğu yok. Ancak isteğe bağlı ayarlayabilirsiniz.

Elasticsearch Kurulumuna bir bakalım;

Elasticsearch’ü kurmanız için önce Java kurulumunu gerçekleştirmelisiniz. Çünkü Elasticsearch Java programlama tabanlıdır. Bu yüzden Java 7 veya üstü herhangi bir versiyon kurabilirsiniz. Bilgisayarınızda Java’nın olup olmadığını incelemek için versiyon bilgisi komutunu yazabilirsiniz.  

$ java -version

Eğer Java kurulu ise, size kurulu olan versiyon bilgisini görüntülenecektir.

java version "1.7.0_71" 
Java(TM) SE Runtime Environment (build 1.7.0_71-b13) 
Java HotSpot(TM) Client VM (build 25.0-b02, mixed mode) 

Eğer Java yüklü değilse aşağıdaki adımları izleyerek kurmanız gerekiyor.

Adım 1

Öncelikle bu siteye girin, ve sizin işletim sisteminize uygun olan ve uzantısı tar.gz olan dosyayı indirin

http://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html

Adım 2

İndirdiğiniz bu dosyayı genelde indirilenler klasörünüzde bulacaksınız. tar.gz şeklindeki zipli bu dosyayı aşağıdaki komutlar ile ziptek çıkartalım.

$ cd Downloads/ 
$ ls 
jdk-7u71-linux-x64.gz 
$ tar zxf jdk-7u71-linux-x64.gz 
$ ls 
jdk1.7.0_71   jdk-7u71-linux-x64.gz 

Adım 3
Java’yı rahat kullanabilmek için “/usr/local”konumuna taşıyalım. Bunun için kök dizini açıp aşağıdaki komutları yazmalıyız.

$ su 
password: 
# mv jdk1.7.0_71 /usr/local/ 
# exit 

Adım 4
Şimdi de ~/.bashrc dosyasını açıp JAVA_HOME isimli değişkeni oluşturarak java’nın kurulu olduğu PATH‘i içerisine yazağız. Bu sayede Java’ya erişimimiz kolaylaşmış olacak.
~/.bashrc dosyasını açmak için vim ya da nano gibi metin düzenleyicileri kullanabilirsiniz kullanabilirsiniz. (Eğer bunlar yüklü değilse veya kullanmayı bilmiyorsanız not defteri’nde de düzenleyebilirsiniz)
Ben vim kullanarak açıyorum.

$ vim ~/.bashrc

Açılan doyaya şu komutları kopyalayıp yapıştırıyoruz:

export JAVA_HOME=/usr/local/jdk1.7.0_71 
export PATH=$PATH:$JAVA_HOME/bin 

Sonrasında ESC basıyoruz ve :wq yazıyoruz. Vim’den çıkmış olduk.

Şimdi tüm değişiklikleri geçerli çalışan sisteme uygulamak için aşağıdaki komutu yazın.

$ source ~/.bashrc

Şimdi java -version komutunu tekrar deneyin. Şuan yukarıda yazdığım gibi bir çıktı görüntülemiş olmanız gerekiyor.

Şimdi Elasticsearch kurulumuna geçebiliriz;

Bu aşamada, Mac OS X işletim sistemi için bir kurulum videosu çektim. Videoda kullandığım kaynak kodlarının olduğu dosyaya  bu linkten erişebilirsiniz.

Diğer işletim sistemlerine ait kurulum adımları için Elasticsearch resmi sitesinden bu linke tıklayarak faydalanabilirsiniz.

Küçük bir örnek ile pekiştirmeye ne dersiniz?

İlk index dökümanımızı oluşturalım ve o dökümanda geçen bir kelimeyi daha sonrasında aratalım.
Bu mini örnek için CURL kullanacağız. Curl, veri iletimini  ve  veri  alımını sağlayan, Client URL’in kısaltması olan bir kütüphanedir.

Gelelim örneğimize;

Termal Ekranına aşağıdaki komutlar yardımı ile ilk index dökümanmızı oluşturalım;

curl -XPOST -H 'Content-Type: application/json’ ‘localhost:9200/first-index/message‘ -d '

{ “text”: “Hello kizgibikodla.com”}'

Şimdi Elasticsearch’e ‘hello’ kelimesini aratacağımız bir istek gönderelim;

curl -XPOST "https://localhost:9200/_search" -d'

 {
 "query": {
 "query_string": {
 "query": "hello"
                 } 
          }
  }'

Sonuç olarak aşağıdakine benzer bir çıktı alacaksınız.

{
"took": 12,
"timed_out": false,
"_shards": {
"total": 12,
"successful": 12,
"failed": 0
},
 "hits": {
     "total": 1,
     "max_score": 0.19178301,
     "hits": [{ "_index": "first-index",
                "_type": "message",
                "_id": "AUqiBnvdK4Rpq0ZV4-Wp",
                "_score": 0.19178301,
                "_source": {
                "text": "Hello kizgibikodla!"}
             }]
          }
}

Yukarıdaki çıktıda içinde hellonun geçtiği dökümana ait bilgiyi size döndürüyor. Eğer birden fazla içinde hello geçen dökümanınız olsaydı, onları da getirecekti. Burada dikkatinizi çeken bir başka şey de biz “Hello” kelimesinin ilk harfini büyük yazdık ama aratırken “hello” diye arattık. Ancak yine de buldu. İsterseniz Elasticsearch’ü harf büyük/küçüklük hassasiyetini ayarlayabiliyorsunuz. (Varsayılan değer olarak büyük/küçük harf önemsemiyor.)

İlk Elasticsearch örneğinizi böylece tamamladınız.

Elasticsearch ile daha fazla request (istek) denemesi yapmak isterseniz şöyle bir websitesi mevcut, bu siteden  istek yapıp sonuçları görüntüleyebilirisiniz.

Bir sonraki yazımda Elasticsearch’te yaptığımız herşeyi monitör edebildiğimiz bir araç olan Kibana’dan bahsedeceğim.

Umarım yazım size faydalı olmuştur.
İyi çalışmalar dilerim.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir