“Ee anlatsana, sık sık Elasticsearch kullanır mısın ? “ Ortaya Karışık Yazılım Serisi — 3
Previously on Ortaya Karışık Yazılım Serisi (Redis or Die, Remember?) =>LINK
Önceki yazılarda Redis ve çeşitli kullanılabilecek alanlarından bahsetmiştik bir kaç basit örnek ile elini yüzünü toparlamıştık. Bu yazımda ise Redis ve Elasticsearch ile ilgili basit bir pipeline kurgusu olacak.

Pipeline nedir aslında basitçe yazılım mühendisliğinde, her bir elemanın çıktısı bir sonraki elemanın girdisi olacak şekilde sıralanmış işlemler zinciridir. Türkçe çevirisi boru hattı olmasına karşın ben daha “Boru hattını önümüzdeki sprintte koşarız” gibi cümleler kuranı görmedim.

Elasticsearch, metinsel, sayısal, jeo-uzamsal, yapılandırılmış ve yapılandırılmamış dahil olmak üzere her türlü veri için dağıtılmış, açık kaynak arama ve analiz motorudur. Elasticsearch Apache Lucene üzerine kurulmuştur ve ilk olarak 2010 yılında Elasticsearch N.V. tarafından piyasaya sürüldü (şimdi Elastic olarak da bilinir). Basit REST API’lere sahip, hızlı ve ölçeklenebilirliği ile bilinen Elasticsearch, veri alımı, zenginleştirme, depolama, analiz ve görselleştirme için açık kaynak araçlarından oluşan bir dizi Elastic Stack’in merkezi bileşenidir. Genellikle ELK Yığını (Elasticsearch, Logstash ve Kibana) olarak anılır. Peki ne için kullanılır?
- Application search
- Website search
- Enterprise search
- Logging and log analytics
- Infrastructure metrics ve container monitoring
- Application performance monitoring
- Geospatial data analysis ve visualization
- Security analytics
- Business analytics
Logstash ne için kullanılır?
Elastic Stack’in temel ürünlerinden biri olan Logstash, verileri toplamak ve işlemek ve Elasticsearch adresine göndermek için kullanılır. Logstash, birden fazla kaynaktan aynı anda veri almamızı sağlar.
Kibana ne için kullanılır?
Kibana, Elasticsearch için gerçek zamanlı histogramlar, çizgi grafikler, pasta grafikler ve haritalar sağlayan bir veri görselleştirme ve yönetim aracıdır. Açıkçası ben fazla kullanmadım kullanan şirketlerde de çalışmadım. O yüzden bu yazı dizisinde kibana’yı biraz pas geçmek zorundayız..

Bu kısımda ne yapacağımızı aslında yukarıda kısaca bahsettik önceki yazılarda kullandığımız Redis Pub/Sub’ı bir pipeline ile logstash’e entegre edip datalarımızı otomatik elasticsearch’e ekleyeceğiz. Ben yine ufak bir docker-compose dosyası oluşturdum.
Dikkat edilmesi gereken yerler ise
command: logstash -f /etc/logstash/conf.d/logstash.conf
volumes:
- ./logstash/logstash.conf:/etc/logstash/conf.d/logstash.conf:ro
Buradaki kısımı dikkatli okuduğunuz zaman aslında projede oluşturacağınız ağaçta logstash isimli bir klasör olması gerekiyor ve o klasör içerisinde logstash.conf isimli bir dosya oluşturmalıyız.

Şimdi logstash.conf dosyasına eriştiğimiz zaman ise input, output, filter ayarlarını yapmamız gerekiyor benim filter kısmı ile işim olmadığı için bodoslama yazdım.
input {
redis {
host => "redis"
password =>"123sifre"
data_type => "channel"
key => "deneme"
}
}
output {
elasticsearch {
hosts => ["elasticsearch:9200"]
index => "deneme"
}
}
Burada akıllara gelebilecek sorular:
- Q1) Host, password gibi alanları gömülü yapmak yerine değişken atayabiliyor muyuz?
- A1) Evet yapılabilir örnek olarak: password => “${vuhuu}”
- Q2) Redis hostu birden fazla nasıl ekleniyor?
- A2) host => [“blabla”, ”blabla-1"]
Ayrıntılar için configuration file structure
Docker ayağa kalktığı anda tek yapmamız gereken redis için Sub/Pub örneği yazmak.
NOT: Yukarıda Logstash.conf dosyasında fark edeceğiniz üzere
data_type => "channel"
key => "deneme"
yani burada bizim publisherımızın adı “deneme” olduğu müddetçe oradaki datalar elasticsearch kısmına gelecek yine elasticsearch kısmında index name’in deneme olma sebebinin keyfi bir durumdan başka bir şey olduğunu unutmayın. Eğer birden fazla kanal dinlenmesini istiyorsanız tekrar yazmanız gerekiyor çünkü key string bir yapıda list değil maalesef….
İncelenir: https://www.elastic.co/guide/en/logstash/current/plugins-inputs-redis.html
Gelebilecek diğer soru ise redis’de channel name’e göre elasticsearch kısmında index name değiştirsek olur mu? Onun cevabı da aşağıda
Okumayı sevmeyenler için kısa yanıt:
if [redis][key] == "xyz" {
elasticsearch {index => "xyz-%{time}"}
}# "%" işaretinde sorun yaşayanlar "$" kullanabilir
Finale doğru adım adım..
RedisPub kodu çalıştığı anda Insomia’dan kontrol ettiğiniz zaman;

message olarak du du du geldi. Tabi ki burada bırakmayacağız akıllara gelebilecek diğer soru “Peki buraya biz dict nasıl göndeririz ?” cevabı veriyorum normalde gönderemezsin neden gönderemezsin sebebi şu çünkü publish string veri istiyor sen oraya dict gönderdiğin anda mızmızlanmalar başlar. Ama çözüm yok mu tabi ki çözüm var! json.dumps!

Ufak bir Redis — Elasticsearch pipeline örneğinin de sonuna gelmiş bulunuyoruz. Yine klasik kapanışımız ile kapatalım. Ortaya Karışık Yazılım Serisi’ne kendinizi yakın hissediyorsanız paylaşarak destek olabilirsiniz yaptığım hata ve öneriler için Twitter üzerinden ulaşabilirsiniz.
