paint-brush
Rockset, DynamoDB İkincil Dizinlerinde Elasticsearch'e Karşı Nasıl Biriktirir?ile@rocksetcloud

Rockset, DynamoDB İkincil Dizinlerinde Elasticsearch'e Karşı Nasıl Biriktirir?

ile Rockset8m2024/05/01
Read on Terminal Reader

Çok uzun; Okumak

Analitik kullanım senaryoları için DynamoDB tablosunu Rockset gibi farklı bir araç veya hizmetle senkronize ederek önemli performans ve maliyet avantajları elde edebilirsiniz.
featured image - Rockset, DynamoDB İkincil Dizinlerinde Elasticsearch'e Karşı Nasıl Biriktirir?
Rockset HackerNoon profile picture

Birçok geliştirme ekibi, olaya dayalı mimariler ve kullanıcı dostu, yüksek performanslı uygulamalar oluşturmak için DynamoDB'ye yöneliyor. Operasyonel bir veritabanı olarak DynamoDB, birden fazla coğrafi konuma dağıtıldığında bile gerçek zamanlı işlemler için optimize edilmiştir. Ancak arama ve analiz erişim kalıpları için güçlü bir performans sağlamaz.

DynamoDB'de Arama ve Analiz

DynamoDB gibi NoSQL veritabanları genel olarak mükemmel ölçeklendirme özelliklerine sahip olsa da, yalnızca çevrimiçi işlem işlemeye odaklanan sınırlı sayıda işlemi destekler. Bu, etkili indeksleme stratejilerine yoğun bir şekilde dayanmadan verileri aramayı, filtrelemeyi, toplamayı ve birleştirmeyi zorlaştırır.


DynamoDB, verileri her bir öğede bulunan, kullanıcı tarafından belirlenen bölüm anahtarı alanına göre çok sayıda düğüme bölerek, başlık altında depolar. Kullanıcı tarafından belirlenen bu bölüm anahtarı, birincil anahtarı temsil etmek üzere isteğe bağlı olarak bir sıralama anahtarıyla birleştirilebilir. Birincil anahtar bir dizin görevi görerek sorgu işlemlerini ucuz hale getirir. Bir sorgu işlemi, bölüm anahtarında eşitlik karşılaştırmaları (=) ve belirtilmesi halinde sıralama anahtarında karşılaştırma işlemleri (>, <, =, BETWEEN) yapabilir.


Yukarıdaki şemanın kapsamına girmeyen analitik sorguların gerçekleştirilmesi, genellikle DynamoDB tablosunun tamamının paralel olarak taranmasıyla yürütülen bir tarama işleminin kullanılmasını gerektirir. Bu taramalar, tablonun tamamının tam olarak okunmasını gerektirdiğinden, okuma verimi açısından yavaş ve pahalı olabilir. Sonuç üretmek için taranacak daha fazla veri olduğundan, tablo boyutu büyüdüğünde taramalar da yavaşlama eğilimindedir. Analitik sorguları fahiş tarama maliyetleriyle karşılaşmadan desteklemek istiyorsak, daha sonra tartışacağımız ikincil indekslerden yararlanabiliriz.

DynamoDB'de indeksleme

DynamoDB'de ikincil dizinler, sık sık sorgulanan alanları dizine ekleyerek uygulama performansını artırmak için sıklıkla kullanılır. İkincil dizinlerdeki sorgu işlemleri, gereksinimleri açıkça tanımlanmış analitik sorgular aracılığıyla belirli özellikleri desteklemek için de kullanılabilir.


