Elasticsearch Shard ve Replica Kavramları

Elasticsearch’de dökümanlar index adı verilen yapılarda tutulur. İndexlerin dağıtık mimaride birden çok parçaya bölünerek saklanmasını sağlayan yapılara ise shard denir. Farklı node’lar üzerinde tutulan shardların her birinin de primary ve replicası vardır. Primary shard datanın orijinal halini tutarken; replica shard ise bir node hatası durumuna karşı verinin yedekliliğini sağlar. Primary ve replica shard’lar farklı node’lar üzerinde tutulur. Primary shard read write işlemleri için kullanılırken, replica shardlar read işlemleri ve primary’nin fail olması durumlarında kullanılır.

Elasticsearch’in önceki sürümlerinde bir index create edildiğinde default olarak 5primary ve 5 replica shard oluşturulurdu. Son sürümlerde ise bu default değer 1 primary ve 1 replica shard olarak değişmiş durumda. Shard sayısı ise temel olarak data büyüklüğüne bağlıdır.  Var olan indexlerin shard sayısı değiştirilebilir ancak bu işlem bir down time gerektirir. Reindex adı verilen bir operasyon ile bu işlem gerçekleştirilir.

Shard ve replica sayısı bir index yaratılırken aş.şekilde belirtilir;


PUT /my-index-000001
{
  “settings”: {
 “index”: {
      “number_of_shards”: 3, 
      “number_of_replicas”: 2

    }
  }
}

Shard Size Optimizasyonu;

Primary shardların sayısı bir index yaratıldığı zaman belirlenir, replica  shard sayısı ise istenildiği zaman değiştirilebilir.

  1. Optimum shard size 20GB – 40GB aralığında olmalıdır.
  2. Bir node üzerinde tutulabilecek shard sayısı heap size ile bağlantılıdır. Her 1 GB’lık heap alanı için node üzerinde tutulan shard sayısı 20’den az olmalıdır.

Bir index oluşturulduktan sonra data büyümesine paralel olarak zamanla shard size’ı artacağı için zamanla performans sorunları yaşatabilir. Bunun haricinde çok fazla küçük boyutlu shard’a bölünmesi durumunda da sorgular cok fazla kücük ve paralel processlere bölüneceği için kaynak kullanımının artmasına ve search işlemlerinde yavaşlığa sebep olacaktır.

Örneğin; Clusterdaki 10’ar GB’lık 3 node olduğunu varsayalım, 12 GB boyutunda 1 primary shardı olan bir index depolarken; Normalde bu cluster maksimum 30 GB – 1 replica olduğunu düşünürsek 15 GB’lık bir indexi store edebilir. Ancak örnekteki 12 GB’lık indexi 1 shard ve shard boyutunun da 12 GB olmasından dolayı 3 node’un herhangi birine sığdıramayacaktır.  Bu durumun önüne geçmek için index 2 shard’a bölünmelidir. Böylece 6’şar GB’lık shardlar 10GB’lık node disklerinde store edilebilecektir.

Bir indexin mevcut shardlarını görmek için aşağıdaki komutlar kullanılabilir;

GET /_cat/shards/<target>
GET /_cat/shards

veya curl ile;

curl -X GET “localhost:9200/_cat/shards?pretty”

Unassign shard’ları ve sebebini görmek için;

GET _cat/shards?h=index,shard,prirep,state,unassigned.reason

Shard Allocation

Shard allocation, shardların nodelar üzerine dağıtılması/bölüştürülmesi işlemidir. Bu process initial recovery, replica allocation, rebalancing ve clustera node ekleme node çıkarma işlemleri sırasında çalışabilir. Master node’un en önemli görevlerinden biri, hangi shard’ın hangi node üzerinde tutulacağına karar vermektir.  Shard allocation Process’in kontrolü için aşağıdaki gibi ayarlar bulunmaktadır;

