Merhaba! Bugün kurumsal ortamlarda en sık kullanılan Linux dağıtımlarından biri olan RHEL 7.9 (Red Hat Enterprise Linux) üzerinde, yüksek performanslı ve özelleştirilmiş bir Elasticsearch 8.1.3 Cluster kurulumunu ele alacağız.
Bu rehberde, varsayılan kurulumların dışına çıkarak; özel veri yolları, SSL’siz (HTTP) iletişim ve spesifik node rolleri ile gerçek bir üretim (production) senaryosu kurgulayacağız.
1. Hazırlık ve Network Arayüzü Tespiti
Bu rehberde, yüksek trafikli blog siteleri veya kurumsal veri analitiği ihtiyaçları için ideal olan, yüksek erişilebilir (High Availability) bir ELK Stack yapısı kuracağız. Sadece yazılımı yüklemekle kalmayacak, sistemin neden bu ayarlara ihtiyaç duyduğunu da öğreneceğiz.
1.1. Genel Bakış ve Mimari Planı
Kuracağımız yapı 2 adet Elasticsearch node’undan oluşacak. Bu iki sunucu birbiriyle sürekli iletişim halinde kalarak verilerinizin güvenliğini ve arama hızını garanti altına alacak.
| Sunucu Adı | IP Adresi | Rolü | İşletim Sistemi |
| oraclius-el1 | 150.150.150.150 | Master / Data Node | RHEL/Oracle Linux 7.9 |
| oraclius-el2 | 150.150.150.151 | Data Node | RHEL/Oracle Linux 7.9 |
Elasticsearch: Verilerimizin saklandığı ve arandığı ana motor.
Kibana: Verileri görselleştirdiğimiz ve kümemizi yönettiğimiz web arayüzü.
Logstash: Verileri toplayıp, işleyip Elasticsearch’e gönderen boru hattı.
1.2. Kullanılacak Yazılım Versiyonları ve Kaynaklar
Uyumsuzluk sorunlarını önlemek için tüm bileşenlerin aynı versiyon (8.1.3) olması kritik önem taşır. Bu rehberde kullanılan paketler resmi Elastic.co depolarından alınmıştır.
2. Kurulum Öncesi Sunucu Optimizasyonu (Production Ready)
Elasticsearch’ü kurmadan önce Linux işletim sistemine “Bu uygulama çok yoğun çalışacak, ona engel olma” dememiz gerekiyor. Bu ayarlar, gerçek bir üretim senaryosunda sistemin kilitlenmesini önleyen hayati dokunuşlardır.
Önemli: Bu adımların tamamı hem Node-1 (150.150.150.150) hem de Node-2 (150.150.150.151) sunucularında uygulanmalıdır.
2.1. Ağ Arayüzü ve IP Sabitleme
Üretim ortamında sunucuların IP adreslerinin değişmemesi gerekir. Ayrıca Elasticsearch konfigürasyonunda kullanmak üzere IP’nizin bağlı olduğu arayüz ismini bilmelisiniz.
# IP adresinizin hangi arayüzde (ens192, ens33 vb.) olduğunu kontrol edin:
ip a | grep "150.150.150" -B2
Çıktıda inet 150.150.150.x satırının üzerindeki ismi (örneğin: ens192) not alın.
Linux Seviyesinde IPv6’yı Geçici Olarak Kapat (Opsiyonel ama Garanti)
Bash
sysctl -w net.ipv6.conf.all.disable_ipv6=1
sysctl -w net.ipv6.conf.default.disable_ipv6=1
Şu adımları takip ederek IPv6’yı kalıcı olarak devre dışı bırakabilirsin: /etc/sysctl.conf
sudo bash -c 'cat << EOF >> /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
EOF'
Dosyaya yazdıktan sonra ayarların hemen okunması için şu komutu çalıştır:
sudo sysctl -p
2.2. Sanal Bellek Limiti (vm.max_map_count)
Neden 262144? Elasticsearch, verileri diskten çok hızlı okumak için “mmap” (memory map) denilen bir yöntem kullanır. Her bir veri parçası (shard) için işletim sisteminden bir “harita” alanı ister.
- Varsayılan Değer: Çoğu Linux sisteminde bu limit 65530‘dur.
- Neden Artırıyoruz? Elasticsearch büyüdükçe bu harita alanları yetmez ve sistem “Out of Memory” (Bellek Yetersiz) hatası vererek çöker. 262144, Elastic mühendislerinin stabil bir çalışma için belirlediği “alt sınır” değeridir.
# Değeri kalıcı olarak sisteme işle
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
# Değişikliği hemen aktif et
sysctl -p
2.3. Dosya ve Bellek Limitleri (limits.conf)
Linux, güvenliği sağlamak için bir uygulamanın aynı anda kaç dosya açabileceğini veya ne kadar RAM “kilitleyebileceğini” kısıtlar.
- nofile (Number of Open Files): Elasticsearch binlerce küçük veri dosyasıyla çalışır. Standart limit olan 1024, yoğun kullanımda sistemin kilitlenmesine neden olur. Biz bunu 65535 yaparak yolu açıyoruz.
- memlock (Memory Lock): İşletim sistemi bazen RAM’deki veriyi boşaltıp diske (Swap) yazar. Bu, Elasticsearch için “felaket” demektir çünkü disk RAM’den binlerce kat yavaştır.
unlimiteddiyerek sistemin Elasticsearch’ün RAM’ine dokunmasını yasaklıyoruz.
cat <<EOF >> /etc/security/limits.conf
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
elasticsearch soft nofile 65535
elasticsearch hard nofile 65535
EOF
2.4. Swap (Takas Alanı) Neden Kapatılmalı?
Soru: “Bilgisayarım hızlansın diye swap açmaz mıyız?” Cevap: Normal bilgisayarda evet, ama Elasticsearch gibi devasa verileri RAM’de tutan sistemlerde hayır. Elasticsearch, ihtiyacı olan verinin RAM’de olduğunu varsayar. İşletim sistemi bu veriyi çaktırmadan diske (swap) taşırsa, Elasticsearch o veriye ulaşmaya çalıştığında sistem donar. Bu yüzden swapoff -a komutuyla bunu engelliyoruz.
# Swap'ı anlık olarak kapat:
swapoff -a
# Kalıcı hale getirmek için /etc/fstab içindeki swap satırını bulup başına # ekleyin:
vi /etc/fstab
2.5. Disk Yapısı Hazırlığı
Verilerin /var/lib/elasticsearch (sistem diski) yerine ayrı bir /data dizininde tutulması, ileride disk yetmediğinde sistemi bozmadan yeni bir disk eklemenizi sağlar.
# Veri ve Log klasörlerini oluştur
mkdir -p /data/elasticsearch/data
mkdir -p /data/elasticsearch/logs
2.6. Systemd Servis Optimizasyonu (Memory Lock İçin)
Belleği kilitlemek (memlock) sadece limits.conf ile bitmez. Linux servis yöneticisine (systemd) bu yetkiyi özel olarak vermeliyiz. Bu adım genellikle atlanır ve en çok hata buradan çıkar.
Henüz Elasticsearch yüklü olmadığı için bu dosyayı şimdi oluşturamayabiliriz, ancak yüklemeden hemen sonra yapacağımız ilk iş bu olacak.
3. Adım: Elasticsearch 8.1.3 Kurulumu ve “Cluster” Yapılandırması
Sunucularımızı optimize ettik. Şimdi ana motorumuzu kurma ve iki sunucuyu birbiriyle konuşturma vakti. Bu bölümde yapacağımız ayarlar, sistemi SSL karmaşasından kurtarıp doğrudan veri işlemeye odaklanmasını sağlayacak.
3.1. Elasticsearch Yazılımının Sunuculara Yüklenmesi
Bu adımı her iki sunucuda da (Node-1 ve Node-2) sırayla yapın.
sudo rpm -ivh elasticsearch-8.1.3-x86_64.rpm
3.2. Dosya Yetkilerinin Verilmesi (Çok Kritik!)
Bölüm 2’de oluşturduğumuz /data klasörleri şu an “root” kullanıcısına ait. Ancak Elasticsearch kendi kullanıcısıyla (elasticsearch) çalışır. Eğer yetki vermezsek servis başlamaz ve “Permission Denied” hatası alırsınız.
Her iki sunucuda çalıştırın:
# Veri ve Log klasörlerinin anahtarını Elasticsearch'e teslim ediyoruz
chown -R elasticsearch:elasticsearch /data/elasticsearch
3.3. Node-1 (Master) Yapılandırması (150.150.150.150)
Şimdi ilk sunucumuzu “Yönetici (Master)” olarak tanımlayacağız. /etc/elasticsearch/elasticsearch.yml dosyasını düzenleyeceğiz.
İpucu: Dosyadaki her şeyi silip aşağıdaki temiz yapılandırmayı yapıştırabilirsiniz.
cat <<EOF >> cat /etc/elasticsearch/elasticsearch.yml
# --- CLUSTER VE NODE AYARLARI ---
cluster.name: elastic-cluster
node.name: elastic1 # (Node-2'de bunu elastic2 yapmayı unutma)
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/logs
bootstrap.memory_lock: true
# --- AĞ AYARLARI (Dış erişim için en temiz hali) ---
network.host: 0.0.0.0
http.host: [_local_, _ens34_]
transport.host: [_local_, _ens34_]
# Port ayarlarını sabitleyelim
http.port: 9200
transport.port: 9300
# --- GÜVENLİK AYARLARI (HTTP Modu) ---
xpack.security.enabled: false
xpack.security.enrollment.enabled: false
xpack.security.http.ssl.enabled: false
xpack.security.transport.ssl.enabled: false
# --- PERFORMANS ARTTIRICI PARAMETRELER ---
# RAM'in ne kadarının indeksleme işlemine ayrılacağını belirler (Varsayılan %10'dur, biz %20 yapıyoruz)
indices.memory.index_buffer_size: 20%
# Sorgular sırasında RAM şişmesini önleyen koruma ayarı
indices.breaker.total.use_real_memory: true
indices.fielddata.cache.size: 40%
# Disk doluluk oranlarını yönetelim (Disk %90 dolunca veri yazmayı keser)
cluster.routing.allocation.disk.threshold_enabled: true
cluster.routing.allocation.disk.watermark.low: "85%"
cluster.routing.allocation.disk.watermark.high: "90%"
# --- CLUSTER YÖNETİMİ ---
# Node-1'de bu ismi yazın:
cluster.initial_master_nodes: ["elastic1"]
# Node Rolleri ( viewer silindi, doğru roller eklendi)
node.roles: [ master, data, ingest, remote_cluster_client ]
# --- DİĞER ---
http.max_content_length: 500mb
EOF
3.4. Node-2 (Data) Yapılandırması (150.150.150.151)
İkinci sunucumuz verileri depolayacak. Yapılandırma çok benzer ama ufak farklar var.
cat <<EOF >> cat /etc/elasticsearch/elasticsearch.yml
cluster.name: elastic-cluster
node.name: elastic2
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/logs
bootstrap.memory_lock: true
network.host: 0.0.0.0
http.port: 9200
transport.port: 9300
http.host: [_local_, _ens34_]
transport.host: [_local_, _ens34_]
discovery.seed_hosts: ["150.150.150.150:9300"]
xpack.security.enabled: false
xpack.security.http.ssl.enabled: false
xpack.security.transport.ssl.enabled: false
indices.memory.index_buffer_size: 20%
indices.breaker.total.use_real_memory: true
indices.fielddata.cache.size: 40%
http.max_content_length: 500mb
node.roles: [ data, ingest, remote_cluster_client ]
EOF
3.5. Bellek (RAM) Kilidi İçin Son Dokunuş
Bölüm 2’de konuştuğumuz “Memory Lock” olayının tam çalışması için servis dosyasını düzenlemeliyiz.
Her iki sunucuda yapın:
systemctl edit elasticsearchkomutunu yazın.- Açılan boş ekrana şunu yapıştırın ve kaydedip çıkın (Ctrl+O, Enter, Ctrl+X):
3.6. Servisleri Başlatma ve “Merhaba” Testi
Her şey hazır! Şimdi motorları çalıştıralım.
# Önce Node-1'de, sonra Node-2'de çalıştırın:
systemctl daemon-reload
systemctl enable elasticsearch
systemctl start elasticsearch
Nasıl Kontrol Ederim? Tarayıcınızdan veya terminalden şu adrese gidin: http://150.150.150.150:9200/_cluster/health?pretty
Eğer ekranda şunları görüyorsanız başardınız:
"status": "green"veya"yellow"(2 node’da yeşil olması beklenir)."number_of_nodes": 2(İki sunucu el sıkışmış demektir).
curl -X GET "http://150.150.150.150:9200/"
{
"name" : "elastic1",
"cluster_name" : "elastic-cluster",
"cluster_uuid" : "grVC1yn_SvmOj9oDC_9knQ",
"version" : {
"number" : "8.1.3",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "39afaa3c0fe7db4869a161985e240bd7182d7a07",
"build_date" : "2022-04-19T08:13:25.444693396Z",
"build_snapshot" : false,
"lucene_version" : "9.0.0",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
http://150.150.150.150:9200/_cluster/health?pretty
>>
cluster_name "elastic-cluster"
status "green"
timed_out false
number_of_nodes 2
number_of_data_nodes 2
active_primary_shards 1
active_shards 2
relocating_shards 0
initializing_shards 0
unassigned_shards 0
delayed_unassigned_shards 0
number_of_pending_tasks 0
number_of_in_flight_fetch 0
task_max_waiting_in_queue_millis 0
active_shards_percent_as_number 100
Bölüm 4: Kibana 8.1.3 Kurulumu ve Yapılandırması
Elasticsearch’ü “kasa” olarak düşünürsek, Kibana onun “ekranı” ve “klavyesi”dir.
4.1. Kibana Paketinin Kurulması
Sadece Node-1 terminalinde şu komutları çalıştır:
# Paketi yükleyelim
sudo rpm -ivh kibana-8.1.3-x86_64.rpm
4.2. Kibana Yapılandırması (kibana.yml)
Senin Elasticsearch’te kullandığın “SSL’siz ve Şifresiz” yapıya uygun olarak Kibana’yı ayarlayalım.
Node-1‘de şu komutu çalıştırarak dosyayı en güncel ve hatasız haliyle oluşturalım:
cat <<EOF >> cat /etc/kibana/kibana.yml
server.port: 5601
server.host: "0.0.0.0"
server.name: "blog-kibana"
server.publicBaseUrl: "http://150.150.150.150:5601"
elasticsearch.hosts: ["http://150.150.150.150:9200"]
elasticsearch.requestTimeout: 300000
elasticsearch.shardTimeout: 120000
logging:
appenders:
file:
type: file
fileName: /var/log/kibana/kibana.log
layout:
type: json
default:
type: console
layout:
type: pattern
server.compression.enabled: true
i18n.locale: "en"
xpack.monitoring.ui.container.elasticsearch.enabled: true
EOF
4.3. Servisi Başlatma
Kibana varsayılan olarak 5601 portunu kullanır.
# Kibana servisini başlatalım
systemctl daemon-reload
systemctl enable kibana
systemctl start kibana
4.4. Arayüze İlk Giriş (Test)
Kibana’nın ayağa kalkması 1-2 dakika sürebilir. Servis başladıktan sonra kendi bilgisayarındaki tarayıcıyı (Chrome/Firefox) aç ve şunu yaz:
http://150.150.150.150:5601
Görmen Gereken: Herhangi bir şifre sormadan doğrudan Kibana’nın ana sayfasının (Welcome to Elastic) açılması.
5: Logstash 8.1.3 Kurulumu ve Veri Hattı (Pipeline) Oluşturma
Logstash, farklı kaynaklardan gelen karmaşık verileri toplar, dönüştürür ve Elasticsearch’e düzenli bir şekilde nakleder. Bu bölüm, blog projenin veriyi işleme mutfağıdır.
5.1. Logstash Kurulumu (Node-1)
Logstash’i genellikle Kibana ile aynı sunucuya (Node-1) kurmak yönetim kolaylığı sağlar.
# Paketi yükleyelim
sudo rpm -ivh logstash-8.1.3-x86_64.rpm
5.2. Logstash Performans ve Sistem Ayarları
Logstash bir Java uygulamasıdır ve bellek (RAM) kullanımı kritiktir. Küçük/Orta ölçekli bir blog projesi için varsayılan 1GB RAM ayarı yeterlidir, ancak sunucun kısıtlıysa bunu optimize etmelisin.
JVM Ayarı: /etc/logstash/jvm.options dosyasında -Xms1g ve -Xmx1g değerlerini sunucunun yarısı kadar (veya başlangıç için 512mb) ayarlayabilirsin.
cat /etc/logstash/jvm.options |grep "Xm"
# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space
-Xms1g
-Xmx1g
5.3. İlk Pipeline (Veri Akış Hattı) Oluşturma
Logstash’in çalışması için bir Konfigürasyon Dosyası gerekir. Bu dosya 3 ana bölümden oluşur: Input (Giriş), Filter (Filtre/Düzenleme) ve Output (Çıkış).
/etc/logstash/conf.d/logstash-blog.conf adında bir dosya oluşturalım:
cat <<EOF > /etc/logstash/conf.d/logstash-blog.conf
input {
beats {
port => 5044
}
tcp {
port => 5000
codec => json
}
}
filter {
# Filtreler buraya gelecek
}
output {
elasticsearch {
hosts => ["http://150.150.150.150:9200"]
index => "blog-loglari-%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug }
}
EOF
5.4. Logstash Servisini Başlatma
# Servisi aktif et ve başlat
systemctl daemon-reload
systemctl enable logstash
systemctl start logstash







%s için bir yanıt yazın