Elasticsearch Index Yönetimi: Alias ve Template Kullanımı
Elasticsearch ile ciddi anlamda çalışmaya başladığınızda, index yönetiminin ne kadar kritik olduğunu çok geçmeden anlıyorsunuz. Bir süre sonra onlarca, belki yüzlerce index birikiyor ve her şey birbirine karışıyor. İşte tam bu noktada alias ve template kavramları hayat kurtarıcı oluyor. Bu yazıda, üretim ortamında edindiğim tecrübelerle bu iki konuyu derinlemesine ele alacağım.
Neden Alias ve Template Kullanmalısınız?
Diyelim ki bir log yönetim sistemi kuruyorsunuz. Her gün yeni bir index oluşturuyor, eski indexleri arşivliyor ve uygulamalarınızın kesintisiz çalışmasını sağlamak istiyorsunuz. Bunu manuel yapmaya kalkarsanız, birkaç hafta içinde hem kafanız karışır hem de ciddi hatalar yaparsınız.
Alias kullanmadan uygulamanızı bir index ismine hardcode bağladığınızı düşünün. Index ismini değiştirmeniz gerektiğinde tüm uygulama kodunu güncellemek zorunda kalırsınız. Oysa bir alias tanımlarsanız, arkada hangi index olursa olsun uygulamanız etkilenmez.
Template kullanmadan her yeni index oluşturduğunuzda aynı mapping ve ayarları tekrar tekrar tanımlamak zorunda kalırsınız. Bu hem zaman kaybıdır hem de tutarsızlıklara yol açar.
Elasticsearch Index Alias Nedir?
Alias, bir veya birden fazla index üzerinde tanımlanan sanal bir isimdir. Uygulamalar bu ismi kullanarak arka planda farklı indexlere erişebilir. Alias hem okuma hem de yazma operasyonlarında kullanılabilir, ancak yazma işlemleri için özel dikkat gerekir.
Temel Alias Oluşturma
En basit haliyle bir alias şu şekilde oluşturulur:
curl -X POST "localhost:9200/_aliases" -H 'Content-Type: application/json' -d'
{
"actions": [
{
"add": {
"index": "logs-2024-01",
"alias": "logs-current"
}
}
]
}'
Bu komutla logs-2024-01 index’i üzerine logs-current adında bir alias tanımladık. Artık uygulamalarınız logs-current ismini kullanarak bu indexe erişebilir.
Mevcut aliasları listelemek için:
curl -X GET "localhost:9200/_aliases?pretty"
Belirli bir index’in aliaslarını görmek için:
curl -X GET "localhost:9200/logs-2024-01/_alias?pretty"
Alias Üzerinden Index Değiştirme
Gerçek gücü burada yatıyor. Ocak ayı bitti ve artık Şubat indexine geçmek istiyorsunuz. Uygulamanıza dokunmadan bunu şu şekilde yapabilirsiniz:
curl -X POST "localhost:9200/_aliases" -H 'Content-Type: application/json' -d'
{
"actions": [
{
"remove": {
"index": "logs-2024-01",
"alias": "logs-current"
}
},
{
"add": {
"index": "logs-2024-02",
"alias": "logs-current"
}
}
]
}'
Bu işlem atomik olarak gerçekleşir. Yani eski indexten yeni indexe geçiş sırasında herhangi bir kesinti yaşanmaz. Uygulamanız sorgularını logs-current alias’ına göndermeye devam eder, Elasticsearch arkada hangi indexi işaret ettiğini bilir.
Birden Fazla Index Üzerinde Alias
Bir alias, birden fazla index üzerine tanımlanabilir. Bu özellik özellikle belirli bir tarih aralığındaki verileri sorgulamak istediğinizde işe yarar:
curl -X POST "localhost:9200/_aliases" -H 'Content-Type: application/json' -d'
{
"actions": [
{
"add": {
"indices": ["logs-2024-01", "logs-2024-02", "logs-2024-03"],
"alias": "logs-q1-2024"
}
}
]
}'
Artık logs-q1-2024 alias’ını kullanarak 2024 yılının ilk çeyreğindeki tüm verilere erişebilirsiniz. Sorgularınızı tek bir alias üzerinden yönetirsiniz.
Filtrelenmiş Alias Kullanımı
Bu özellik gerçekten çok işe yarıyor. Aynı index üzerinde farklı kullanıcı gruplarına farklı veriler sunmak istediğinizde filtrelenmiş alias kullanabilirsiniz:
curl -X POST "localhost:9200/_aliases" -H 'Content-Type: application/json' -d'
{
"actions": [
{
"add": {
"index": "application-logs",
"alias": "error-logs",
"filter": {
"term": {
"level": "error"
}
}
}
}
]
}'
Bu alias üzerinden yapılan tüm sorgular otomatik olarak sadece level: error olan dökümanları döndürür. Gerçek index üzerindeki tüm verilere erişim için ayrı izin tanımlamanıza gerek kalmaz, alias seviyesinde filtreleme yapabilirsiniz.
Yazma Alias’ı Tanımlama
Birden fazla index üzerinde tanımlı bir alias’a yazma işlemi yapmak istiyorsanız, hangi index’e yazılacağını belirtmeniz gerekir. Bunun için is_write_index parametresi kullanılır:
curl -X POST "localhost:9200/_aliases" -H 'Content-Type: application/json' -d'
{
"actions": [
{
"add": {
"index": "logs-2024-01",
"alias": "logs-active",
"is_write_index": false
}
},
{
"add": {
"index": "logs-2024-02",
"alias": "logs-active",
"is_write_index": true
}
}
]
}'
Bu yapıda logs-active alias’ı üzerinden okuma yapıldığında her iki indexten de veri gelir. Yazma işlemi ise sadece logs-2024-02 indexine yönlendirilir. Bu pattern, özellikle rolling index stratejilerinde çok kullanışlıdır.
Index Template Nedir?
Template, yeni bir index oluşturulduğunda otomatik olarak uygulanacak ayarları ve mapping’leri tanımlamanızı sağlar. Index ismi belirli bir pattern’a uymaktaysa, template otomatik devreye girer. Bir kez tanımlarsınız, her yeni index için tekrar uğraşmazsınız.
Legacy Template vs Index Template
Elasticsearch 7.8 öncesinde sadece _template endpoint’i vardı. 7.8 ile birlikte _index_template (composable templates) geldi. Mümkün olduğunca yeni yöntemi kullanmanızı tavsiye ederim, çünkü component template desteği sunuyor ve çok daha esnek.
Temel Index Template Oluşturma
Log yönetimi için basit bir template oluşturalım:
curl -X PUT "localhost:9200/_index_template/logs-template" -H 'Content-Type: application/json' -d'
{
"index_patterns": ["logs-*"],
"priority": 1,
"template": {
"settings": {
"number_of_shards": 2,
"number_of_replicas": 1,
"index.refresh_interval": "30s",
"index.codec": "best_compression"
},
"mappings": {
"properties": {
"@timestamp": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
},
"level": {
"type": "keyword"
},
"service": {
"type": "keyword"
},
"message": {
"type": "text",
"analyzer": "standard"
},
"host": {
"type": "keyword"
},
"response_time": {
"type": "float"
}
}
}
}
}'
Artık logs- ile başlayan her yeni index oluşturulduğunda bu template otomatik uygulanır. logs-2024-03, logs-production, logs-staging hepsi bu template’i kullanır.
Component Template Kullanımı
Composable template’lerin en güzel özelliği, component template desteğidir. Ortak ayarları bir kez tanımlayıp farklı template’lerde yeniden kullanabilirsiniz:
# Önce settings component template'i oluşturuyoruz
curl -X PUT "localhost:9200/_component_template/common-settings" -H 'Content-Type: application/json' -d'
{
"template": {
"settings": {
"number_of_shards": 2,
"number_of_replicas": 1,
"index.refresh_interval": "30s",
"index.translog.durability": "async"
}
}
}'
# Şimdi mapping component template'i oluşturuyoruz
curl -X PUT "localhost:9200/_component_template/log-mappings" -H 'Content-Type: application/json' -d'
{
"template": {
"mappings": {
"properties": {
"@timestamp": {
"type": "date"
},
"level": {
"type": "keyword"
},
"message": {
"type": "text"
},
"service": {
"type": "keyword"
}
}
}
}
}'
Şimdi bu component’ları kullanarak asıl template’i oluşturuyoruz:
curl -X PUT "localhost:9200/_index_template/application-logs-template" -H 'Content-Type: application/json' -d'
{
"index_patterns": ["app-logs-*"],
"priority": 2,
"composed_of": ["common-settings", "log-mappings"],
"template": {
"mappings": {
"properties": {
"user_id": {
"type": "keyword"
},
"session_id": {
"type": "keyword"
},
"endpoint": {
"type": "keyword"
}
}
}
}
}'
Burada common-settings ve log-mappings component’ları otomatik birleştirilir. Template’e özgü ek mapping’ler de üstüne eklenir. Gelecekte common-settings üzerinde bir değişiklik yaparsanız, bu component’ı kullanan tüm template’ler otomatik olarak güncellenir.
Template Priority Yönetimi
Birden fazla template aynı index pattern’ına uymaktaysa, priority değeri yüksek olan kazanır. Bu konuda dikkatli olmak gerekiyor:
- priority: 0 – En düşük öncelik, sadece başka template yoksa uygulanır
- priority: 1 – Genel template’ler için uygun
- priority: 100 – Çok spesifik template’ler için yüksek öncelik kullanın
Mevcut template’leri listelemek için:
curl -X GET "localhost:9200/_index_template?pretty"
Belirli bir template’i görmek için:
curl -X GET "localhost:9200/_index_template/logs-template?pretty"
Gerçek Dünya Senaryosu: Log Rotasyonu
Şimdi tüm bu bilgileri birleştirerek gerçekçi bir senaryo kuralım. Üretimde çalışan bir web uygulamasının loglarını yönetiyorsunuz. Her ay yeni bir index oluşturuluyor, 3 ay geçmiş indexler arşive alınıyor.
Önce template’i oluşturalım:
curl -X PUT "localhost:9200/_index_template/weblog-template" -H 'Content-Type: application/json' -d'
{
"index_patterns": ["weblog-*"],
"priority": 5,
"template": {
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"index.refresh_interval": "60s",
"index.codec": "best_compression",
"index.routing.allocation.require._tier_preference": "data_hot"
},
"mappings": {
"properties": {
"@timestamp": { "type": "date" },
"client_ip": { "type": "ip" },
"method": { "type": "keyword" },
"path": { "type": "keyword" },
"status_code": { "type": "integer" },
"response_time_ms": { "type": "float" },
"user_agent": { "type": "text", "fields": { "keyword": { "type": "keyword" } } },
"bytes_sent": { "type": "long" }
}
},
"aliases": {
"weblogs-all": {}
}
}
}'
Dikkat ettiniz mi? Template içine de alias tanımladık. weblog-* pattern’ına uyan her yeni index otomatik olarak weblogs-all alias’ına dahil edilir.
Şimdi yeni ay indexini oluşturalım ve aktif alias’ı taşıyalım. Bunu bir bash scripti ile otomatize edebilirsiniz:
#!/bin/bash
ES_HOST="localhost:9200"
CURRENT_MONTH=$(date +%Y-%m)
PREV_MONTH=$(date -d "1 month ago" +%Y-%m)
NEW_INDEX="weblog-${CURRENT_MONTH}"
PREV_INDEX="weblog-${PREV_MONTH}"
# Yeni index oluştur (template otomatik uygulanır)
curl -s -X PUT "${ES_HOST}/${NEW_INDEX}" > /dev/null
# Aktif alias'ı eski indexten yeniye taşı
curl -s -X POST "${ES_HOST}/_aliases" -H 'Content-Type: application/json' -d"
{
"actions": [
{
"remove": {
"index": "${PREV_INDEX}",
"alias": "weblogs-active"
}
},
{
"add": {
"index": "${NEW_INDEX}",
"alias": "weblogs-active",
"is_write_index": true
}
}
]
}"
echo "Alias weblogs-active artik ${NEW_INDEX} indexini isaret ediyor."
Bu scripti her ayın 1’inde cron ile çalıştırın, index rotasyonu tamamen otomatik hale gelir.
Template Simülasyonu
Yeni bir index oluşturmadan önce hangi template’in uygulanacağını ve sonuç mapping’in nasıl görüneceğini test edebilirsiniz. Bu özelliği üretimde çok kullanıyorum:
curl -X POST "localhost:9200/_index_template/_simulate_index/weblog-2024-04?pretty"
Bu komut, weblog-2024-04 adında bir index oluşturulsaydı hangi ayarların ve mapping’lerin uygulanacağını gösterir. Gerçekten index oluşturmaz, sadece simüle eder. Sorun yaşamadan önce test etmek için idealdir.
Alias ve Template Birlikte Kullanım Stratejileri
Mavi-Yeşil Deployment Pattern’ı
Elasticsearch üzerinde zero-downtime reindexing yaparken alias bu pattern’ı mükemmel destekler:
products-v1index’i aktif olarak kullanılıyorproducts-v2index’ini yeni mapping ile oluşturuyorsunuz_reindexAPI ile verileri kopyalıyorsunuz- Alias’ı
products-v1‘denproducts-v2‘ye atomik olarak taşıyorsunuz - Uygulama
products-currentalias’ını kullandığı için hiçbir şeyden haberi olmaz
Tenant İzolasyonu Pattern’ı
Çok kiracılı bir sistemde her tenant için ayrı index oluşturup ortak alias ile yönetebilirsiniz. Tenant’a özgü filtrelenmiş alias’lar sayesinde veri izolasyonu sağlarsınız.
Warm/Cold Tier Yönetimi
Template içinde tier tercihlerini tanımlayın. Indexler oluştukça doğru tier’a otomatik atanır. ILM (Index Lifecycle Management) ile birlikte kullanıldığında log verisi hot’tan warm’a, warm’dan cold’a otomatik geçer.
Sık Yapılan Hatalar
Alias silme unutkanlığı: Bir index’i silerken üzerindeki alias’ları kontrol etmezseniz, uygulamanız boşta kalan alias’a erişmeye çalışır ve hata alırsınız. Her index silme öncesi aliasları kontrol edin.
Template çakışmaları: Aynı pattern için birden fazla template tanımlamak ve priority vermeyi unutmak ciddi sorunlara yol açar. Template oluştururken mevcut template listesini mutlaka gözden geçirin.
Dynamic mapping kapanı: Template tanımlamadan önce index oluşturulursa, Elasticsearch dynamic mapping uygular ve beklenmedik field type’ları ortaya çıkabilir. Template’leri her zaman index oluşmadan önce tanımlayın.
Yazma alias’ı belirtmemek: Birden fazla index üzerinde alias tanımlayıp is_write_index belirtmezseniz, yazma işlemleri belirsizleşir ve hata alırsınız.
Sonuç
Elasticsearch’te alias ve template kullanmak, başlangıçta ekstra iş gibi görünse de orta ve büyük ölçekli sistemlerde operasyonel yükü dramatik biçimde azaltır. Alias sayesinde uygulamalarınızı index isimlerinden bağımsız hale getirirsiniz. Template sayesinde yeni indexleriniz tutarlı yapıya kavuşur, manuel yapılandırma hataları ortadan kalkar.
Üretimde öğrendiğim en önemli ders şu: Her yeni Elasticsearch cluster kurulumunda ilk yapmanız gereken şey, index naming convention’ınızı belirlemek ve buna uygun template’leri oluşturmaktır. Veri geldikten sonra bu yapıyı oluşturmaya çalışmak çok daha zahmetli olur.
ILM ile birlikte kullandığınızda ise alias ve template kombinasyonu tam anlamıyla kendiliğinden yöneten bir index lifecycle sistemi oluşturur. Bu konuyu bir sonraki yazıda ele alacağım.