Cluster-level shard allocation settings : Allocation ve Rebalancing işlemlerini kontrol eder.
Disk based allocation settings : Kullanılabilir disk alanının Elasticsearch tarafından nasıl hesaplandığı ve ilgili ayarları yönetir.
Shard allocation awareness ve Forced awareness : Shardların farklı zone ve rack’lara nasıl dağıtılacağını kontrol eder.
Cluster-level shard allocation filtering : Node veya node gruplarının allaction işleminden hariç tutulmasına izin verir.

Cluster Level Shard Allocation Settings

Shard allocation ve recovery işlemlerini kontrol altında tutmak için aş. ayarlar kullanılır.

cluster.routing.allocation.enable : Shard türlerine göre allaction işleminin ayarlanmasını sağlar.

  • all – (default) Tüm shard tipleri için allocation işlemine izin verir. 
  • primaries – Sadece primary shardlar için allocation işlemine izin verir.
  • new_primaries – Sadece yeni indexlerin primary shardları için allocationa izin verir.
  • none – Hiçbir shard’ın allocate edilmesine izin vermez.

Shard Recovery sunucular üzerinde bir yük yaratacağı için aşağıdaki parametreler dikkatli ayarlanmalıdır. Bu parametreler ile bir node üzerinde aynı anda recover edilecek(incoming/outgoing) shard sayıları belirlenebilir. Bu parametrelerin default değeri 2’dir. 

cluster.routing.allocation.node_concurrent_incoming_recoveries : Aynı anda recover edilebilecek Incoming shard sayısı. 
cluster.routing.allocation.node_concurrent_outgoing_recoveries : Aynı anda recover edilebilecek outgoing shard sayısı.
cluster.routing.allocation.node_concurrent_recoveries : Yukarıdaki iki parametrenin aynı anda aynı değere set edilmesi için kısayol olarak kullanılan bir parametredir. Default değeri 2’dir.

Shard Rebalancing Settings

Bütün node’ları üzerinde aynı sayıda shard olan clusterlar balanced durumdadır. Elasticsearch otomatik olarak çalıştırdığı rebalancing processi ile shardların node’lar arasında taşınmasını sağlar. Rebalancing process’i diğer parametrelerle tanımlanan shard allocation rule’larına uyarak mümkün olduğu kadar balanced duruma getirir cluster’ı. 

cluster.routing.rebalance.enable : Shard türlerine göre rebalancing işleminin ayarlanmasını sağlar.

  • all – (default) Bütün shardlar için rebalance işlemine izin verir.
  • primaries – Sadece primary shardlar için rebalance işlemine izin verir.
  • replicas – Sadece replica shardlar için rebalance işlemine izin verir.
  • none – Hiçbir shard için rebalance işlemine izin vermez.

cluster.routing.allocation.cluster_concurrent_rebalance : Recovery işleminde olduğu gibi rebalance işlemi için de rebalance edilecek  concurrent shard sayısı bu parametre ile belirlenir. Default’u 2’dir.

Rebalance işlemi her node’un allocate ettiği shard sayısını baz alan bir weight değerine göre çalışır. 

  • Weight değeri yüksek olan node’lardan Weight değeri daha düşük olan node’lara shard taşıma işlemleri yapılır. Weight değerleri birbirine yaklaştığı zaman cluster balanced bir cluster olduğundan rebalancing işlemi yapılmaz.

Aşağıdaki parametreler ile weight değerinin kontrolü sağlanabilir.

cluster.routing.allocation.balance.shard : Bir node üzerinde allocate edilebilecek shard sayısı için weight factor değerini belirtir. Default değeri 0.45f. Bunu arttırmak clusterda node’lar arasında shard sayılarını eşitleme eğilimini arttırır.
cluster.routing.allocation.balance.index : : Bir node üzerinde allocate edilebilecek index  sayısı için weight factor değerini belirtir. Default değeri 0.55f. Bunu arttırmak clusterda node’lar arasında index sayılarını eşitleme eğilimini arttırır.

