ElasticSearch HQ Eklentisi Kurulumu

Elasticsearch plugin’lerinin kurulacağı yer:

HQ eklentisini kurmak için:

Eklentiye ulaşmak ve çalıştırmak için:

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:

Nano Konfigürasyonu ve Syntax Highlight

Öncelikle home dizininize syntax highlighter paketlerini indirin:

Home dizininize yoksa .nanorc dosyası oluşturun:

Tüm dilleri nanoya tanıtmak için:

Nano örnek konfigürasyon dosyasını şurada bulabilirsiniz:

Benim kullandığım config ise şu şekilde:

https://gist.github.com/msdundar/b753f94c80fcce1706aa

Passenger ve Nginx Konfigürasyonu

Önceki Yazılar:

Özenle hazırladığım, sorunsuz çalışan nginx konfigürasyonumu belki birileri göz atar diyerek paylaşıyorum. Yurtdışında pek çok sistem yöneticisi bu şekilde konfigürasyon dosyalarını birbirleri ile paylaşarak peer-review yapmaktalar. Bende bu review’ların pek çoğunu ve official nginx dökümanını okuyarak aşağıdaki konfigürasyonu hazırladım.

Konfigürasyon Debian 7.7 kurulu olan bir Rails sunucusu içindir. Web sunucu olarak Nginx + Passenger kullandım. Veritabanı sunucusu ise MySQL 14.14. Uygulama olarak Ruby 2.1.5 sürümü ve Rails 4.1.2 kurulu. Makinada 8 GB RAM bulunuyor ve 8 çekirdekli. Makina üzerinde sadece 1 tane Rails uygulaması koşuyor ve onunda VM boyutu 344mb. passenger-memory-stats çıktısı aşağıdaki şekilde:

passenger-memory-stats

/etc/nginx/nginx.conf dosyası:

Daha sonra:

/etc/nginx/sites-enabled/ klasörü içerisinde ais.conf isimli bir dosya oluşturun – içeriği şöyle olacak:

Nginx konfigürasyonunda hata varmı kontrol için:

Nginx'e Rails Uygulamasının Deploy Edilmesi

Phusion Passenger üzerinde bir Rails (veya herhangi bir Rack uygulaması) deploy edebilmek için uygulamanın bulunduğu dizinde üç dosyanın bulunması zorunludur:

  • config.ru dosyası
  • public/ klasörü
  • tmp/ klasörü

Yani /herhangi/bir/klasor/‘de bulunan Rack uygulamanızın minimum görünümü şu olmalıdır:

Uygulamanız çalışabilmesi için nginx konfigürasyon dosyanızı (/etc/nginx/nginx.conf) yapılandırmanız gereklidir:

Daha sonra nginx ve passenger’ı restart etmelisiniz:

En temel düzeyde bir Rails uygulaması bu şekilde deploy edilebilir. Uygulamanın kurulu için, bulunduğu dizine düşerek, aşağıdaki adımları takip edin.

Bundle et:

Uygulama config dosyasını düzenle:

Dosya izinlerini güncelle:

Uygulamayı kur:

Son olarak:

Hepsi bu kadar.

Nginx ve Passenger Kurulumu – Ubuntu ve Debian

Nginx ve Passenger Kurulumu

Nginx ve passenger kurulumu ile ilgili internette pek çok İngilizce döküman bulunuyor ancak bunların pek çoğu resmi Passenger dökümanında anlatılan yolların dışında yöntemler kullanmışlar. Bunları uygulayıp, ne gibi zorluklara yol açtığını gördüğüm için, Passenger ve Nginx’in tüm dökümanlarını baştan okuyup bu yazıyı hazırladım. Öncelikle sisteminizde Ruby ve Rails kurulu değilse rbenv aracını kullanarak kurulumu yapmanız gerekiyor.

Passenger tarafından Ubuntu ve Debian için official APT reposu sağlanmakta. Bu repoyu kullandığınızda hem kurulumu kolayca yapabilirsiniz hemde güncelleştirmeleri kolayca takip edebilirsiniz. Aşağıda anlatacağım adımları takip ettiğiniz taktirde passenger-install-apache2-module veya passenger-install-nginx-module araçlarını kullanmanıza gerek kalmayacaktır.

İlk olarak PGP anahtarını sisteminize ekleyin:

Passenger reposu HTTPS’ten bağlantı kurduğu için sisteminize HTTPS desteğini kurun:

/etc/apt/sources.list.d/ klasörü altında passenger.list isminde bir dosya oluşturun ve kurulumu yapmak istediğiniz işletim sistemine uygun olarak aşağıdaki satırlardan sadece bir tanesini! ekleyin:

passenger.list dosyasının izinlerini düzenleyin ve paket listenizi güncelleyin:

Nginx paketlerini kurun:

Daha sonra, /etc/nginx/nginx.conf dosyasını düzenleyerek, passenger_root ve passenger_ruby değişkenlerini uncomment edin.

Önerdiğim şekilde Ruby kurulumunu rbenv aracı ile yaptıysanız, bu iki değişken şu şekilde olacaktır:

Nginx’i restart edin:

Şuan herşey yolundaysa nginx çalışıyor olmalıdır.

Passenger’ın çalışması için yapmamız gereken bir kaç şey kaldı:

Hepsi bu kadar. Şuan nginx ve passenger sorunsuz çalışıyor olmalı.

Nginx konfigürasyonu şurada bulunur:

Nginx hata logları şurada bulunur:

Deploy işlemleri ve Nginx konfigürasyonunu bir sonraki yazıda anlatacağım.

Rbenv ile Ruby ve Rails Kurulumu – Debian 7

Rbenv Kurulumu

Rbenv, RVM gibi ancak RVM’ye göre çok daha basit bir şekilde, birden çok Ruby versiyonunu birlikte kullanmak için geliştirilmiş bir araçtır. Sisteminizde tek bir Ruby sürümüne ihtiyaç duyuyorsanız dahi, rbenv ile kurulum yapmanızı öneririm.

Öncelikle rbenv’i /home/foo altına klonlayın:

Daha sonra PATH’e, rbenv değişkenlerini ekleyin:

Ruby sürümleri ve diğer şeyler için otomatik tamamlamayı etkinleştiren aşağıdaki komutu çalıştırın:

Terminalinizi yeniden başlatın. Daha sonra;

komutunu çalıştırdığınızda:

çıktısını görüyorsanız kurulum başarıyla tamamlanmış demektir.

Rbenv’in ruby-build eklentisini kurarak, Ruby kurulumu için ortamı hazır edelim:

Rbenv’in çalışma mantığı gereği, herhangi bir GEM kurduktan sonra her seferinde “rbenv rehash” komutunu çalıştırmamız gerekiyor. Ancak bu can sıkıcı bir iş olduğu için, bunun içinde bir eklenti yazmışlar. Bunu da sistemimize çekelim:

Rbenv kurulum işlemleri bu kadar. Şimdi Ruby’yi kuralım.

Ruby Kurulumu

Ruby için gerekli temel paketleri kurun:

Rbenv’de listelenen Ruby sürümlerine bakın:

Bunlardan kurmak istediğiniz sürümü kendiniz seçebilirsiniz. Ben bu yazının yazıldığı tarihteki en kararlı sürüm olan Ruby 2.1.5’i kullanacağım:

Herşey yolundaysa sisteminize Ruby kurulmuş olmalıdır. Rbenv ile, kurulan bu Ruby sürümünü ister sistem çapında, istersenizde uygulama çapında kullanabilirsiniz.

Sistem çapında bu sürümü kullanmak için:

Uygulama çapında kullanmak için, uygulamanızın olduğu dizine düştükten sonra, o dizin içerisinde:

komutlarını kullanabilirsiniz.

Kurulumu kontrol edin:

Rails Kurulumu

Rails kurulumunda özel bir durum bulunmamaktadır. GEM olarak kurmanız yeterlidir:

Kurulumunuz başarıyla tamamlandıysa “rails -v” komutu ile kurulmuş olan Rails sürümünü görebiliyor olmanız gerekir.

Debian için OpenJDK Kurulumu

Kaynak listenize openjdk’yı ekleyin:

Daha sonra:

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

Debian ve Ubuntu – ElasticSearch Kurulumu

ElasticSearch kurulumu yapabilmek için öncelikle sisteminizde OpenJDK kurulu olmalıdır. Kurulum için: http://www.serhatdundar.com/debian-icin-openjdk-kurulumu

