8. Elasticsearch Scaling Yaklaşımları

Elasticsearch Scaling Yaklaşımları

Elasticsearch scale out bir nosql çözümüdür. Dolayısıyla elinizdeki makina sayısı kadar sınırsızca scale olabilir ve performansı arttırabilirsiniz ki bu da no sql çözümlerinin en güzel taraflarından biri. Ancak bu durum pratikte böyle değildir. Elasticsearchte datalarınızı tutmak için bir index tanımadığınızda indexe özgü primary shard sayınızı da tanımlarsınız ve elasticsearch clusterınızı ölçeklediğinizde bu shardlar diğer makinalara dağılır. Yani aslında shard sayınız kadar scale olabilirsiniz. En önemlisi de elasticsearchte bir index yaratıldıktan ve primary shard sayısı tanımlandıktan sonra o sayıyı değiştiremezsiniz. Yani aslında shard sayısı da bir nevi ölçeklenebileceğiniz maksimum node sayısı anlamına gelir ve bunu değiştiremezsiniz.Yanlış bir planlamayla da çok büyük datalarınızı re-indexlemek zorunda kalabilirsiniz. Tabi bu arada ek bir hatırlatma olarak, primary shard sayısını artıramıyor olsanız da replica shard sayını index tanımlandıktan sonra da artırabilirsiniz.

Peki datalarımızın günden güne katlanarak arttığı şu dönemlerde, bu kısıtı aşmanın bir yolu yok mudur? Bu yazımda bu yollardan bahsedeceğim Over-Sharding

Over sharding aslında, indexinizin gelecekteki büyüme kapasitesini göz önünde bulundurarak ileri de kullanırım diye fazla fazla, mevcutta kullanılmayacak olan shardlar eklemektir. Başlangıç için kendinize bir makinada 1 shardlı bir elasticsearch oluşturduğunuzu varsayalım. Sonrasında ise gelen yük sebebiyle ölçekleme ihtiyacınız doğdu ve bir node daha kaldırdırınız. Ancak burada ölçekleme gerçekleşmez. Çünkü elasticsearchte ölçekleme index’i yaratırken tanımladığınız shard sayısı kadardır ve shard elasticsearch’te hareket edebilen en küçük yapıdır. Bu sebeple index tanımlarken shard sayısını doğru ayarlamak önemlidir.

Örneğin elinizde 5 primary shardlık bir elastic indexiniz var ve bir anda gelen yük ile birlikte 6. nodeu devreye almanız gerekti. Ancak 6. node’a scale olamazsınız çünkü 5 primary shardınız olduğu için maximum scale olabileceğiniz node sayısı da 5tir.

Bu durumda indeximi tanımlarken 100 kadar shard tanımlayayım ölçeklendikçe bu shardları kullanırım yaklaşımı kulağa mantıklı geliyor. Ancak iş o kadar da basit değil. Çünkü her shard bir lucene indextir ve segmentlerden oluşur ve bu segmentlerin de file descriptiorları bir memory overhead costunu yanında getirir ve  ram limitlerini de vurabilirsiniz.

Dataları indexlere ve Shardlara Yaymak

Yukarıda da bahsettiğim gibi, mevcut elasticsearch versiyonunda primary shardları artırma ve azaltma imkanı yoktur. Ancak bu dataları farklı indexlere yayamayacağınız anlamına gelmez. Örneğin, şehirlerdeki belli olayları tutan bir elasticsearch node’unuz olsun. Ama İstanbulda diğer illere göre çok daha fazla olay olacağını biliyor olun. Bu durumda il bazlı indexler oluşturup, istanbulda yaşanan olayları ayrı bir indexte tutabilirsiniz. Dolayısıyla istanbul için tanımladıgınız indexin shard sayısını daha fazla tutabilirsiniz ya da bir diğer örnek olarak, datanızı tarih bazlı indexlere de bölebilirsiniz.

Bu şekilde indexleri kullanmanın bir yolu da aliaslardır. Alias bir indexe veya index setine pointer görevi görür yani o aliasın gösterdiği indexi herhangi bir zaman aralığında değiştirme imkanı verir. Örneğin 2015 tarihli indexi point eden bir ailası 2016 tarihi geldiğinde o indexe mapleyebilirsiniz.

Maximizing Throughput

Diyelim ki elasticsearch üzerinde büyük boyutlu bir indexleme yapmanız ve bunu da hızlıca yapmanız gerekiyor. Elasticsearch indexleme yaparken, dataları önce primary shard’da sonra da replica shardlarda indexler. Son replica shard indexlendiğinde indexleme işlemi tamamlanmış kabul edilir. Bu mantıkla baktığımızda indexleme hızı için, indexleme yapmadan önce elasticsearch replica shardlarınızı sıfırlayabilir indexlemeyi primary shard üzerinde tamamlayabilir ve sonrasında replicaları tekrar oluşturabilirsiniz. Yani anlık olarak replica sayısını azaltmak hatta sıfırlamak indexleme hızını artırır. Tersi bir şekilde search hızınızın artması için de replica sayınızı artırabilirsiniz.