Couchbase — Durable Writes and Durability

Hüseyin Demir
5 min readMar 31, 2022

--

Merhabalar, bu yazıda biraz Couchbase ortamlarındaki durability konusuna değinmeye çalışacağım. Durability’nin getirdiği ve götürdüğü durumlar, kullanımında dikkat edilmesi gereken noktalar ve performans açısından maliyetlerini açıklamaya çalışacağım. Bu yazıdaki konu akışı ve çalışma planı aşağıdaki gibi olacak.

  1. Durability Nedir
  2. Durability ve Majority
  3. Durability Performans Analizi
  4. Durability Performans İyileştirmesi
  5. Durability Failover Koruması

Durability Nedir ?

Couchbase durability kavramı dağıtık NoSQL ortamlarda kullanılan bir kavramdır. Durability en temelde, Couhcbase’e gelen bir yazma isteğinin birden çok sunucuda memory’de ya da(ve) diskte yapılması işlemidir. Örnek olarak, bir yazma isteğinin birden çok sunucuda disk’e persist edildikten sonra başarılı olarak etiketlenmesi olarak belirtilebilir. Bir diğer karşılığı da synchronous yazma işlemi olarak bilinmektedir.

Durability kavramı belirli seviyeleri olan ve ihtiyaca göre ayarlanması gereken bir konfigürasyondur. Bu nedenle durability ayarlamadan önce Couchbase’in sunduğu durability seçenekleri analiz edilmelidir.

Ek olarak, durability seviyesi arttıkça yazma işlemlerinin tamamlanması için gereken süre de uzayacaktır. Bu nedenle, durability seviyesini verinin ve veritabanın sahip olduğu iş kuralları çercevesinde belirlemek gerekiyor.

Couchbase’de durable write işlemleri ATOMIC olarak gerçekleşir. Bu sayede, birden çok client’ın aynı anda bir dökümanı güncellemesi mümkün değildir. Client’lar gerekirse devam eden bir işlem olması nedeniyle hata alırlar ya da retry edebilirler.

Durability Majority Ayarlanması

Durability gereksinimleri majority konseptine ihtiyaç duyar ve majority hesabı üzerinden çalışmaktadır. Couchbase’de data servisleri üzerinde tutulan verinin replica sayısı üzerinden majority hesaplaması yapılmaktadır. Replica sayısına göre majority için gereken node sayısı aşağıdaki gibidir.

Durability Seviyeleri

  1. Majority: Sisteme gelen bir yazma isteğinin data node’larının majority sayısına denk düşecek kadar olanına dağıtılmasıdır.
  2. majorityAndPersistToActive: Majority kuralına ek olarak active vBucket’ın olduğu sunucuda yazma işleminin disk’e persist edilmesidir.
  3. persistToMajority: Majority sayısı kadar olan data node’larında mutasyon replike edilir ve diske persist edilir.

Durability Performans Analizi

Durability ayarlanması performansı doğrudan etkileyen bir faktördür. Özellikle yazma işlemlerinin performansını doğrudan etkilemektedir. Bu nedenle farklı durability seviyelerinde aynı işlemin sürelerini ve performanslarını karşılaştıracağız.

Aşağıdaki benchmark testinde Couchbase bucket’ında kullanılabilecek durability seviyelerine göre ne kadar işlem yapıldığı ve yapılabilen işlemin hacmini görebileceğiz.

Gerçekleştirilen testte 3 sunucudan oluşan bir Couchbase cluster kullanılmıştır. Bu clusterda kullanılan bucket’ın replica değeri 1 olarak kullanılmıştır. Değişen tek değişken ise durability seviyeleridir.Her senaryoda 1.000.000 kayıdın yazılması sonrası üretilen sonuçlar kullanılmıştır.

Buradaki sonuçlara göre durabilily seviyesi arttıkça aynı kayıdı yazmak için gereken süre artmaktadır. Bu artış seviye arttıkça daha da büyümektedir. Bununla birlikte ise, durability seviyesi arttıkça, birim zamanda yazılabilen kayıt sayısında da ciddi oranda düşüşler mevcuttur.

Benchmark komutları ise aşağıdaki gibidir.

time cbworkloadgen -n 127.0.0.1:8091 -u Administrator -p hebelehübele -b bench -i 1000000 -j -r 1

