Elasticsearch Kurulum ve İlk Yapılandırma: Linux Rehberi
Elasticsearch’ü ilk kez kuracaksanız ya da daha önce kurulum yaptınız ama “neden böyle yapılandırdım ki bunu?” diye kendinize sorduysanız, doğru yerdesiniz. Bu yazıda sıfırdan kurulum, temel yapılandırma ve gerçek dünyada karşılaşacağınız tipik ayarları adım adım ele alacağız. Üretim ortamına hazır, sağlam bir Elasticsearch kurulumu için ihtiyacınız olan her şey burada.
Elasticsearch Nedir ve Neden Kullanıyoruz?
Elasticsearch, Apache Lucene tabanlı açık kaynaklı bir arama ve analitik motorudur. JSON belgelerini indeksler, milyonlarca kayıt arasında milisaniyeler içinde arama yapar ve yatay olarak ölçeklenebilir. Log yönetimi (ELK Stack), uygulama arama motoru, gerçek zamanlı analitik gibi senaryolarda olmazsa olmazlardan biridir.
Sistem yöneticisi olarak Elasticsearch ile genellikle şu durumlarda karşılaşırsınız:
- Uygulama ekibi “bize ELK Stack kur” dediğinde
- Log analizini Splunk yerine açık kaynak çözümle yapmak istediğinizde
- E-ticaret sitesi için ürün arama altyapısı kuruyorsanız
- Güvenlik operasyonları için SIEM benzeri bir yapı oluşturuyorsanız
Sistem Gereksinimleri
Elasticsearch Java tabanlı çalışır ve bellek konusunda oldukça iddialıdır. Küçük bir test ortamı için minimum şunlar lazım:
- CPU: 2 vCPU (üretim için 4+ önerilir)
- RAM: 4 GB (üretim için 16-64 GB arası)
- Disk: SSD tercih edilmeli, HDD ile performans ciddi düşer
- OS: Ubuntu 20.04/22.04, CentOS 7/8, RHEL 8/9, Debian 11/12
- Java: Elasticsearch 8.x kendi JDK’sını getiriyor, ayrı kurulum gerekmez
Bir not ekleyeyim: Elasticsearch’te heap size (JVM belleği) genellikle toplam RAM’in yarısına ayarlanır, ama 32 GB’ı geçmemesi tavsiye edilir. Neden? Compressed object pointers (CompressedOops) 32 GB’ın üstünde devre dışı kalır ve JVM performansı düşer.
Java Kurulumu (Opsiyonel)
Elasticsearch 7.x ve sonrasında bundled JDK geliyor. Ama sisteminizde başka Java uygulamaları da varsa veya JAVA_HOME ortam değişkenini yönetmek istiyorsanız OpenJDK kurabilirsiniz:
# Ubuntu/Debian
sudo apt update
sudo apt install -y openjdk-17-jdk
# RHEL/CentOS
sudo dnf install -y java-17-openjdk-devel
# Java versiyonunu doğrula
java -version
Elasticsearch Kurulumu
APT ile Kurulum (Ubuntu/Debian)
En temiz yol resmi Elastic repoyu sisteme eklemek:
# GPG anahtarını indir ve kaydet
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
# apt-transport-https paketini kur
sudo apt install -y apt-transport-https
# Repo kaynağını ekle
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
# Paketi güncelle ve kur
sudo apt update
sudo apt install -y elasticsearch
Kurulum sırasında terminal çıktısında elastic kullanıcısının şifresini ve enrollment token bilgilerini göreceksiniz. Bunları mutlaka bir yere kaydedin, sonra göremezsiniz.
YUM/DNF ile Kurulum (RHEL/CentOS)
# Repo dosyasını oluştur
sudo tee /etc/yum.repos.d/elasticsearch.repo <<EOF
[elasticsearch]
name=Elasticsearch repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md
EOF
# Kurulum (enabled=0 olduğu için --enablerepo kullanıyoruz)
sudo dnf install --enablerepo=elasticsearch -y elasticsearch
Servis Yönetimi
# Systemd daemon'ı yeniden yükle
sudo systemctl daemon-reload
# Elasticsearch'ü etkinleştir ve başlat
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch
# Durum kontrolü
sudo systemctl status elasticsearch
Servis başladıktan sonra birkaç dakika bekleyin. Elasticsearch açılışta cluster bootstrap işlemi yapar, bu zaman alabilir.
Temel Yapılandırma Dosyaları
Elasticsearch’ün ana yapılandırması birkaç dosyada dağılmış durumda. Bunları tanımak şart:
- /etc/elasticsearch/elasticsearch.yml: Ana yapılandırma dosyası
- /etc/elasticsearch/jvm.options: JVM bellek ve GC ayarları
- /etc/elasticsearch/jvm.options.d/: Özel JVM seçenekleri için dizin
- /var/log/elasticsearch/: Log dosyaları
- /var/lib/elasticsearch/: Veri dizini
elasticsearch.yml Yapılandırması
Varsayılan yapılandırma tek node test ortamı için yeterli olsa da üretimde çok daha fazlasına ihtiyacınız var:
# /etc/elasticsearch/elasticsearch.yml
# Cluster adı - aynı ağdaki tüm node'lar aynı isme sahip olmalı
cluster.name: my-production-cluster
# Node adı - her node için benzersiz olmalı
node.name: es-node-01
# Veri ve log dizinleri
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
# Hangi arayüzden dinleyeceği
# Sadece localhost için: network.host: localhost
# Tüm arayüzler için: network.host: 0.0.0.0
# Belirli IP için:
network.host: 192.168.1.10
# HTTP portu
http.port: 9200
# Transport portu (node'lar arası iletişim)
transport.port: 9300
# Discovery için seed host'lar (cluster kurulumunda gerekli)
discovery.seed_hosts: ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
# İlk master seçimi için uygun node'lar
cluster.initial_master_nodes: ["es-node-01", "es-node-02", "es-node-03"]
# Security ayarları (8.x ile varsayılan açık geliyor)
xpack.security.enabled: true
xpack.security.enrollment.enabled: true
Dikkat: network.host: 0.0.0.0 ayarını production’da güvenlik duvarı kurallarıyla desteklemelisiniz. Elasticsearch’ü düz internete açmak felaket reçetesidir.
JVM Heap Ayarları
Bu kısım çok kritik. Yanlış heap ayarı ya out-of-memory hatasına ya da gereksiz GC pause’larına yol açar:
# /etc/elasticsearch/jvm.options.d/heap.options dosyası oluştur
sudo tee /etc/elasticsearch/jvm.options.d/heap.options <<EOF
# Başlangıç heap boyutu
-Xms4g
# Maksimum heap boyutu
-Xmx4g
EOF
Xms ve Xmx değerleri her zaman eşit olmalı. Bu JVM’nin belleği dinamik olarak istemesini önler ve performansı stabilize eder. 16 GB RAM’li bir sunucuda bu değerleri 8g yapabilirsiniz.
Kurulum Doğrulama
Elasticsearch’ün çalıştığını doğrulamak için:
# Security aktifse elastic kullanıcısıyla
curl --cacert /etc/elasticsearch/certs/http_ca.crt
-u elastic:SIFRENIZ
https://localhost:9200
# Cluster sağlık durumu
curl --cacert /etc/elasticsearch/certs/http_ca.crt
-u elastic:SIFRENIZ
https://localhost:9200/_cluster/health?pretty
# Node bilgisi
curl --cacert /etc/elasticsearch/certs/http_ca.crt
-u elastic:SIFRENIZ
https://localhost:9200/_nodes?pretty
Başarılı bir yanıtta şunu görmeli siniz:
{
"name" : "es-node-01",
"cluster_name" : "my-production-cluster",
"tagline" : "You Know, for Search"
}
Cluster health için green görmek istersiniz. Tek node kurulumunda yellow görmeniz normal, çünkü replica shard’ların atanacağı başka node yok.
Sistem Limitlerini Ayarlama
Elasticsearch yüksek performans için bazı sistem limitlerinin gevşetilmesini ister. Bu adımları atlarsanız servis uyarılarla dolu başlar:
# /etc/security/limits.conf dosyasına ekle
sudo tee -a /etc/security/limits.conf <<EOF
elasticsearch - nofile 65535
elasticsearch - nproc 4096
EOF
# Virtual memory alanını artır (mmap sayısı)
sudo sysctl -w vm.max_map_count=262144
# Kalıcı hale getir
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
vm.max_map_count ayarı özellikle önemli. Bu değer düşük olursa Elasticsearch başlamayı reddeder ve loglarda “max virtual memory areas vm.max_map_count [65530] is too low” hatası görürsünüz.
Güvenlik Yapılandırması
Elasticsearch 8.x ile birlikte güvenlik varsayılan olarak açık geliyor. Eski sürümlerde bu bir sıkıntıydı çünkü kimlik doğrulamasız açık bırakılan Elasticsearch sunucuları internetten veri çalınmasına yol açıyordu.
Elastic Kullanıcı Şifresini Sıfırlama
Kurulum sırasında gelen şifreyi kaybettiyseniz veya değiştirmek istiyorsanız:
# Elastic kullanıcı şifresini sıfırla
sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
# Kibana için sistem kullanıcısı şifresi
sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u kibana_system
# Logstash için
sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u logstash_system
TLS Sertifika Yönetimi
Üretim ortamında node’lar arası iletişim ve HTTP katmanı için TLS zorunlu. Elasticsearch bunu kolaylaştırmak için elasticsearch-certutil aracı sağlıyor:
# CA oluştur
sudo /usr/share/elasticsearch/bin/elasticsearch-certutil ca
--out /etc/elasticsearch/certs/elastic-stack-ca.p12
--pass ""
# Node sertifikası oluştur
sudo /usr/share/elasticsearch/bin/elasticsearch-certutil cert
--ca /etc/elasticsearch/certs/elastic-stack-ca.p12
--out /etc/elasticsearch/certs/elastic-certificates.p12
--pass ""
# Sertifika dosyasının sahipliğini düzenle
sudo chown elasticsearch:elasticsearch /etc/elasticsearch/certs/*.p12
Firewall Yapılandırması
# UFW kullanıyorsanız (Ubuntu)
sudo ufw allow from 192.168.1.0/24 to any port 9200
sudo ufw allow from 192.168.1.0/24 to any port 9300
sudo ufw reload
# firewalld kullanıyorsanız (RHEL/CentOS)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="9200" accept'
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="9300" accept'
sudo firewall-cmd --reload
9200 portu HTTP API portu, 9300 ise node’lar arası transport portu. Dışarıya yalnızca gerekli IP aralıklarını açın.
Index Ayarları ve Temel Optimizasyonlar
Cluster ayağa kalktıktan sonra default index şablonlarını yapılandırmak uzun vadede iş kolaylaştırır. Örneğin log index’leri için shard sayısını gereğinden fazla tutmak yaygın bir hatadır:
# Default index ayarlarını güncelle
curl --cacert /etc/elasticsearch/certs/http_ca.crt
-u elastic:SIFRENIZ
-X PUT "https://localhost:9200/_cluster/settings?pretty"
-H 'Content-Type: application/json'
-d '{
"persistent": {
"cluster.routing.allocation.disk.threshold_enabled": true,
"cluster.routing.allocation.disk.watermark.low": "85%",
"cluster.routing.allocation.disk.watermark.high": "90%",
"cluster.routing.allocation.disk.watermark.flood_stage": "95%"
}
}'
Bu ayarlar disk doluluk oranına göre shard allocation’ı yönetir:
- watermark.low (85%): Bu noktada yeni shard ataması durur
- watermark.high (90%): Mevcut shard’lar başka node’lara taşınmaya başlar
- watermark.flood_stage (95%): Index’ler read-only moduna geçer
Disk %95’i geçince Elasticsearch index’i otomatik olarak kilitler. Bu durumda hem diski temizlemeli hem de kilidi manuel açmalısınız, yoksa veri yazamazsınız.
Log Rotasyonu ve Disk Yönetimi
Elasticsearch log dosyaları hızla büyüyebilir. Logrotate ile bunu kontrol altına alın:
# /etc/logrotate.d/elasticsearch dosyasını incele/düzenle
cat /etc/logrotate.d/elasticsearch
Ayrıca ILM (Index Lifecycle Management) ile eski index’leri otomatik silebilir veya arşivleyebilirsiniz. Bu özellikle ELK Stack kullanımında kritik.
Performans İzleme
Cluster’ın sağlığını izlemek için temel API çağrıları:
# Tüm index'lerin listesi ve boyutları
curl --cacert /etc/elasticsearch/certs/http_ca.crt
-u elastic:SIFRENIZ
"https://localhost:9200/_cat/indices?v&s=store.size:desc"
# Node istatistikleri (bellek, CPU, disk)
curl --cacert /etc/elasticsearch/certs/http_ca.crt
-u elastic:SIFRENIZ
"https://localhost:9200/_cat/nodes?v&h=name,heap.percent,ram.percent,cpu,load_1m,disk.used_percent"
# Bekleyen shard'lar varsa
curl --cacert /etc/elasticsearch/certs/http_ca.crt
-u elastic:SIFRENIZ
"https://localhost:9200/_cluster/allocation/explain?pretty"
heap.percent değeri sürekli 75 üzerindeyse JVM heap’i artırmanız ya da cluster’a node eklemeniz gerekiyor demektir.
Sık Karşılaşılan Sorunlar ve Çözümleri
Servis başlamıyor: İlk kontrol noktası her zaman log dosyası olmalı.
sudo journalctl -u elasticsearch -f
# veya
sudo tail -f /var/log/elasticsearch/my-production-cluster.log
Cluster yellow durumda: Tek node kurulumunda normaldir. Ama üretimde birden fazla node varken yellow görüyorsanız, unassigned shard’lar var demektir.
Out of memory hatası: JVM heap değerlerini kontrol edin. jvm.options.d/heap.options dosyasındaki değerler sisteminizin RAM’iyle orantılı olmalı.
Bootstrap checks failed: network.host: 0.0.0.0 gibi production ayarlarını verdiğinizde Elasticsearch bootstrap check’leri devreye girer. Bu checkler vm.max_map_count, heap boyutu, file descriptor limitleri gibi şeyleri kontrol eder. Her uyarıyı dikkate alın.
Yedekleme Stratejisi
Snapshot API ile düzenli yedekleme yapın. Önce bir snapshot repository tanımlayın:
# Filesystem tabanlı repository oluştur
# Önce elasticsearch.yml'e path.repo eklenmiş olmalı:
# path.repo: ["/mnt/elasticsearch-snapshots"]
curl --cacert /etc/elasticsearch/certs/http_ca.crt
-u elastic:SIFRENIZ
-X PUT "https://localhost:9200/_snapshot/my_backup_repo?pretty"
-H 'Content-Type: application/json'
-d '{
"type": "fs",
"settings": {
"location": "/mnt/elasticsearch-snapshots",
"compress": true
}
}'
# Manuel snapshot al
curl --cacert /etc/elasticsearch/certs/http_ca.crt
-u elastic:SIFRENIZ
-X PUT "https://localhost:9200/_snapshot/my_backup_repo/snapshot_$(date +%Y%m%d)?wait_for_completion=true&pretty"
S3, GCS veya Azure Blob Storage kullanıyorsanız ilgili Elasticsearch plugin’ini kurmanız gerekir. Büyük ortamlarda nesne depolama çok daha pratik.
Sonuç
Elasticsearch kurulumu tek başına yeterli değil, asıl iş doğru yapılandırmada. Bu rehberde ele aldığımız başlıkları özetlemek gerekirse:
- Sisteme resmi repo üzerinden kurulum yapın, bağımlılık sorunlarından kaçınırsınız
- JVM heap değerlerini RAM’in yarısı kadar ve Xms/Xmx eşit olacak şekilde ayarlayın
vm.max_map_countve file descriptor limitlerini mutlaka yapılandırın- Elasticsearch 8.x’te güvenlik varsayılan açık geliyor, bunu kapatmayın
- Firewall ile erişimi kısıtlayın, 9200 portunu internete açmak veri ihlali demektir
- Disk watermark ayarlarını yapın ve ILM ile eski index’leri yönetin
- Snapshot ile düzenli yedekleme alın
Tek node kurulumdan sonraki adım genellikle Kibana’yı eklemek ve ardından Logstash ya da Beats ile veri göndermeye başlamaktır. ELK Stack’in tamamını ele aldığımız sonraki yazıda Kibana kurulumu ve Logstash pipeline yapılandırmasına geçeceğiz.
Sorularınız veya farklı bir distro üzerinde yaşadığınız sorunlar için yorumları kullanabilirsiniz.
