Elasticsearch Logstash Kibana (ELK Stack) Nedir?
Elastik stack, açık kaynak kodlu yapısı ile arama, log toplama ve analiz bileşenlerinin tümüne verilen genel bir isimdir. ELK, DevOps yaşam döngüsü kapsamında Monitoring kısmına hizmet etmektedir. ELK sisteminde istenen tüm verilerin toplanarak anlamlı hale getirilmesi ve daha sonrasında bunların merkezi bir birim etrafında toplanarak analiz süreçlerine sokulması, görselleri ile de bize sunulması izleme süreçleri kapsamında oldukça önemlidir.
Elastic Stack, genel anlamda şu bileşenlerden oluşur;
- Elastiksearch
- Logstah
- Kibana
- Beats Ailesi
- Winlogbeat
- Filebeat
- Packetbeat
Sırasıyla bu bileşenlere bakacak olursak;
Elastiksearch
Elasticsearch temelde bir arama ve veri indeksleme motoru olarak karşımıza çıkmaktadır. Arka planda Apache Lucene projesini kullanan Elasticsearch’ı bir veri tabanı modülü olarak da düşünebiliriz. Buna göre Elasticsearch, verileri Logtash veya doğrudan olarak Beats agent’lar üzerinden alacak biçimde konumlandırılarak onları aranabilir bir biçimde indeksleme görevi görmektedir. Neticesinde JSON ve REST teknolojilerini de kullanarak HTTP protokolü üzerinden veri kapsamında ekleme, silme ve arama gibi işlemleri de yapmamızı sağlamaktadır. Elasticsearch’ın en büyük avantajlarından birisi ise esnek yapıda olmasıdır. Bundan dolayı da sağlanan kolay ölçeklenebilme avantajını da bizlere sunmaktadır.
Elasticsearch, bir kelime üzerinde işlemlerini yaparken genelde hangi dokümanda(row) geçtiğini veri kaydetme aşamasında indexler. Daha sonra ise kelime aranması yapıldığında tüm veriler üzerinde arama işlemi yapmak yerine, daha öncesinde oluşturulmuş olan index listesi üzerinden hızlı biçimde sonuçlar bulunmaktadır.
Örneğin şekilde de görüldüpü üzere “keeper” kelimesi aranmak istendiğinde liste üzerinden 1,4 ve 5 sonuçları en hızlı biçimde elde edilmektedir. Nitekim Elasticsearch, ene büyük özelliklerinden biri olarak hızı ile ön plandadır. İndex listesi üzerinden en hızlı arama işlemleri ile birlikte sonuçları karşımıza çıkarmaktadır.
Elasticsearch Altyapısı Nasıldır?
Elasticsearch, Java dilinde geliştirilmiş olan, dağıtık mimariye sahip ve açık kaynak kodlu bir prejedir. Arama motoru olarak kullanılan ve alt yapısında arama alt yapısına sahip olan ve çoğu kişinin de duyduğu Apache Lucene projesini ise temel almaktadır. Buna göre Lucene projesi genel anlamda unstructured denilen düz metinler üzerinde indexleme ve arama işlemlerinin yapılmasını sağlamaktadır. Elasticsearch projesi de Lucene alt yapısının üzerinde structured veri yapısının belli dokümanların aranmasını ve indexlenmesini sağlamaktadır. Temel anlamda Elasticsearch üzerinde tutulmakta olan her doküan aynı zamanda bir JSON nesnesidir. O dokümanı da diğer dokümanlardan ayıran tekil(uique) bir id değeri olmasıdır.
Elasticsearch Framewokünden Beklenenler
Elasticsearch frameworkü kullanıcılara birçok imkan sunmaktadır. Buna göre hız, ölçeknebilirlik ve kolay kullanım imkanı sunan Elasticsearch ile birlikte siz de işlemlerinizi en güzel biçimde yapabilirsiniz. Sırasıyla bunları inceleyecek olursak;
HIZ
Elasticsearch framewokünün en önemli özelliklerinden biri olan hız kavramının çeşitli kolaylıklar saüladığını söyleyebiliriz. Temel anlamda herhangi bir relational database sisteminin tutacağı tüm verileri tutabilme yeteneği gibi bu verileri herhangi bir veritabanı sisteminden de çok daha hızlı biçimde sorgulamanıza imkan tanımaktadır. Bu hızın sağlanması için de sistem coğrafi değerleri, sayısal değerleri, metinleri ve tarihleri tutabilecek özel indeks yapıları da kullanmaktadır.
Kullanıcıların bu gibi teknik detayları derinlemesine bilmesine çok da gerek yoktur. En temel anlamda milyonlarca satırdan oluşan veriler elasticsearche JSON formatında saklanırsa ve doğru konfigürasyon ve kullanımı da oldukça kolay olan API’si ile çok kısa süreler içinde verilere ulaşmanız da mümkün hale gelebilir.
ÖLÇEKLENEBİLİRLİK
Elasticsearch sistemleri bir laptop üzerinde ya da petabytelarca verinin tutulabileceği devasa sunucular üzerinde çalıştırabilirsiniz. Bunu yapmak iiçin de komleks, geniş kurulumlara gerek yoktur. Cluster kurulumlar genelde elasticsearch alt yyapısı tarafındna otomatik biçimde yapılandırılır.
Ayrıca laptopta kurulu olan herhangi bir elasticsearch ile iletişime geçmek ile binlerce sunucu arasından meydana gelen bir elasticsearch clusteri ile haberleşmek, iletişime geçmek oldukça kolaydır. Elasticsearch sizler için indeksleri ve veriyi nasıl tutması gerektiğini de otomatik olarak karar vermektedir.
KOLAY KULLANIM
Elasticsearch tarafından sağlanan REST API’ler sayesinde rakiplere göre oldukça kolay kullanım elde edilmektedir. Buna göre her dil için yazılan özel kütüphaneler ile de Java, C#, Python, Javascript, PHP, Ruby gibi birçok programlama dili de kullanıcılar tarafından kullanılabilir.
Elasticsearch Genel Özellikleri
Elasticsearch genel özellikleri şu şekildedir;
- Apache Lucene alt yapılıdır. (Shared ve Replica kavramları ES’te de aynen geçerlidir.)
- Java tabanlıdır.
- Dağıtık ve ölçeklenebilir yapıda çalışabilir.
- Hızlı kurulum ve kolay konfigürayon vadeder.
- Veri tipine uygun biçimde otomatik Mapping yapabilir.
- Type, Fields, Documents, Fields, Indicates, Full-text search, Index gibi kavramlara sahiptir.
- Elasticsearch’e veri aktarmak oldukça kolaydır. (Veri aktarımı için River gibi yapıları mevcuttur.)
- Elasticsearch’ü monitör edebilen Kibana ve log barındırmak için Logstash araçları ile birlikte kullanılabilir.
- Gerçek zamanlı verileri analiz etmeyi sağlar.
- HBase, Cassandra, MongoDB gibi NOSQL veritabanlarından da ES’e aktarım yapmayı mümkün kılar.
- Kendi içinde yüksek erişilebilirlik (high availability) sunar.
- Cluster yapıya sahiptir ve cluster yapısı oldukça basittir.
- Açık kaynaktır.
- Dökümanları JSON olarak indexler.
- Veri saklama biçimi ilişkisel değil document-oriented şeklindedir.
- RestfullAPI üzerinden hizmet verdiğinden dolayı tüm programlama dilleriyle kullanılabilir.
Bu özellikleri sayesinde hemen her platformda entegre biçimde kullanılabilir ve neticesinde sizlere en doğru sonuçları en hızlı süre içerisinde vermektedir.
Elasticsearch Temel Bileşenleri
Elasticsearch temel bileşenleri genel olarak;
- Indice
- Type
- Document
- Field
- Full Text Search
- Index
- Mapping
- Restfull API
- Near Realtime
- Cluster
- Node
- Shard
- Replica
olmak üzere 13 başlıktan oluşmaktadır. Bunları sırayla inceleyecek olursak;
Indice
Klasik ilişkisel veri tabanlarında (Mssql, Mysql gibi…) veritabanlarının yerine Elasticsearch’te Indıce kavramları kullanılmaktadır. Bir Elasticsearch Cluster içerisinde birden fazla Indice bulunabilir.
Type
Klasik ilişkisel veri tabanlarında yer alan tablolarda ES “Type” kavramı kullanılmaktadır. Bir indice, birden fazla type (tablo) barındırabilir.
Document
Elasticsearch sistemler ilişkisel veri tabanlarında yer alan satırlar, dokümanlar olarak temsil eden yapılardır. Her bir type, birden fazla document içerebilir.
Field
Klasik olarak kullanılmakta olan veritabanlarındaki sütunlar (column) Elasticsearch sistemlerde Field olarak (Kolon) temsil edilmektedir. Her document birden fazla field alanına sahip olabilir.
Full-Text Search
Herhangi bir kaynak tarafından elde edilen metin belgeleri kapsamında, herhangi bir anahtar kelimenin aratılması sonucunda, anahtar kelime ile eşleşen dokümanların buldukları socuca hızlı biçimde erişime verilen isimdir.
Örnek olarak wikipedia.com‘da bir bilim adamının adı aratıldığında bununla alakalı yazılan yazıların okunacağı var sayılsın. Örneğin site üzerinde arama yerine Nicola Tesla yazıldığında aramayla ilgili yazıları bulmak amacıyla kayıtlı tüm yazılarda arama yamak yerine, daha önceden indekslenen veriler içerisinden Nicola Tesla’nın adının geçtiği metinlerin yer aldığı index’e hemen gidip hızlıca sonuç döndürmek amaçlanmaktadır. Full-text searcch yapısı ile bu işlemden faydalanabilirsiniz.
Index
Elasticsearch sistemine eklenmekte olan her kayıt JSON belgesi olarak yapılandırılmaktadır. Buna göre dokümanlar içerisindeki her bir kelime için hangi doküman ya da dokümanlar üzerinde o kelimeye ait bilginin tutulduğu bir endeksleme sistemi yer almaktadır. Bu yapı bir nevi veritabanı olarak da düşünülebilir. Veritabanı içerisinde verilerde olan düzen gibi, Elasticsearch’ün içerisindeki indeks yapıları da JSON formatı biçiminde düzenli yapılardır.
Mapping
Veriler indekslenirken bu verilerin hangi tiplere sahip olduğunu göstermek gerekmektedir. Bir nevi bir kelimeyi indekslerken o kelimenin hangi veri tipinde (interger, boolean, string …) olduğu bilgisinin tanımlandığı bir işlemdir.
RestfullAPI
REST, istemi-sunucu iletişimi ile ilgilenmekte olan bir mimari yapıdır. Restfull servisler, istemci ile sunucu arasında birçok farklı tipte cevap döndürür. Örneğin JSON, XML, CSV, HTTP gibi. RestfullAPI yapısı ise bu servisleri kullanmakta olan bir API sistemidir.
Near Realtime
Elasticsearch sistemi gerçek zamana paralel olarak çalışmakta olan bir sistemdir. Ve gerçek zamana göre hızda çalışmaktadır. Gerçek zamanlı yerine yakın gerçek zamanlı olarak adlandırılmasının sebebi ise, bir dokümanı gerçek zamandan çok az farklı bir gecikme süresi ile indeksleme özelliğine sahip olmasıdır. Bu işlemlerde genelde bir saniyelik gecikmeler meydana gelmektedir.
Cluster
Tüm verilerin bir arada tutulduğu ve tüm indeksleme ve arama yeteneklerinin de yürütüldüğü birden fazla Node’dan oluşmakta olan küme ya da node koleksiyonu biçiminde adlandırılan yapıdır.
Herhangi bir küme varsayılan, otomatik olarak “elasticsearch” biçiminde benzersiz bir adla tanımlanmaktadır. Bu isimlendirme kullanıcılar tarafından isteğe bağlı olarak da değiştirilebilir. Ancak kullanıcıların isimlendirme noktasında önemli olduklarının da bilinmesi gerekmektedir. Çünkü birr node sadece bir cluester’in parçası olabilir. Node, cluster adı ile kümeye katılmak amacıyla ayarlanmış ise bu isim tanımlamalarının doğruluğu da aranmaz.
Node
Tek bir sunucuya verilen isimdir. Verilerin depolandığı makinelerin her birine Node denilir. Cluster’ların indeksleme ve arama yetenekleri de bu node’ler aracılığı ile gerçekleşmektedir. Cluster’lardaki isimlendirme mantığında olduğu gibi node’lara da ilk etapta benzersiz bir id tanımlanmaktadır.
Node’lar arasındaki bilgi alışverişinin yönetimi için bu isimlendirmeler oldukça büyük önem taşımaktadır. Eğer istenirse bu isimler de değiştirilebilir. Her node varsayılan olarak “elasticsearch” biçiminde isimlendirilen bir cluster üzerinde çalıştırmak üzere ayarlanmaktadır. Hangi node’nin hangi cluster’e gitmesi istenirse, o cluster ismine yönelinmesi gerekmektedir.
Shard
Bir sistem üzerinde tek bir seferde milyonlarca dokümanın indekslenmesi için yeterli donanıma ya da sunucu kapasitesine sahip olamayabilirsiniz. Tek bir seferde 3 TB boyutundaki verinin indekslenmek zorunda olduğunuzu varsaydığımızda bu durumda bu indeksleme işlemi tek bir node ile yapmak istendiğinde, disk kapasitesinin yetersiz kalma ihtimali çok yüksektir. Bu gibi durumlarla karşılaşmamak için de Shard ya da Replika kavramları kullanılmaktadır.
Kullanıcılar tarafından yapılacak olan bir indeks, bir node da yeniden shard yapılarına bölünür. Bu shard yapıları isteğinize göre ayarlanmaktadır.
Shard mimari yapılarının kullanılmasında temel iki amaç vardır. Bunlar;
- Birden fazla node üzerinde işlemlerin dağıtılması ve paralelleşmenin sağlanmasıdır. Böylece performans ve verim de artar.
- İçerik hacmini yatay olarak bölme ve ölçeklendirmeye olanak tanımaktadır.
Replica
Son derece büyük yapılar için kullanılmakta olan Shard sisteminin devre dışı kalma ihtimaline karşı indeks shardlarının bir veya daha çok kopyasının oluşturulabilmesini sağlayan replica shard yapısı bulunmaktadır. Bir shard sistemine ait olan replica, aynı node üzerinde barındırılmamalıdır. Çünkü bir node çöktüğü zaman o node üzerindeki shardların yedeklerinin diğer nodeler üzerinde bulunması veri kaybını önlemek için bir şart oluşturur.
Kibana
Bahsettiğimiz üzere Elasticsearch sistemi Lucene tabanlı bir arama ve log indeksleme sistemiydi JSON ve REST teknolojileri kullanılarak Python, curl gibi birçok farklı imkanlarla bu veri tabanı üzerinden veri okuma, arama ve yazdırma işlemleri yapılmaktadır. Bu işlemleri bir web arayüzü ile görsel olarak yapmak istediğimizde de arkada bu işlemleri bizim yerimize yapmakta olan Kibana karşımıza çıkmaktadır.
ElasticSearch sistemin sunmakta olduğu Marvel arayüyüzü ile tüm node’lerin durumları görülebilir. Doküman sayılarını takip etmek ve neredeyse tüm request’lerin rate bilgisine de ulaşmak mümkündür. Buna bağlı olarak ElasticSearch sistemini monitör edebilmemiz de mümkündür.
Bu sayede herhangi bir tool’a ihtiyaç duymadan Sense üzerinden bu tarz sorgulama işlemlerini gerçekleştirebiliriz. Sorgulama işlemlerinin gerçekleştirilebilmesinin yanı sıra Index, Mapping ve Document ekleme/silme gibi işlemleri de yapabiliriz.
Sense yapısını kullanmak için de öncelikle Kibana’yı makineye kurma gerekir. Kibana, data visualization platformudur. Kurulumu ise oldukça basittir.
Logstash
Kullanıcıların kullanmakta oldukları sistemlerin çoğunda çeşitli birçok sebepten dolayı log toplama ve onları anlamlandırma ihtiyacı doğmaktadır. Bu ihtiyaç ise web sitelerinde ya da çeşitli uygulamalarda kullanıcı davranışlarının gözlemlenmesi ya da kullanıcıların karşılaştıkları hataları da belirlemek ve onları anlamlandırmak olabilir.
Logtash yapısı ise taşınmaya ve anlamlandırmaya ihtiyacı olan çeşitli logları gösterilen yerlerden alan, işlemekte olan ve tekrar kullanıcıların belirttiği çeşitli konumlara ileten, ELK Stack yapısının log köprüsü görevini yapabilen bir yapıdır. Logtash kullanılması neticesinde beats, rabbitmg ve Twitter gibi birçok farklı konumdan loglar toplanabilir, filter plug-in ve regexler de kullanılarak loglar parseleme işlemlerine tabi tutulabilir.
Özet olarak Logstash’i bütünüyle kendi isteklerinize göre yapılandırabilir ve birden çok yerde de biriki durmakta olan logları anlamlı bilgiler haline getirebilirsiniz.
Beats Ailesis
ELK sistemlerinde yer alan bir diğer yapı ise Beats ailesidir. Buna göre Beats ürün ailesi, üyeleri üzerinde sistemlerden Logstash’a log göndermekte olan ajanlar olarak düşünülebilir.
Beats için en temel örnekler olarak karşımıza şunlar çıkmaktadır:
- Winlogbeat,
- Filebeat,
- Packetbeat
Winlogbeat
Windows eventlog okuyup bunu indensklenmek üzere gönderen Beats ailesi üründür.
Filebeat
Bir dosyayı izleyerek bu dosya içeriğindeki değişiklikleri gönderen Beats ailesi ürünüdür. Örneğin /var/log/httpd.log dosyanızı bu ajana gösterek bu dosyayı loglayabilirsiniz.
Packetbeat
Kurduğunuz sisteme dair network verisi getiren bileşendir. Bu sayede örneğin kritik bir sunucunuzdaki network anormalliklerini izleyebilirsiniz.