İkincil indeksler sorgulamak istediğimiz alanlar üzerinde bölüm anahtarları ve isteğe bağlı sıralama anahtarları oluşturmaktan oluşur. İki tür ikincil dizin vardır:


  • Yerel ikincil dizinler (LSI'ler): LSI'ler, tek bir bölüm için karma ve aralık anahtarı niteliklerini genişletir.

  • Küresel ikincil dizinler (GSI'ler): GSI'ler, tek bir bölüm yerine tablonun tamamına uygulanan dizinlerdir.


Ancak Nike'ın keşfettiği gibi, DynamoDB'de GSI'ların aşırı kullanımı pahalı olabilir. DynamoDB'deki analizler, yalnızca çok basit nokta aramaları veya küçük aralıklı taramalar için kullanılmadıkları sürece, ikincil dizinlerin aşırı kullanımına ve yüksek maliyetlere neden olabilir.


Temel tablodaki tüm güncellemelerin ilgili GSI'larda da yapılması gerektiğinden, indeksler kullanıldığında tedarik edilen kapasitenin maliyetleri hızlı bir şekilde artabilir. Aslında AWS , temel tabloya yazma işlemlerinin kısıtlanmasını ve uygulamanın sekteye uğramasını önlemek için küresel bir ikincil dizin için sağlanan yazma kapasitesinin, temel tablonun yazma kapasitesine eşit veya bundan daha büyük olmasını önerir. Tedarik edilen yazma kapasitesinin maliyeti, yapılandırılan GSI sayısıyla doğrusal olarak artar, bu da birçok erişim modelini desteklemek için çok sayıda GSI kullanmanın maliyetini engelleyici hale getirir.


DynamoDB ayrıca diziler ve nesneler de dahil olmak üzere iç içe geçmiş yapılardaki verileri indekslemek için iyi tasarlanmamıştır. Verileri indekslemeden önce kullanıcıların, iç içe geçmiş nesneleri ve dizileri düzleştirerek verileri normalleştirmeleri gerekecektir. Bu, yazma sayısını ve ilgili maliyetleri büyük ölçüde artırabilir.

Analitik için DynamoDB ikincil dizinlerinin kullanımına ilişkin daha ayrıntılı bir inceleme için DynamoDB'de Analitik İçin İkincil Dizinler blogumuza bakın.


Sonuç olarak, analitik kullanım örnekleri için DynamoDB tablosunu, karmaşık analitiği verimli bir şekilde çalıştırmak için harici bir ikincil dizin görevi gören farklı bir araç veya hizmetle senkronize ederek önemli performans ve maliyet avantajları elde edebilirsiniz.

DynamoDB + Elasticsearch


Verilerimiz üzerinde ikincil bir dizin oluşturmaya yönelik yaklaşımlardan biri DynamoDB'yi Elasticsearch ile birlikte kullanmaktır. Elastic Cloud veya Amazon OpenSearch Service gibi bulut tabanlı Elasticsearch, dizinlerin boyutuna, çoğaltmaya ve diğer gereksinimlere göre düğümleri tedarik etmek ve yapılandırmak için kullanılabilir. Yönetilen bir kümenin yükseltilmesi, güvenliğinin sağlanması ve performansının korunması için bazı işlemler gerekir; ancak bu, EC2 bulut sunucularında tamamen kendi başınıza çalıştırmaktan daha azdır.



Amazon DynamoDB için Logstash Eklentisini kullanan yaklaşım desteklenmediğinden ve kurulumu oldukça zor olduğundan, bunun yerine yazma işlemlerini DynamoDB Streams ve bir AWS Lambda işlevini kullanarak DynamoDB'den Elasticsearch'e aktarabiliriz. Bu yaklaşım iki ayrı adımı uygulamamızı gerektirir:


  • Öncelikle DynamoDB'de meydana gelen her güncellemeyi Elasticsearch'e göndermek için DynamoDB akışında çağrılan bir lambda işlevi oluşturuyoruz.
  • Daha sonra DynamoDB'nin mevcut tüm içeriğini Elasticsearch'e göndermek için bir lambda işlevi (veya lambda yürütme zaman aşımından daha uzun sürecekse bir komut dosyası çalıştıran EC2 örneği) oluştururuz.


Tablolarımızda herhangi bir yazma işlemini kaçırmadığımızdan emin olmak için bu lambda işlevlerinin her ikisini de doğru izinlerle yazmalı ve bağlamalıyız. Bunlar gerekli izlemeyle birlikte kurulduğunda DynamoDB'den Elasticsearch'teki belgeleri alabilir ve veriler üzerinde analitik sorgular çalıştırmak için Elasticsearch'ü kullanabiliriz.


Bu yaklaşımın avantajı, Elasticsearch'ün tam metin indekslemeyi ve çeşitli analitik sorgu türlerini desteklemesidir. Elasticsearch, kontrol panellerinin hızlı bir şekilde oluşturulmasına yardımcı olabilecek görselleştirme için müşterileri çeşitli dillerde ve Kibana gibi araçlarda destekler. Bir küme doğru şekilde yapılandırıldığında sorgu gecikmeleri, Elasticsearch'e akan veriler üzerinden hızlı analitik sorgular için ayarlanabilir.


Dezavantajları ise çözümün kurulum ve bakım maliyetinin yüksek olabilmesidir. Yönetilen Elasticsearch bile temel örneklerin çoğaltılması, yeniden parçalanması, dizin büyümesi ve performans ayarlaması ile uğraşmayı gerektirir.


Elasticsearch, bilgi işlem ve depolamayı ayırmayan, birbirine sıkı sıkıya bağlı bir mimariye sahiptir. Bu, bağımsız olarak ölçeklendirilemedikleri için kaynakların sıklıkla aşırı tedarik edildiği anlamına gelir. Ayrıca okuma ve yazma gibi birden fazla iş yükü aynı bilgi işlem kaynakları için mücadele edecektir.


Elasticsearch ayrıca güncellemeleri verimli bir şekilde işleyemez. Herhangi bir alanın güncellenmesi tüm belgenin yeniden indekslenmesini tetikleyecektir. Elasticsearch belgeleri değiştirilemez olduğundan herhangi bir güncelleme, yeni bir belgenin dizine eklenmesini ve eski sürümün silinmiş olarak işaretlenmesini gerektirir. Bu, değiştirilmemiş alanların bile yeniden indekslenmesi ve güncelleme sonrasında tüm belgelerin yazılması için ek hesaplama ve G/Ç harcanmasına neden olur.


Lambda'lar DynamoDB akışında bir güncelleme gördüklerinde tetiklendiğinden, soğuk başlatma nedeniyle gecikme artışları yaşayabilirler. Kurulum, DynamoDB akışındaki olayları doğru şekilde işlediğinden ve Elasticsearch'e yazabildiğinden emin olmak için ölçümler ve izleme gerektirir.


Analitik sorgular açısından işlevsel olarak Elasticsearch, birden fazla dizin içeren karmaşık analitik sorgular için yararlı olan birleştirme desteğinden yoksundur . Elasticsearch kullanıcılarının bu sınırlamayı aşmak için sıklıkla verileri denormalize etmesi, uygulama tarafı birleştirmeleri gerçekleştirmesi veya iç içe nesneler veya üst-alt öğe ilişkilerini kullanması gerekir.


Avantajları

  • Tam metin arama desteği
  • Çeşitli analitik sorgu türleri için destek
  • DynamoDB'deki en son veriler üzerinde çalışabilir


Dezavantajları

  • Alım, indeksleme, çoğaltma ve parçalama için altyapının yönetimini ve izlenmesini gerektirir
  • Sıkı bir şekilde birleştirilmiş mimari, aşırı kaynak tedariğine ve bilgi işlem çekişmesine neden olur
  • Verimsiz güncellemeler
  • DynamoDB ile Elasticsearch arasında veri bütünlüğünü ve tutarlılığını sağlamak için ayrı bir sistem gerektirir
  • Farklı dizinler arasındaki birleştirme desteği yok


Bu yaklaşım, DynamoDB'deki veriler ve Kibana'yı kullanan kontrol panelleri üzerinde tam metin araması uygulandığında işe yarayabilir. Ancak bir Elasticsearch kümesini üretimde ayarlamak ve sürdürmek için gereken işlemler, kaynakların verimsiz kullanımı ve birleştirme özelliklerinin eksikliği zorlayıcı olabilir.

DynamoDB + Rockset


Rockset, öncelikle yüksek QPS gereksinimlerine sahip gerçek zamanlı uygulamaları desteklemek için oluşturulmuş, tamamen yönetilen bir arama ve analiz veritabanıdır. Genellikle OLTP veritabanlarından gelen veriler için harici bir ikincil dizin olarak kullanılır.


Rockset, verileri DynamoDB ile Rockset arasında senkronize tutmak için kullanılabilecek yerleşik bir DynamoDB konektörüne sahiptir. İçeriklerini senkronize etmek istediğimiz DynamoDB tablosunu ve tabloyu indeksleyen bir Rockset koleksiyonunu belirtebiliriz. Rockset, DynamoDB tablosunun içeriğini tam anlık görüntüde indeksler ve ardından yeni değişiklikleri meydana geldikçe senkronize eder. Rockset koleksiyonunun içeriği her zaman DynamoDB kaynağıyla senkronizedir; kararlı durumda birkaç saniyeden fazla ara vermeyin.




Rockset, akışın durumunu izleyerek ve DynamoDB'den akış değişikliklerine görünürlük sağlayarak DynamoDB tablosu ile Rockset koleksiyonu arasındaki veri bütünlüğünü ve tutarlılığını otomatik olarak yönetir.



Bir şema tanımı olmadan Rockset koleksiyonu, DynamoDB'de alanlar eklendiğinde/kaldırıldığında veya verinin yapısı/türü değiştiğinde otomatik olarak uyum sağlayabilir. Bu, herhangi bir ek ETL ihtiyacını ortadan kaldıran güçlü dinamik yazma veakıllı şemalar sayesinde mümkün olmaktadır.


DynamoDB'den aldığımız Rockset koleksiyonu, sorgulama için SQL'i destekliyor ve geliştiriciler tarafından, alana özel bir dil öğrenmeye gerek kalmadan kolayca kullanılabiliyor. Ayrıca REST API üzerinden uygulamalara sorgu sunmak veya çeşitli programlama dillerindeki istemci kitaplıklarını kullanmak için de kullanılabilir. Rockset'in desteklediği ANSI SQL üst kümesi, derinlemesine yuvalanmış JSON dizileri ve nesneleri üzerinde yerel olarak çalışabilir ve karmaşık analitik sorgularda bile milisaniyelik gecikmeler elde etmek için tüm alanlar üzerinde otomatik olarak oluşturulan dizinlerden yararlanabilir.


Rockset, aynı temel gerçek zamanlı verileri paylaşırken iş yüklerinin ayrı bilgi işlem birimlerinde yalıtılmasına olanak tanıyan bilgi işlem-bilgi işlem ayrımına öncülük etti. Bu, aynı veri kümesinde eşzamanlı alım ve sorguları veya birden fazla uygulamayı desteklerken kullanıcılara daha fazla kaynak verimliliği sunar.


Ayrıca Rockset, verilere erişimi yönetmek için güvenlik, veri şifreleme ve rol tabanlı erişim kontrolüyle de ilgilenir. Rockset kullanıcıları, verileri bir koleksiyona geldiğinde değiştirmek için Rockset'te ayarlayabileceğimiz alma dönüşümlerinden yararlanarak ETL ihtiyacını ortadan kaldırabilir. Kullanıcılar ayrıca isteğe bağlı olarak eski verileri otomatik olarak temizlemek için saklama politikaları ayarlayarak verilerin yaşam döngüsünü yönetebilirler. Hem veri alımı hem de sorgu hizmeti otomatik olarak yönetiliyor; bu, altyapı yönetimi ve operasyonlarına olan ihtiyacı ortadan kaldırırken canlı kontrol panelleri ve uygulamalar oluşturmaya ve dağıtmaya odaklanmamızı sağlıyor.


Özellikle DynamoDB ile senkronizasyon açısından önemli olan Rockset, maliyetli yeniden indekslemeyi önlemek için yerinde saha düzeyinde güncellemeleri destekler. İş için doğru aracı seçmek amacıyla Rockset ve Elasticsearch'ü alım, sorgulama ve verimlilik açısından karşılaştırın .


Özet

  • Yüksek QPS sunmak ve gerçek zamanlı uygulamalar sunmak için tasarlandı
  • Tamamen sunucusuz. Hiçbir işlem veya altyapı veya veritabanı sağlanması gerekmez
  • Tahmin edilebilir performans ve verimli kaynak kullanımı için bilgi işlem-bilgi işlem ayrımı
  • DynamoDB ile Rockset koleksiyonu arasında canlı senkronizasyon sayesinde aralarındaki fark hiçbir zaman birkaç saniyeden fazla olmaz
  • DynamoDB ve Rockset arasında tutarlılığı sağlamak için izleme
  • Düşük gecikmeli sorgulara olanak tanıyan veriler üzerine oluşturulan otomatik dizinler
  • Pahalı yeniden indekslemeyi önleyen ve veri gecikmesini azaltan yerinde güncellemeler
  • Amazon Kinesis, Apache Kafka, Amazon S3 vb. gibi diğer kaynaklardan alınan verilerle birleştirilir.


Herhangi bir operasyonel, ölçeklendirme veya bakım kaygısı olmaksızın DynamoDB'deki veriler üzerinde gerçek zamanlı analizler uygulamak için Rockset'i kullanabiliriz. Bu, gerçek zamanlı uygulamaların geliştirilmesini önemli ölçüde hızlandırabilir. Uygulamanızı Rockset kullanarak DynamoDB verileri üzerinde oluşturmak istiyorsanız buradan ücretsiz olarak başlayabilirsiniz.