Elasticsearch Yıl-Ay Bazlı Veri Taşıma ve Reindex Otomasyonu

Giriş
Elasticsearch ortamlarında büyük veri setlerini yönetmek, özellikle uzun süreli log verilerini organize etmek, sistem performansı ve veri erişilebilirliği açısından kritik öneme sahiptir. Bu makalede, Elasticsearch’te bulunan verileri yıl ve ay bazında bölümlere ayırarak (partitioning) yeni bir Elasticsearch sistemine taşıyan otomatik bir bash script’ini inceleyeceğiz.
Script’in Amacı
Bu otomasyon aracı, kaynak bir Elasticsearch cluster’ındaki mevcut index’i zaman bazlı daha küçük index’lere bölerek hedef sisteme taşır. Örneğin, sistemlog adlı tek bir index’teki tüm veriler, sistemlog-2022-01, sistemlog-2022-02 gibi aylık index’lere ayrılarak organize edilir.
Temel Özellikler
1. Dinamik Timestamp Field Tespiti
Script, verilerdeki zaman damgası alanını otomatik olarak tespit etmek için esnek bir yapı sunar:
# Örnek döküman çekerek timestamp field'larını gösterir
- @timestamp
- timestamp
- createdAt
- created_date
Kullanıcı, hangi alanı kullanmak istediğini belirleyebilir veya varsayılan @timestamp alanını kullanabilir.
2. Akıllı Tarih Format Tespiti
Elasticsearch’te farklı tarih formatları kullanılabilir. Script, üç farklı format desteği sunar:
- ISO 8601 (Z timezone):
2022-12-31T23:59:59.999Z - Basit tarih formatı:
2022-12-31 - Timezone olmadan:
2022-12-31T23:59:59
Script, bu formatları sırayla deneyerek hangi formatın kullanıldığını otomatik tespit eder.
3. Veri Doğrulama Mekanizması
Toplu taşıma işlemine başlamadan önce, script kullanıcıdan bir test yılı ve ayı isteyerek o dönemde veri olup olmadığını kontrol eder. Bu sayede:
- Yanlış parametrelerle işlem başlatılmasının önüne geçilir
- Timestamp field’ının doğru çalıştığı onaylanır
- Zaman harcaması önlenir
4. Artık Yıl Hesaplaması
Script, Şubat ayının gün sayısını otomatik olarak hesaplar:
# Artık yıl kontrolü
if [ $((year % 4)) -eq 0 ] && ([ $((year % 100)) -ne 0 ] || [ $((year % 400)) -eq 0 ]); then
LAST_DAY="29"
else
LAST_DAY="28"
fi
Çalışma Prensibi
Adım 1: Bağlantı Bilgileri
Script, kaynak ve hedef sistemler için bağlantı parametrelerini kullanır:
SOURCE_HOST="http://xxx.xxx.xxx.xxx:9200"
SOURCE_USER="*******"
SOURCE_PASS="***************"
DEST_HOST="https://localhost:9200"
DEST_USER="*******"
DEST_PASS="***************"
Güvenlik Notu: Üretim ortamlarında şifreleri doğrudan script içine yazmak yerine, environment variables veya secret management araçları kullanılmalıdır.
Adım 2: Index Yapısı Analizi
Script öncelikle kaynak index’ten örnek bir döküman çeker ve içindeki zaman alanlarını listeler:
curl -s -u $SOURCE_USER:$SOURCE_PASS \
"$SOURCE_HOST/$SOURCE_INDEX/_search?size=1"
Adım 3: Test ve Doğrulama
Kullanıcıdan alınan test yılı ve ayı için veri sorgusu yapılır:
{
"query": {
"range": {
"@timestamp": {
"gte": "2022-12-01T00:00:00.000Z",
"lte": "2022-12-31T23:59:59.999Z"
}
}
}
}
Adım 4: Aylık Reindex İşlemi
Her yıl ve ay için ayrı ayrı reindex işlemi gerçekleştirilir:
curl -k -s -u $DEST_USER:$DEST_PASS \
-X POST "$DEST_HOST/_reindex?wait_for_completion=true&timeout=2h" \
-H 'Content-Type: application/json' -d'{
"source": {
"remote": {
"host": "http://xxx.xxx.xxx.xxx:9200",
"username": "*******",
"password": "***************",
"socket_timeout": "60m",
"connect_timeout": "10m"
},
"index": "sistemlog",
"size": 1000,
"query": {
"range": {
"@timestamp": {
"gte": "2022-12-01T00:00:00.000Z",
"lte": "2022-12-31T23:59:59.999Z"
}
}
}
},
"dest": {
"index": "sistemlog-2022-12"
}
}'
Avantajları
1. Performans İyileştirmesi
- Küçük index’ler daha hızlı sorgulanır
- Daha etkili shard yönetimi sağlanır
- Gereksiz verilerin taranması önlenir
2. Veri Yaşam Döngüsü Yönetimi
- Eski veriler kolayca silinebilir veya arşivlenebilir
- Index-level retention politikaları uygulanabilir
- Maliyetli hot storage’dan cold storage’a geçiş kolaylaşır
3. Yönetilebilirlik
- Hangi dönemin verilerinin nerede olduğu açıkça görülür
- Sorun tespiti kolaylaşır
- Backup ve restore işlemleri daha kontrollü yapılır
4. Esneklik
- Farklı timestamp field’ları desteklenir
- Çoklu tarih formatlarıyla uyumludur
- İstenilen yıllar seçilebilir
Önemli Parametreler
Timeout Ayarları
wait_for_completion=true&timeout=2h
socket_timeout: "60m"
connect_timeout: "10m"
Bu ayarlar, büyük veri transferlerinde işlemin tamamlanması için yeterli süre sağlar.
Batch Size
"size": 1000
Her seferde 1000 döküman transfer edilir. Bu değer, network ve sistem kapasitesine göre optimize edilebilir.
Yük Dengeleme
sleep 1
```
Her ay işlemi arasında 1 saniye bekleme, sistemlere aşırı yük binmesini önler.
## Çıktı ve Raporlama
Script, detaylı bilgilendirme sağlar:
```
========================================
📅 2022-12 (01-31)
📦 Hedef Index: sistemlog-2022-12
📊 Taşınacak döküman sayısı: 45,230
✅ Toplam: 45230 | Oluşturulan: 45230 | Güncellenen: 0 | Süre: 127s
📊 sistemlog-2022-12: 45230 döküman
========================================
Kullanım Senaryoları
1. Veri Migrasyonu
Eski bir Elasticsearch cluster’ından yeni bir cluster’a veri taşırken daha organize bir yapı oluşturma.
2. Index Reorganizasyonu
Mevcut tek bir büyük index’i, yönetilebilir aylık index’lere bölme.
3. Multi-Cluster Senkronizasyonu
Farklı ortamlar (development, staging, production) arasında belirli dönemlere ait veri kopyalama.
4. Veri Arşivleme
Eski verileri farklı bir depolama sistemine taşımadan önce zaman bazlı düzenleme.
En İyi Uygulamalar
- Küçük Testlerle Başlayın: Önce tek bir ay ile test yapın
- Sistem Kaynaklarını İzleyin: CPU, memory ve disk I/O metriklerini takip edin
- Backup Alın: İşlem öncesi mutlaka yedek alın
- Yoğun Olmayan Saatlerde Çalıştırın: Üretim sistemlerini etkilememek için
- Log Kayıtları Tutun: Script çıktılarını dosyaya yönlendirin
./reindex_script.sh 2>&1 | tee reindex_$(date +%Y%m%d_%H%M%S).log
Potansiyel İyileştirmeler
- Paralel İşleme: Birden fazla ayı aynı anda işlemek için fork/background jobs
- Hata Yönetimi: Başarısız transferleri otomatik yeniden deneme mekanizması
- Progress Bar: Büyük veri setleri için görsel ilerleme göstergesi
- Email/Slack Bildirimleri: İşlem tamamlandığında otomatik bildirim
- Dry-Run Modu: Gerçek işlem yapmadan önce simülasyon
Dikkat Edilmesi Gerekenler
- Network Bant Genişliği: Büyük veri transferleri network trafiğini artırır
- Disk Alanı: Hedef sistemde yeterli disk alanı olduğundan emin olun
- Mapping Uyumluluğu: Kaynak ve hedef index mapping’lerinin uyumlu olması önemlidir
- Shard Sayısı: Küçük index’ler için shard sayısını azaltmak performans artışı sağlar
Sonuç
Bu bash script’i, Elasticsearch veri yönetiminde önemli bir otomasyon aracıdır. Özellikle uzun süreli log verilerini yöneten organizasyonlar için, verileri zaman bazlı organize etmek, hem performans hem de yönetilebilirlik açısından kritik faydalar sağlar. Script’in esnek yapısı, farklı Elasticsearch ortamlarına kolayca adapte edilebilmesini sağlar.
Doğru kullanıldığında, bu araç veri taşıma işlemlerini otomatikleştirerek zaman tasarrufu sağlar ve insan hatasını minimize eder. Ancak, üretim ortamlarında kullanmadan önce mutlaka test ortamında denenmeli ve organizasyonun güvenlik politikalarına uygun olarak yapılandırılmalıdır.