OpenJDK’yı kurduktan sonra ElasticSearch kurulumuna geçebilirsiniz.

Öncelikle GPG anahtarını ekleyin:

Aşağıda ki satırı /etc/apt/sources.list dosyanıza ekleyin:

Kurulumu gerçekleştirin:

Sistem başladığında elasticsearch hizmetinin de otomatik olarak başlamasını istiyorsanız:

veya manuel olarak elasticsearch’ü başlatmak için;

Şuan herşey yolundaysa ElasticSearch çalışıyor olmalıdır. Rails uygulamalarınızda ElasticSearch ile arama yapabilmek için modelinizde ElasticSearch’ü include etmeniz gerekir. Örneğin “User” modelimize bunu include edelim:

Ardından, arama yapacağınız controller action’unda (çoğunlukla index) ElasticSearch’ü çağırmanız gerekmektedir:

Rails console’dan elasticsearch’ün çalışıp çalışmadığına aşağıdaki şekilde bakabilirsiniz;

Herşey yolundaysa status olarak green dönecektir. Elasticsearch çalışıyor ancak performans sorunları varsa yellow dönecektir.

Bonus: View Tarafı:

Ngrok ile Localhost Tünelleme

Ngrok, yerel makinanızı tünelleyerek ve size bir subdomain vererek – yerelinizi internet üzerinde yayınlamanıza yardımcı olan bir araçtır. Bu sayede yerel makinanızda çalışan bir uygulamayı uzakta bulunan müşterinize veya ekip arkadaşınıza çalışır halde göstermek için bir yerlere deploy etmenize gerek kalmaz.

Ngrok sayesinde yazmış olduğunuz kodu kolayca demo edebilir, HTTP trafiğini takip ve replay edebilir, request’leri, form verilerini, JSON/XML datasını uygulama web arayüzü üzerinden görüntüleyebilirsiniz.

Kurulum

https://ngrok.com/ adresinden işletim sisteminize uygun dosyayı indirin. Zip arşivini uygun bir konuma (Masaüstü vb.) çıkartın.

Yardım Kılavuzu

Zip içerisinden çıkan dosyanın bulunduğu dizine terminalden düşün. Ardından;

komutu ile uygulamanın yardım sayfalarına ulaşabilirsiniz.

Doğrulama

Ngrok’un tüm özelliklerinden faydalanabilmek için websayfası üzerinden ücretsiz olarak kayıt olabilirsiniz. Daha sonra ise dashboard sayfasından edindiğiniz anahtar ile doğrulama yapın;

Kullanım

Yerel makinanızın 80.portunu internete açmak ve erişim için bir domain almak istiyorsanız kısaca aşağıdaki komutu kullanabilirsiniz;

Komutu çalıştırdığınızda internet üzerinde çalışan bir domain adresiniz anında hazır olacaktır.

ngrok-80

Forwarding” alanında yazan adresi istediğiniz kişilere göndererek, yerel makinanız üzerinde bağladığınız porta client gibi bağlanmalarını sağlayabilirsiniz.

Port Ayarları

Ngrok’a başka bir port numarası vererek (örneğin Rails geliştiricileri 3000 portunu) aynı yöntemle yerelinizi paylaşabilirsiniz.

ngrok-3000

Subdomain Ayarları

Ngrok’un size vermiş olduğu rastgele subdomain işinizi görmüyor ve kendi alan adınızı belirlemek istiyorsanız “subdomain” parametresini kullanabilirsiniz;

Bu durumda ngrok adresiniz http://ais.ngrok.com ve https://ais.ngrok.com olacaktır.

HTTP Authentication Ayarları

Ngrok’un bir diğer şahane özelliği ise HTTP authentication desteklemesi. Bu özelliği kullanabilmek için “httpauth” parametresi girmeniz yeterli:

HTTP Trafik Analizi

Gelen HTTP trafiğini analiz edebilmek için ngrok adresinize 1 kez request (URL’yi tarayıcınızda açarak sayfayı görüntüleyin!) yapın.

Daha sonra ise http://localhost:4040/http/in adresinden gelen trafiği analiz edebilir, replay edebilir ve uygulamanızın nasıl davrandığını izleyerek hatalı durumları yakalayabilirsiniz.

ngrok-requests