Durability Performans İyileştirmesi

Couchbase üzerinde reader ve writer threadlerinin sayılarının ayarlanması ile iş yüküne ve bucket’ın kullanım amacına göre performans kazanımı sağlamak mümkündür. Bu ayarlar data ayarlarının altında bulunan advanced ayarlardır. Buradaki thread’lerin dağıtılması ve değiştirilmesi performans kazanımı verebilir. Ancak, bu ayarlar doğrudan production’da uygulanmamalıdır. İhtiyaca ve işe yönelik olarak her zaman önce test edilmelidir.

Veritabanın thread ayarlarını 4–64 arası bir değere sabit bir şekilde yapabiliriz. Burada önemli olan veritabanının çalıştığı I/O altyapısının ne kadar eş zamanlı I/O isteğine cevap verebildiğidir. Durable write yaparak daha iyi performans almak için writer threadleri arttırılabilir.

Örnek olarak aşağıdaki konfigürasyonlarda görüleceği üzere 3 farklı şekilde writer thread ayarları yapılabilir.

  • Default: Dengeli bir şekilde tüm threadleri paylaştırır.
  • Disk I/O Optimized: Bu ayar aktif edildiğinde sunucudaki CPU core sayısı kadar thread
  • Fixed Value: 4–64 arası bir değer alabilen fix value

Aşağıdaki grafikte ise, bahsi geçen thread ayarları ile birlikte koşulan testlerin sonuçları mevcuttur.

Bu sonuçlar production ortamda ve heryerde geçerli olan sonuçlar değildir. Buradaki konuda ve konfigürasyonlarda performans sonuçları I/O altyapısına bağlı olarak değişkenlik gösterebilir ancak bu testlerde de görüleceği üzere bu ayarların değiştirilmesi performansta farklılık göstermiştir. O nedenle bu ayarlar her zaman performans artışı sağlamasa da performansa etki eden faktörlerden birisi olarak kabul edilebilir.

Kullanılan thread sayısı ve ayarları işletim sistemindeki disk queue_depth ile doğru orantılıdır ve buna göre değişkenlik gösterebilir. Bu thread ayarlarını belirlerken queue_depth değeri kontrol edilmeli ve ona göre referans alınmalıdır.

Durability Failover Protection

Durabiliy ile ilgili bir diğer konu da failover esnasında protection sağlamaktır. Çünkü durability, majority prensiplerine göre çalıştığı için bu tarz durumlarda erişimle ilgili problemler cıkarabilir ve yazma isteklerini kabul etmeyebilir.

Bu çalışmadaki örnek bucket’ın 2 replica count’u bulunmaktadır ve toplamda 5 data node bulunmaktadır. Buradaki amaç, cluster üzerindeki bir sunucuda problem meydana geldiğinde (beklenmedik problemler) durability ile birlikte çalışan bucketların nasıl etkilendiği ve işlem alıp alamadığını görmek.

Data Node Count: 5
Bucket Replica Count: 2
Durability: Majority

Etki: Node failover olana kadar istekler durdu. Node otomatik failover olduktan sonra istek almaya devam etti. Bir problem yaşanmadı.

Data Node Count: 5
Bucket Replica Count: 1
Durability: Majority

Etki: Node üzerindeki kesinti meydana geldikten sonra otomatik olarak failover edildikten sonra işlemler devam edemedi. Ancak manual olarak rebalance işlemi sonrası yazma işlemleri devam edebildi.

Buradan çıkan sonuç ise, durability ayarlarının aktif edildiği bucketlarda replica count’un 2 olması gerektiğidir. Clusterda başka bucket varsa onların da replica ayarları ve durability tiplerinin incelenmesi gerekir.

Bu çalışmada görüleceği ve fark edileceği üzerine, Couchbase ortamında durability kullanmanın avantajlarının yanında dezvantajları ve dikkat edilmesi gereken özel konfigürasyonları vardır. Durable write(sync write) işlemlerini sadece gerektiği yerlerde ve benchmark analizleri sonucu kullanmak en optimum çözümdür. Durability kullanırken de bu durumları göz önünde bulundurmamız gerekiyor.

Referans

Sevgiler,

Demir.

--

--

No responses yet