Disk-based Shard Allocation Settings

Disk based shard allocation sayesinde yeterince boş alanı olan disklerin gereğinden fazla shard taşıması yapmasının önüne geçilir. Shardları disk size’larına göre high watermark ve low watermark adı verilen disk size limitlerine göre dağıtır.Temel amaç disk üzerinde depolanan shardların size’ının high watermark değerini geçmemesidir. Kısa süreli watermark aşımlarında ise hemen shardların diğer node’lara taşınması sağlanır.

Low watermark’ı geçen node’larda yeni shardlar locate edilmesine izin verilmez. Flood stage değerini geçen node’larda ise elasticsearch index’e yazma işlemini tamamen bloklar.

Watermark değerleri ayarlanırken % veya GB cinsinden kesin bir değer kullanılabilir ancak bir clusterda bu ikisi karışık olarak kullanılamaz. Dikkat edilmesi gereken nokta ise low watermark değeri düşük bir değere ayarlanırsa cluster üzerinde shard’ların allocate edilmesinde problem olacaktır.

EElasticsearch node’larının disk kullanımlarının farklı düzeylerde olması normal bir durumdur. Cluster’ın balanced olma durumu her node üzerindeki shard ve ve bu shardların ait olduğu index sayısı ile ilgilidir. Shard boyutları ve nodelar üzerindeki boş disk alanlarını dikkate almana sebepleri ise şunlardır;

Disk kullanımları zamanla değişir ve bunu göz önünde bulundurması durumunda gereğinden fazla shard relocate işlemi yapılabilir ve I/O – network yoğunluğu oluşabilir. 

Disk kullanım alanlarının çok veya az olması clusterda node’ların performansını etkilemez.

cluster.routing.allocation.disk.threshold_enabled : Watermark kullanımını enable veya disable etmek için kullanılır. Default değeri true.
cluster.routing.allocation.disk.watermark.low : Set edili olduğu değerden daha fazla disk kullanım oranına sahip olduğunda yeni shard allocate etmez. Yeni yaratılmış indexlerin primary shardlarına etki etmez.
cluster.routing.allocation.disk.watermark.high: Set edili olduğu değerden daha fazla disk kullanım oranına sahip olduğunda yeni shard allocate etmez ve shardları diğer nodelar arasında relocate etmeyi dener. Bütün shard tiplerini etkiler.
cluster.routing.allocation.disk.watermark.flood_stage : Set edili olduğu değerden daha fazla disk kullanım oranına sahip olduğunda bu node’da yer alan shardlar hangi indexlere ait ise o indexlerin hepsi read only’e çekilir.
cluster.info.update.interval : Elasticsearch’in disk kullanımını ne sıklıkla kontrol edeceğini belirler. Default olarak 30s’dir.

Bir node’un shard allocate etmemesi için aşağıdaki komut kullanılabilir.

PUT _cluster/settings
{
  “persistent”: {
    “cluster.routing.allocation.exclude._ip”: “192.168.2.*”
  }
}

Shard ve Disk kullanım oranları aş. gibi kontrol edilebilir.

curl -s -X GET ‘localhost:9200/_cat/allocation?v&s=node’

shard disk usage
Shard – Disk usage

Bu yazı ile shard ve replica kavramları ile shard allocation işlemleri ve ayarlardan bahsetmiş olduk. Elasticsearch ile ilgili video dersler için https://youtube.com/@veritabaniegitimleri kanalımı takip edebilir, https://www.veritabaniegitimleri.com/category/dokuman/nosql/elasticsearch kategorisinden diğer yazılara ulaşabilirsiniz. İyi Çalışmalar

Veysel YUKSEL
Latest posts by Veysel YUKSEL (see all)

Veysel YUKSEL

RDBMS ve NoSQL veri tabanı yönetimi ve Big Data teknolojileri.

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir