Elasticsearch Ubuntu ve Debian’a Kurulum Rehberi
Yeni bir sunucuya Elasticsearch kurmak, ilk bakışta basit gibi görünse de pratikte onlarca ince ayar ve potansiyel tuzak barındıran bir süreçtir. Yıllar içinde bu kurulumu onlarca farklı ortamda yaptım; kimisinde production veritabanının yanına sıkıştırılmış, kimisinde tek başına dedicated bir makineye. Her seferinde öğrendiğim bir şey oldu. Bu yazıda Ubuntu ve Debian üzerinde Elasticsearch kurulumunu baştan sona anlatacağım, hem temel adımları hem de genellikle dökümanlarda geçiştirilen kritik noktalara değineceğim.
Ön Gereksinimler ve Sistem Hazırlığı
Elasticsearch, Java tabanlı bir uygulama. Dolayısıyla JVM gereksinimleri var. Ancak Elasticsearch 8.x sürümünden itibaren kendi JDK’sını paketine dahil etti, ayrıca Java yüklemenize gerek yok. Bu çok büyük bir rahatlama çünkü eskiden OpenJDK versiyonu uyumsuzlukları ciddi baş ağrısı yaratıyordu.
Donanım tarafında minimum beklentiler şöyle:
- RAM: Minimum 4 GB, production için 16 GB ve üzeri önerilir. Elasticsearch’ün heap boyutu fiziksel RAM’in yarısını geçmemeli, bu kural neredeyse kutsaldır.
- CPU: 2 çekirdek minimum, ancak yoğun sorgular için 8+ çekirdek çok daha rahat bir deneyim sunar.
- Disk: SSD şart. HDD üzerinde Elasticsearch çalışır ama “çalışır” kelimesinin en kötü anlamında.
- İşletim sistemi: Ubuntu 20.04/22.04 LTS veya Debian 11/12.
Başlamadan önce sistemi güncelleyelim:
sudo apt update && sudo apt upgrade -y
sudo apt install curl wget gnupg apt-transport-https -y
Elasticsearch GPG Anahtarı ve Repository Eklenmesi
Elastic’in resmi paket deposunu eklemenin en güvenilir yolu GPG anahtarı ile birlikte yapmak. Burada dikkat etmeniz gereken bir nokta var: Elasticsearch 8.x ile birlikte key yönetimi biraz değişti. Eski /etc/apt/trusted.gpg yaklaşımı yerine artık /usr/share/keyrings/ altına koyuyoruz.
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch |
sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
Şimdi repository’yi ekleyelim. 8.x sürümü için:
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg]
https://artifacts.elastic.co/packages/8.x/apt stable main" |
sudo tee /etc/apt/sources.list.d/elastic-8.x.list
Eğer farklı bir major version kullanmak istiyorsanız URL’deki 8.x kısmını değiştirmeniz yeterli. Ama 8.x kullanmanızı öneririm; güvenlik mimarisi ve performans iyileştirmeleri açısından önceki versiyonlardan çok daha olgunlaşmış durumda.
sudo apt update
sudo apt install elasticsearch -y
Kurulum tamamlandığında terminal çıktısında önemli bir şey göreceksiniz: Elasticsearch, ilk kurulumda otomatik olarak bir elastic kullanıcısı için şifre üretiyor ve bunu ekranda gösteriyor. Bu şifreyi mutlaka kaydedin çünkü bir daha gösterilmiyor.
Temel Yapılandırma
Ana konfigürasyon dosyası /etc/elasticsearch/elasticsearch.yml. Varsayılan haliyle production için hazır değil. Şimdi bu dosyayı düzenleyelim:
sudo nano /etc/elasticsearch/elasticsearch.yml
Tek node’lu bir kurulum için minimum gerekli ayarlar:
cluster.name: my-cluster
node.name: node-1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.type: single-node
xpack.security.enabled: true
xpack.security.enrollment.enabled: true
network.host: 0.0.0.0 ayarını koyduğunuzda Elasticsearch dışarıya açık hale geliyor. Bu noktada firewall ayarlarınızı yapmanız kritik. Sadece ihtiyacınız olan IP’lerin 9200 portuna erişmesine izin verin.
discovery.type: single-node ayarı önemli. Bu olmadan Elasticsearch başka node’lar arıyor ve bulamayınca cluster oluşturma aşamasında takılıp kalabiliyor. Tek node kurulum için bu satır olmadan sağlıklı çalışmaz.
JVM Heap Boyutu Ayarı
Daha önce söylediğim kuralı hatırlayın: heap boyutu fiziksel RAM’in yarısını geçmesin. 16 GB RAM’li bir sunucuda 8 GB heap idealdir. Bu ayarı yapmak için:
sudo nano /etc/elasticsearch/jvm.options.d/heap.options
Bu dosyayı oluşturun ve içine yazın:
-Xms4g
-Xmx4g
Burada Xms ve Xmx değerlerini eşit tutun. Aralarında fark olursa JVM sürekli heap genişletme/daraltma işlemi yapar ve performans kayıpları oluşur. Bu küçük detayı atlayan sysadmin’ler zamanla anlaşılması güç intermittent yavaşlık sorunlarıyla boğuşuyor.
Neden /etc/elasticsearch/jvm.options.d/ altında ayrı bir dosya oluşturduk? Çünkü ana jvm.options dosyasını düzenlersek, paket güncellemelerinde değişikliklerimizin üzerine yazılma riski var. Bu klasördeki .options uzantılı dosyalar otomatik okunuyor ve daha temiz bir yönetim sağlıyor.
Sistem Limitleri ve Kernel Parametreleri
Elasticsearch’ün sağlıklı çalışması için bazı işletim sistemi limitlerini artırmak gerekiyor. Bu adımı atlayanlar ileride max virtual memory areas vm.max_map_count [65530] is too low gibi hatalarla karşılaşıyor:
sudo sysctl -w vm.max_map_count=262144
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
File descriptor limitleri için de düzenleme yapalım. Elasticsearch çok sayıda dosya açık tuttuğundan bu değer önemli:
sudo nano /etc/security/limits.conf
Şu satırları ekleyin:
elasticsearch soft nofile 65536
elasticsearch hard nofile 65536
elasticsearch soft nproc 4096
elasticsearch hard nproc 4096
systemd üzerinden çalıştığınız için bir de service override dosyası oluşturmanızı öneririm:
sudo mkdir -p /etc/systemd/system/elasticsearch.service.d/
sudo nano /etc/systemd/system/elasticsearch.service.d/override.conf
İçine yazın:
[Service]
LimitNOFILE=65536
LimitNPROC=4096
Servisi Başlatma ve Otomatik Başlatma Ayarı
Artık servisi başlatabiliriz:
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch
Servis durumunu kontrol edin:
sudo systemctl status elasticsearch
İlk başlangıç biraz zaman alabilir, özellikle düşük RAM’li sistemlerde 2-3 dakikayı bulabiliyor. Sabırsızlık edip defalarca status çalıştırmak yerine logları takip edin:
sudo journalctl -u elasticsearch -f
started log satırını gördüğünüzde servisi test etmeye hazırsınız.
Güvenlik ve İlk Bağlantı Testi
Elasticsearch 8.x’te güvenlik varsayılan olarak açık geliyor ve TLS/SSL etkin. Bu nedenle http:// yerine https:// kullanmanız gerekiyor. Kurulum sırasında kaydedtiğiniz şifreyle test edelim:
curl --cacert /etc/elasticsearch/certs/http_ca.crt
-u elastic:SIFRENIZI_BURAYA_YAZIN
https://localhost:9200
Başarılı bir yanıt şöyle görünür:
{
"name" : "node-1",
"cluster_name" : "my-cluster",
"cluster_uuid" : "...",
"version" : {
"number" : "8.x.x",
...
},
"tagline" : "You Know, for Search"
}
Eğer elastic kullanıcısının şifresini kaybettiyseniz sıfırlayabilirsiniz:
sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
Kibana ile Entegrasyon için Token Üretimi
ELK stack kuruyorsanız Kibana’yı da bağlamanız gerekecek. Elasticsearch 8.x’te bu işlem enrollment token mekanizmasıyla yapılıyor:
sudo /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
Bu token 30 dakika geçerli. Kibana kurulumunda bu token’ı kullanacaksınız. Token süresi dolarsa yukarıdaki komutu tekrar çalıştırın.
Index ve Cluster Sağlık Kontrolü
Sistem çalışmaya başladıktan sonra temel sağlık kontrollerini yapmayı alışkanlık haline getirin. Cluster sağlığını sorgulamak için:
curl --cacert /etc/elasticsearch/certs/http_ca.crt
-u elastic:SIFRE
https://localhost:9200/_cluster/health?pretty
Yanıttaki status alanı üç değer alabilir:
- green: Her şey yolunda, tüm shardlar aktif
- yellow: Primary shardlar aktif ama replica shardlar atanmamış, single-node kurulumda bu normaldir
- red: Bazı primary shardlar atanamamış, acil müdahale gerekiyor
Tek node kurulumda status’un yellow gelmesi sizi korkutmasın. Replica shard için ikinci bir node olmadığından bu beklenen bir durum. Production’da mutlaka en az 3 node cluster kurmanızı öneririm.
Node bilgilerini almak için:
curl --cacert /etc/elasticsearch/certs/http_ca.crt
-u elastic:SIFRE
https://localhost:9200/_nodes?pretty
Disk Alanı Yönetimi ve Index Lifecycle
Elasticsearch log verilerini tutmak için kullanıldığında disk doluluk sorunu kaçınılmaz şekilde gelir. Bu konuda önceden önlem almak gerekiyor.
Elasticsearch, disk kullanımına göre index yazımını otomatik kısıtlayan watermark mekanizmasına sahip. Varsayılan değerleri çoğu zaman iş gereksinimlerinize uymayabilir:
curl --cacert /etc/elasticsearch/certs/http_ca.crt
-u elastic:SIFRE
-X PUT "https://localhost:9200/_cluster/settings?pretty"
-H 'Content-Type: application/json'
-d '{
"transient": {
"cluster.routing.allocation.disk.watermark.low": "85%",
"cluster.routing.allocation.disk.watermark.high": "90%",
"cluster.routing.allocation.disk.watermark.flood_stage": "95%"
}
}'
- low watermark: Bu noktadan sonra yeni shardlar bu node’a atanmaz
- high watermark: Elasticsearch mevcut shardları başka node’lara taşımaya çalışır
- flood_stage: Index’ler read-only’e alınır, veri yazılamaz
Bu değerleri disk kapasitinize ve kritiklik seviyenize göre ayarlayın. 1 TB SSD’li bir node için flood_stage‘i 95% yerine 90% yapmanızı öneririm, aksi halde 50 GB kalınca fark edersiniz ki sistem kilitlenmiş.
Log Dosyası Rotasyonu
Elasticsearch kendi log rotasyonunu yapıyor ama varsayılan ayarlar bazen yeterli olmuyor. Log dizinini kontrol edin:
ls -lh /var/log/elasticsearch/
log4j2.properties dosyasında log rotation ayarlarını bulabilirsiniz:
sudo nano /etc/elasticsearch/log4j2.properties
Özellikle appender.rolling.policies.size.size değerini ortamınıza göre ayarlayın. 50MB varsayılan değeri çoğu production ortamı için düşük kalıyor, 200-500MB daha makul.
Firewall Kuralları
ufw kullanıyorsanız Elasticsearch portlarını sadece ihtiyacınız olan kaynaklardan açın:
# Kibana ve Logstash'ın çalıştığı IP'den erişim
sudo ufw allow from 192.168.1.100 to any port 9200 proto tcp
sudo ufw allow from 192.168.1.100 to any port 9300 proto tcp
# Genel internetten erişimi engelle
sudo ufw deny 9200
sudo ufw deny 9300
9300 portu node-to-node iletişim için. Tek node kurulumda kullanılmıyor gibi görünse de ileride cluster büyütmek isterseniz bu portun açık olması gerekiyor, ancak sadece diğer Elasticsearch node’larının IP’lerine.
Backup ve Snapshot Yapılandırması
Production ortamında snapshot almadan gönül rahatlığıyla uyuyamazsınız. Repository tanımlamak için önce bir dizin oluşturun:
sudo mkdir -p /var/backups/elasticsearch
sudo chown elasticsearch:elasticsearch /var/backups/elasticsearch
elasticsearch.yml‘e ekleyin:
path.repo: ["/var/backups/elasticsearch"]
Servisi yeniden başlatın ve repository’yi kaydedin:
curl --cacert /etc/elasticsearch/certs/http_ca.crt
-u elastic:SIFRE
-X PUT "https://localhost:9200/_snapshot/backup_repo?pretty"
-H 'Content-Type: application/json'
-d '{
"type": "fs",
"settings": {
"location": "/var/backups/elasticsearch"
}
}'
Snapshot almak için:
curl --cacert /etc/elasticsearch/certs/http_ca.crt
-u elastic:SIFRE
-X PUT "https://localhost:9200/_snapshot/backup_repo/snapshot_1?wait_for_completion=true&pretty"
Bu komutu cron ile günlük olarak çalıştırın, mümkünse S3 veya başka bir remote storage’a gönderecek bir script yazın. Lokal backup, disk arızasında sizi kurtarmaz.
Performans İzleme
Elasticsearch’ün iç metriklerine bakmak için:
curl --cacert /etc/elasticsearch/certs/http_ca.crt
-u elastic:SIFRE
"https://localhost:9200/_nodes/stats?pretty" | grep -A5 "jvm"
JVM heap kullanımı heap_used_percent değerini takip edin. Sürekli %80 üzerinde seyrediyorsa ya heap boyutunu artırmanız ya da index temizliği yapmanız gerekiyor. %90 üzerini gördüğünüzde GC overhead sorunu yaşamaya başlarsınız, bu da yavaş sorgular ve zaman aşımları anlamına gelir.
Slow query logunu açmak için:
curl --cacert /etc/elasticsearch/certs/http_ca.crt
-u elastic:SIFRE
-X PUT "https://localhost:9200/YOUR_INDEX/_settings"
-H 'Content-Type: application/json'
-d '{
"index.search.slowlog.threshold.query.warn": "10s",
"index.search.slowlog.threshold.query.info": "5s",
"index.search.slowlog.threshold.fetch.warn": "1s"
}'
Bu ayar, belirlediğiniz süreyi aşan sorguları log dosyasına yazıyor. Performans sorunlarını debug ederken altın değerinde bilgi sunuyor.
Sık Karşılaşılan Sorunlar
“master not discovered” hatası: Genellikle discovery.seed_hosts veya discovery.type ayarının eksik olmasından kaynaklanır. Single node için discovery.type: single-node olduğundan emin olun.
Servis başlamıyor, OutOfMemoryError: Heap değerleri fiziksel RAM’i aşıyor olabilir. jvm.options.d/heap.options dosyasını kontrol edin.
“circuit_breaking_exception”: Bu hata Elasticsearch’ün bellek korumasının devreye girdiğini gösterir. Aynı anda çok fazla büyük query çalışıyor olabilir ya da heap yetersiz kalıyor.
Disk dolduğunda indexler read-only oluyor: Flood stage watermark’a ulaşıldığında Elasticsearch tüm indexleri otomatik read-only yapar. Disk alanı açtıktan sonra:
curl --cacert /etc/elasticsearch/certs/http_ca.crt
-u elastic:SIFRE
-X PUT "https://localhost:9200/_all/_settings"
-H 'Content-Type: application/json'
-d '{"index.blocks.read_only_allow_delete": null}'
Sonuç
Elasticsearch kurulumu görünürde birkaç komuttan ibaret, ama altında yüzlerce ince ayar yatıyor. JVM heap’ten kernel parametrelerine, disk watermark’larından snapshot yönetimine kadar her katmanın kendi kritik noktaları var. Bu yazıda anlattıklarım yıllar içinde benim ya da çevremdeki mühendislerin yaşadığı gerçek sorunlardan damıtıldı.
Şunu net söyleyeyim: Tek node kurulum geliştirme ve test için kabul edilebilir, ama production log altyapısı için minimum 3 node cluster kurmanızı öneririm. Hem yüksek erişilebilirlik hem de shard replikasyonu açısından bu sayı kritik bir eşik. Logstash ve Kibana kurulumunu anlattığımda cluster yapılandırmasına da daha detaylı gireceğim.
Herhangi bir adımda takılırsanız önce journalctl -u elasticsearch -n 100 çıktısına bakın. Elasticsearch hataları oldukça açıklayıcı, genellikle log dosyaları sizi doğrudan soruna götürüyor.
