Ana içeriğe geç

Elasticsearch 8.17.10 Cluster'a Yeni Node Ekleme

Bu doküman, yeni sunucularda Elasticsearch'ün kurulum dokümanına göre zaten kurulduğu varsayımıyla, çalışan bir ApinizerEsCluster kümesine yeni node eklemek için yapılması gerekenleri anlatır.

Önce Neden Node Eklediğinizi Belirleyin

Node eklemenin iki farklı amacı vardır; bunları karıştırmayın:

1. Kapasite (yatay büyüme): Disk doldu, daha fazla depolama gerekiyor. Çözüm data node eklemektir (node.roles: ["data"]). Master eklemeye gerek yoktur. Disk her dolduğunda yeni data node ekleyerek büyürsünüz.

2. High Availability (arızaya dayanıklılık): Cluster'ı yöneten aktif bir master node vardır; bu node çökerse ve yerine yenisi seçilemezse tüm cluster durur. H.A., master çökse bile geriye kalan node'ların otomatik olarak yeni master seçip cluster'ı ayakta tutmasıdır. Bunun için master-eligible node sayısı tek ve en az 3 olmalıdır. Çözüm master node eklemektir. (Master node veri tutmaz, diski rahatlatmaz.)

Buna göre iki tipik durum:

  • Kurum henüz H.A. değil, H.A.'ya geçecek: master sayısı 3'e çıkarılır (master eklenir). Küçük/orta cluster'da en pratik yol: 3 node, hepsi ["master","data"].
  • Zaten H.A. var (3 master), yalnızca depolama gerekiyor: yalnızca data node eklenir. Master sayısı artırılmaz; 3 yeterlidir ve tek sayı kalmalıdır.

1) High Availability İçin Kaç Node Gerekir?

Elasticsearch'te iki ayrı yüksek erişilebilirlik vardır ve ikisi birlikte sağlanmalıdır.

a) Master H.A. (cluster yönetiminin ayakta kalması)

Master seçimi çoğunluk (quorum) ile çalışır: quorum = (master-eligible sayısı / 2) + 1.

TopolojiMaster-eligibleH.A.
1 node1❌ Tek nokta arıza
1 master + 2 data1❌ Master hâlâ tek nokta arıza
2 master2❌ Biri düşerse cluster durur (split-brain riski)
3 node (hepsi master+data)3✅ Bir node kaybına dayanır — minimum H.A.
3 master + N data3✅ Büyük cluster için

Kural: master-eligible node sayısı tek ve en az 3 olmalıdır. "1 master + 2 data" master tarafında H.A. sağlamaz.

b) Veri H.A. (bir data node düşse de verinin kaybolmaması)

Bunun için index'lerde replica ≥ 1 ve en az 2 data node gerekir; böylece her shard'ın kopyası farklı bir node'da tutulur.

Best Practice
  • Küçük/orta cluster: 3 node, hepsi ["master","data"]. Hem 3 master quorum'u hem veri yedeği tek seferde sağlanır. En pratik H.A. budur.
  • Büyük cluster: 3 ayrı (dedicated) master ["master"] + ihtiyaç kadar data node ["data"]. Böylece ağır sorgu/veri yükü master seçimini etkilemez.

2) Farklı VLAN'da veya Arada Load Balancer / NAT Varsa

uyarı
  • Master node'ların hepsi ana site'ta, aynı VLAN'da (düşük gecikmeli ağda) olmalıdır. Master seçimi gecikmeye çok duyarlıdır. Farklı VLAN'daki veya arada load balancer/NAT bulunan bir node'a master rolü verilmez; bu tür node'lar her zaman node.roles: ["data"] olmalıdır.
  • Load balancer yalnızca HTTP (9200) istemci trafiği içindir. Node'lar arası transport (9300) trafiği load balancer arkasına alınmaz; doğrudan node'ların gerçek IP'leri üzerinden gider. Bu yüzden discovery.seed_hosts'a VIP/LB adresi değil, master node'ların gerçek IP'leri yazılır.
  • Farklı VLAN'da güvenlik duvarı 9300 portunu çift yönlü geçirmelidir; istemciler farklı ağdaysa 9200 de açık olmalıdır.
  • NAT arkasındaysa node, dışarıdan ulaşılabilen adresi ilan etmelidir: transport.publish_host / transport.publish_port. Aksi halde cluster'a katılsa bile diğer node'lar ona bağlanamaz.

Özet: Ana site'ta aynı VLAN'daki node'lar ["master","data"] (veya ayrık) olabilir; farklı VLAN / LB / NAT arkasındaki node'lar yalnızca ["data"].


Kurulumdan Farklı 3 Nokta

Node ekleme bir katılımdır, ilk kurulum değildir. Bu yüzden yeni node'da kurulum dokümanındaki üç adım atlanır:

  1. Sertifika üretilmez, mevcut node'dan kopyalanır (certutil çalıştırılmaz).
  2. elasticsearch-setup-passwords çalıştırılmaz (built-in kullanıcılar cluster'da zaten mevcuttur).
  3. cluster.initial_master_nodes ve discovery.type: single-node yeni node'a yazılmaz.
uyarı

Yeni node'lar ile master node'lar arasında 9200 (HTTP) ve 9300 (transport) portları çift yönlü açık olmalıdır.

3) Sertifikaların Kopyalanması

Sertifika üretilmez, kopyalanır

Kurulum dokümanındaki elasticsearch-certutil komutları çalıştırılmaz. Cluster'daki tüm node'lar aynı sertifikayı paylaşır. Mevcut node'daki sertifika dosyaları yeni node'a aynı yola kopyalanır.

# 1) Yeni node'da certs dizini oluşturulur
mkdir -p /opt/elasticsearch/elasticsearch-8.17.10/config/certs/
# 2) Mevcut (primary) node üzerinde çalıştırılır; sertifikalar yeni node'a kopyalanır
scp /opt/elasticsearch/elasticsearch-8.17.10/config/certs/elastic-certificates.p12 \
elasticsearch@<YENI_NODE_IP>:/opt/elasticsearch/elasticsearch-8.17.10/config/certs/

scp /opt/elasticsearch/elasticsearch-8.17.10/config/certs/elastic-stack-ca.p12 \
elasticsearch@<YENI_NODE_IP>:/opt/elasticsearch/elasticsearch-8.17.10/config/certs/

scp /opt/elasticsearch/elasticsearch-8.17.10/config/certs/elastic-certificates.crt \
elasticsearch@<YENI_NODE_IP>:/opt/elasticsearch/elasticsearch-8.17.10/config/certs/
# 3) Yeni node'da izinler düzenlenir
sudo chown -Rf elasticsearch:elasticsearch /opt/elasticsearch/elasticsearch-8.17.10/config/certs
sudo chmod -Rf 775 /opt/elasticsearch/elasticsearch-8.17.10/config/certs

4) Yeni Node'un elasticsearch.yml Ayarı

Yalnızca yeni node'da aşağıdaki yapılandırma uygulanır.

sudo vi /opt/elasticsearch/elasticsearch-8.17.10/config/elasticsearch.yml
cluster.name: ApinizerEsCluster
node.name: "<YENI_NODE_IP>"
network.host: "0.0.0.0"
http.port: 9200

# Ana site master için: node.roles: ["master","data"] (veya ["master"])
# Data / uzak node için: node.roles: ["data"]
node.roles: ["data"]

# Cluster'daki master node'ların IP'leri yazılır
discovery.seed_hosts: ["<MASTER_NODE_IP>:9300"]

# cluster.initial_master_nodes ve discovery.type: single-node YAZILMAZ

path.data: /data/elastic-data/
path.repo: ["/data/elastic-snapdata"]

# Security
xpack.security.enabled: true
xpack.security.enrollment.enabled: true

# HTTP SSL
xpack.security.http.ssl:
enabled: true
keystore.path: certs/elastic-certificates.p12
truststore.path: certs/elastic-certificates.p12

# Transport SSL
xpack.security.transport.ssl:
enabled: true
verification_mode: certificate
keystore.path: certs/elastic-certificates.p12
truststore.path: certs/elastic-certificates.p12

# CORS ayarları
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-methods: OPTIONS, HEAD, GET, POST, PUT, DELETE
http.cors.allow-headers: X-Requested-With, X-Auth-Token, Content-Type, Content-Length
discovery.seed_hosts'a hangi IP'ler yazılır?

Bu liste, yeni node'un cluster'ı bulmak için ilk temas kuracağı adreslerdir. Keşif master-eligible node'lar üzerinden yürüdüğü için buraya master node'ların IP'leri yazılır, data node'ların değil.

Cluster'da birden fazla master varsa hepsi listelenir; yalnızca tek master yazılırsa o node kapalıyken yeni node cluster'a katılamaz.

Port belirtmek zorunlu değildir (varsayılan transport portu 9300'dür), ancak "<IP>:9300" biçiminde yazmak nettir.

network.host neden 0.0.0.0?

network.host alanına node'un kendi IP'si yazıldığında Elasticsearch yalnızca o adreste dinlemeye çalışır. Adres sunucuda tanımlı değilse veya trafik başka bir arayüzden geliyorsa, servis BindException: Cannot assign requested address hatasıyla başlamaz.

0.0.0.0 verildiğinde tüm arayüzlerde dinlenir ve bu sorun oluşmaz. Node'ların birbirine ilan ettiği adresi (publish address) sabitlemek isterseniz:

network.bind_host: 0.0.0.0
network.publish_host: "<YENI_NODE_IP>"

Başlangıç loglarında publish_address {<IP>:9300}, bound_addresses {0.0.0.0:9300} satırıyla doğrulayabilirsiniz.

bilgi

jvm.options dosyasında heap değeri, sunucunun RAM'inin yarısına kadar çıkabilir ve 32 GB'ı aşmamalıdır.

sudo vi /opt/elasticsearch/elasticsearch-8.17.10/config/jvm.options
-Xms16g
-Xmx16g

5) Master Node'da Değişiklik Gerekmez

Master node'a dokunulmaz, restart edilmez

Keşif tek yönlü çalışır: yeni node, discovery.seed_hosts üzerinden master'a ulaşır ve cluster'a katılma isteği gönderir. Master'ın yeni node'u önceden tanıması gerekmez.

Bu nedenle yeni bir data node eklerken:

  • Master'ın discovery.seed_hosts listesine yeni data node eklenmez (gereksizdir).
  • Master node yeniden başlatılmaz.

Master'ın seed_hosts listesi yalnızca master node'ları içermelidir.

İstisna: Yeni bir MASTER node ekliyorsanız

Yukarıdaki kural yalnızca data node eklerken geçerlidir. Cluster'a yeni bir master-eligible node eklendiğinde, master'lar birbirini keşfedebilmelidir. Bu nedenle tüm master node'ların discovery.seed_hosts listesine tüm master'ların IP'leri yazılmalıdır (yeni master dahil).

Örneğin 3 master'lı bir yapıda her master'ın seed_hosts listesi şöyle olur:

discovery.seed_hosts: ["<MASTER_1_IP>:9300", "<MASTER_2_IP>:9300", "<MASTER_3_IP>:9300"]

Bu değişikliğin geçerli olması için ilgili master node'lar sırayla (biri tamamen ayağa kalkıp cluster'a katıldıktan sonra diğeri) yeniden başlatılır. Data node'lar bu listeye eklenmez.

Mevcut master'daki cluster.initial_master_nodes silinmeli mi?

Bu ayar yalnızca cluster ilk kez sıfırdan kurulurken (bootstrap) devreye girer. Cluster oluştuktan sonra Elasticsearch bu satırı yok sayar; voting configuration bilgisini diskteki cluster state'ten okur. Dolayısıyla config'de kalması mevcut çalışan cluster'a zarar vermez.

Yine de silinmesi önerilir. Sebebi: ileride o node'un path.data dizini silinir veya node sıfırdan kurulursa, bu satır hâlâ oradaysa node mevcut cluster'a katılmak yerine yeni ve ayrı bir cluster bootstrap eder.

Silmek için restart gerekmez; değişiklik bir sonraki başlatmada geçerli olur.

# cluster.initial_master_nodes: ["<MASTER_NODE_IP>"] <-- silinir

6) Yeni Node'un Başlatılması

sudo systemctl daemon-reload
sudo systemctl start elasticsearch
sudo systemctl enable elasticsearch
sudo systemctl status elasticsearch
uyarı

elasticsearch-setup-passwords çalıştırılmaz. Built-in kullanıcılar (elastic, kibana vb.) cluster'da zaten mevcuttur; bu komutu yeni node'da çalıştırmak mevcut şifreleri bozar.

7) Doğrulama

Yeni node başlatıldıktan sonra, hiçbir node yeniden başlatılmadan master üzerinden kontrol edilir:

curl -k -u elastic "https://<MASTER_NODE_IP>:9200/_cat/nodes?v"

Örnek çıktı (1 master+data, 2 data node):

ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
<DATA_NODE_2_IP> 12 63 1 0.01 0.14 0.22 d - <DATA_NODE_2_IP>
<DATA_NODE_1_IP> 6 98 1 0.06 0.07 0.26 d - <DATA_NODE_1_IP>
<MASTER_NODE_IP> 53 30 2 0.16 0.09 0.07 dm * <MASTER_NODE_IP>

node.role sütununda d data, m master-eligible anlamına gelir. master sütunundaki * aktif master'ı gösterir.

Yeni node listede görünmüyorsa logu inceleyin:

sudo journalctl -u elasticsearch -f

Bağlantı kurulamıyorsa discovery.seed_hosts IP'si, 9300 portu ve sertifika kontrol edilir.