Mühendislik ekiplerinin genellikle DynamoDB'den gelen veriler üzerinde karmaşık filtreler, toplamalar ve metin aramaları yapması gerekir. Ancak DynamoDB, gerçek zamanlı analiz için değil, işlem işleme için optimize edilmiş operasyonel bir veritabanıdır. Sonuç olarak, birçok mühendislik ekibi DynamoDB'de analitik konusunda sınırlara ulaşıyor ve alternatif seçenekler arıyor.
Bunun nedeni operasyonel iş yüklerinin karmaşık analitik iş yüklerinden çok farklı erişim modellerine sahip olmasıdır. DynamoDB yalnızca sınırlı sayıda işlemi destekler, bu da analitiği zorlaştırır ve bazı durumlarda mümkün kılmaz. DynamoDB'nin arkasındaki şirket olan AWS bile şirketlere analitiği diğer amaca yönelik çözümlere aktarmayı düşünmelerini tavsiye ediyor. Yaygın olarak başvurulan çözümlerden biri, bugün inceleyeceğimiz Elasticsearch'tür.
DynamoDB, en popüler NoSQL veritabanlarından biridir ve oyun, sosyal medya, IoT ve finansal hizmetlerde birçok web ölçekli şirket tarafından kullanılmaktadır. DynamoDB, ölçeklenebilirliği ve basitliği nedeniyle tercih edilen veritabanıdır ve saniyede 20 milyon istek ölçeğinde tek haneli milisaniye performansı sağlar. Bu hıza geniş ölçekte ulaşmak için DynamoDB, bireysel veri kayıtlarında yüksek frekanslı, düşük gecikmeli işlemlerle operasyonel iş yüklerine yönelik performansı artırmaya odaklanmıştır.
Elasticsearch, Lucene üzerine kurulu, metin arama ve günlük analizi kullanım durumları için kullanılan açık kaynaklı, dağıtılmış bir arama motorudur. Elasticsearch, analitik gösterge tablolarına yönelik bir görselleştirme aracı olan Kibana'yı içeren daha büyük ELK yığınının bir parçasıdır. Elasticsearch esnek ve son derece özelleştirilebilir olmasıyla bilinmesine rağmen, performansı korumak için küme ve dizin işlemleri ve yönetimini gerektiren karmaşık bir dağıtılmış sistemdir. Elastic ve AWS'nin yönetilen yönetilen Elasticsearch teklifleri mevcuttur, dolayısıyla bunu EC2 bulut sunucularında kendiniz çalıştırmanıza gerek yoktur.
Utanmaz Fiş: Rockset , bulut için oluşturulmuş gerçek zamanlı bir analiz veritabanıdır. DynamoDB için yerleşik bir bağlayıcıya sahiptir ve bir saniyeden kısa sürede arama, toplama ve birleştirme için verileri alır ve dizine ekler. Ancak bu yazı, bu seçeneği keşfetmek istemeniz durumunda DynamoDB ve Elasticsearch'ün kullanım örneklerini vurgulamakla ilgilidir.
Analitik amacıyla DynamoDB verilerini Elasticsearch'e sürekli olarak yüklemek için AWS Lambda'yı kullanabilirsiniz. İşte nasıl çalışıyor:
Verileri Elasticsearch'e senkronize etmek için DynamoDB için Logstash Eklentisini içeren alternatif bir yaklaşım vardır, ancak şu anda desteklenmemektedir ve yapılandırılması karmaşık olabilir.
Metin arama, en alakalı sonuçları bulmak için bir belgenin içindeki metnin aranmasıdır. Çoğu zaman, en iyi sonucu bulmak için bir kelimenin bir bölümünü, kelimenin eşanlamlısını veya zıt anlamlısını veya bir kelime dizisini birlikte aramak isteyeceksiniz. Hatta bazı uygulamalar, önemlerine göre arama terimlerini farklı şekilde ağırlıklandıracaktır.
DynamoDB, verilerin filtrelenmesine yardımcı olmak için yalnızca bölümlendirmeyi kullanarak bazı sınırlı metin arama kullanım örneklerini destekleyebilir. Örneğin, bir e-ticaret sitesiyseniz DynamoDB'deki verileri bir ürün kategorisine göre bölümlendirebilir ve ardından aramayı bellekte çalıştırabilirsiniz. Görünen o ki, Amazon.com perakende bölümü birçok metin arama kullanım durumunu bu şekilde ele alıyor. DynamoDB ayrıca belirli bir veri alt dizesini içeren bir dize bulmanızı sağlayan bir içerme işlevini de destekler.
Bir e-ticaret sitesi, verileri ürün kategorisine göre bölümlendirebilir. Aranan verilerle birlikte marka ve renk gibi ek özellikler gösterilebilir.
Tam metin aramanın uygulamanızın temelini oluşturduğu senaryolarda, Elasticsearch gibi alaka düzeyi sıralamasına sahip bir arama motoru kullanmak isteyeceksiniz. Elasticsearch'te metin aramanın yüksek düzeyde nasıl çalıştığı aşağıda açıklanmıştır:
İlgililik sıralaması : Elasticsearch'ün, arama sonuçlarına kullanıma hazır olarak verdiği bir alaka sıralaması vardır veya sıralamayı özel uygulama kullanım durumunuz için özelleştirebilirsiniz. Elasticsearch varsayılan olarak terim sıklığı, ters belge sıklığı ve alan uzunluğu normuna dayalı bir sıralama puanı oluşturacaktır.
Metin analizi : Elasticsearch, verileri indekslemek için metni jetonlara böler ve buna tokenleştirme adı verilir. Analizciler daha sonra arama sonuçlarını geliştirmek için normalleştirilmiş terimlere uygulanır. Varsayılan standart çözümleyici, genel, çoklu dil desteği sağlamak için metni Unicode Konsorsiyumuna göre böler.
Elasticsearch ayrıca bulanık arama, otomatik tamamlama araması gibi kavramlara da sahiptir ve uygulamanızın özelliklerini karşılayacak şekilde daha da gelişmiş alaka düzeyi yapılandırılabilir.
Sonuç kümesini daraltmak ve böylece verilere daha hızlı ve daha verimli bir şekilde ulaşmak için karmaşık filtreler kullanılır. Birçok arama senaryosunda, birden çok filtreyi birleştirmek veya belirli bir süre boyunca olduğu gibi bir dizi veriyi filtrelemek isteyeceksiniz.
DynamoDB verileri bölümlere ayırır ve iyi bir bölüm anahtarı seçmek, verilerin filtrelenmesini daha verimli hale getirmeye yardımcı olabilir. DynamoDB ayrıca ikincil dizinleri de destekler; böylece verilerinizi çoğaltabilir ve ek filtreleri desteklemek için farklı bir birincil anahtar kullanabilirsiniz. Verileriniz için birden fazla erişim modeli olduğunda ikincil dizinler yararlı olabilir.
Örneğin, öğeleri teslimat durumlarına göre filtrelemek için bir lojistik uygulaması tasarlanabilir. Bu senaryoyu DynamoDB'de modellemek için, Item_ID
bölüm anahtarına, Status
sıralama anahtarına ve alıcı, ETA
ve SLA
niteliklerine sahip bir lojistik için temel tablo oluşturacağız.
Teslimat gecikmelerinin SLA'yı aşması durumunda DynamoDB'de ek bir erişim modelini de desteklememiz gerekiyor. DynamoDB'deki ikincil dizinlerden yalnızca SLA'yı aşan teslimatları filtrelemek için yararlanılabilir.
Zaten temel tabloda bulunan ETA özniteliğinin bir kopyası olan ETADelayedBeyondSLA
alanında bir dizin oluşturulacaktır. Bu veriler yalnızca ETA, SLA'yı aştığında ETADelayedBeyondSLA
dahil edilir. İkincil dizin, sorguda taranması gereken veri miktarını azaltan seyrek bir dizindir. buyer
bölüm anahtarıdır ve sıralama anahtarı ETADelayedBeyondSLA
.
İkincil dizinler, karmaşık filtreler içeren erişim modelleri de dahil olmak üzere uygulamadaki çoklu erişim modellerini desteklemek için kullanılabilir.
DynamoDB, bir ifadeyle eşleşmeyen sonuçları filtrelemek için Sorgu ve Tarama API'sinde bir ifade filtreleme işlemine sahiptir. filterexpression
yalnızca bir sorgu veya tablo tarama işleminden sonra uygulanır; böylece sorgu için hâlâ 1 MB'lık veri sınırına bağlı kalırsınız. Bununla birlikte, filterexpression
, uygulama mantığını basitleştirmede, yanıt yükü boyutunu azaltmada ve yaşam süresinin sona ermesini doğrulamada yardımcı olur. Özetle, verilerinizi yine de uygulamanızın erişim modellerine göre bölümlendirmeniz veya DynamoDB'deki verileri filtrelemek için ikincil dizinler kullanmanız gerekecektir.
DynamoDB, hızlı veri alımı için verileri anahtarlar ve değerler halinde düzenler ve karmaşık filtreleme için ideal değildir. Karmaşık filtrelere ihtiyaç duyduğunuzda, Elasticsearch gibi bir arama motoruna geçmek isteyebilirsiniz, çünkü bu sistemler samanlıkta iğne arama sorguları için idealdir.
Elasticsearch'te veriler, sütun değerinin bir kayıt listesi olarak saklandığı belgelerin listesi anlamına gelen bir arama dizininde saklanır. Bir yüklemi olan herhangi bir sorgu (yani: WHERE
user=A), yüklemi karşılayan belgelerin listesini hızlı bir şekilde getirebilir. Gönderme listeleri sıralandığından, tüm filtreleme kriterlerinin karşılanması için sorgu sırasında hızlı bir şekilde birleştirilebilirler. Elasticsearch ayrıca sık erişilen karmaşık filtre sorgularının alma sürecini hızlandırmak içinbasit önbelleğe alma özelliğini kullanır.
Elasticsearch'te genellikle puanlamasız sorgular olarak adlandırılan filtre sorguları, verileri metin arama sorgularından daha hızlı ve daha verimli bir şekilde alabilir. Bunun nedeni, bu sorgular için alaka düzeyinin gerekli olmamasıdır. Ayrıca Elasticsearch, aralık sorgularını da destekleyerek üst ve alt sınır (yani 0-5 age
arası) arasında hızlı bir şekilde veri almayı mümkün kılar.
Toplamalar, verilerin iş zekası veya trend analizi için toplanıp bir özet biçiminde ifade edilmesidir. Örneğin uygulamanızın kullanım ölçümlerini gerçek zamanlı olarak göstermek isteyebilirsiniz.
DynamoDB toplu işlevleri desteklemez. AWS tarafından önerilen geçici çözüm, bir DynamoDB tablosundaki verilerin toplu görünümünü korumak için DynamoDB ve Lambda kullanmaktır.
Örnek olarak Twitter gibi bir sosyal medya sitesindeki beğenilerin toplanmasını kullanalım. tweet_ID
birincil anahtar yapacağız ve ardından sıralama anahtarını, beğenileri topladığımız zaman penceresi yapacağız. Bu durumda, DynamoDB akışlarını etkinleştireceğiz ve bir Lambda işlevi ekleyeceğiz, böylece tweet'ler beğenildikçe (veya beğenilmedikçe) bir zaman damgasıyla like_count
tablolaştırılacak (ör.: last_ updated
).
Bu senaryoda, DynamoDB akışları ve Lambda işlevleri, like_count'u tabloda bir öznitelik olarak tablolaştırmak için kullanılır.
Diğer bir seçenek ise toplamaları Elasticsearch gibi başka bir veritabanına aktarmaktır. Elasticsearch, özünde bir arama dizini olup, toplama işlevlerini desteklemek için ek uzantılara sahiptir. Bu uzantılardan biri, belge değerlerini sütun odaklı bir şekilde depolamak için dizin zamanında oluşturulmuş bir yapı olan doc value'dur . Yapı, varsayılan olarak belge değerlerini destekleyen alanlara uygulanır ve belge değerleriyle birlikte gelen bazı depolama şişkinlikleri vardır. Yalnızca DynamoDB verilerindeki toplamalar için desteğe ihtiyacınız varsa geniş veri kümeleri üzerindeki analitik sorgular için verileri verimli bir şekilde sıkıştırabilen bir veri ambarı kullanmak daha uygun maliyetli olabilir.
Elasticsearch'ün toplama çerçevesine üst düzey bir genel bakış:
Kova toplamaları : Paketlemeyi SQL veritabanları dünyasındaki GROUP BY
benzer şekilde düşünebilirsiniz. Belgeleri alan değerlerine veya aralıklara göre gruplandırabilirsiniz. Elasticsearch paket toplamaları aynı zamanda birleştirme desteği eksikliğinin yaygın geçici çözümleri olan iç içe toplamayı ve üst-alt toplamayı da içerir.
Metrik toplamalar: Metrikler, bir dizi belge üzerinde SUM
, COUNT
, AVG
, MIN
, MAX
vb. gibi hesaplamalar yapmanıza olanak tanır. Metrikler aynı zamanda bir paket toplamaya ilişkin değerleri hesaplamak için de kullanılabilir.
Boru hattı toplamaları : Boru hattı toplamalarına ilişkin girdiler, belgelerden ziyade diğer toplamalardır. Yaygın kullanımlar arasında ortalamalar ve bir metriğe dayalı sıralama yer alır.
Toplamaları kullanırken, özellikle de Elasticsearch'ü ölçeklendirirken performansla ilgili sonuçlar ortaya çıkabilir.
Elasticsearch, DynamoDB'den gelen veriler üzerinde karmaşık arama ve toplama işlemleri yapmak için bir çözüm olsa da, birçok sunucusuz destekçisi bu seçimle ilgili endişelerini dile getirdi. Mühendislik ekipleri DynamoDB'yi, sunucusuz olması ve çok az operasyonel ek yük ile uygun ölçekte kullanılabildiği için seçiyor. Kurulum kolaylığı, bakım, sorgu yeteneği ve gecikmeye ilişkin Athena, Spark ve Rockset dahil olmak üzere DynamoDB'deki analizlere yönelik diğer birkaç seçeneği başka bir blogda değerlendirdik.
Rockset, Elasticsearch'e bir alternatiftir ve Alex DeBrie, Rockset'te SQL kullanarak sorguların filtrelenmesi ve toplanması konusunda ayrıntılı bilgi vermiştir. Rockset , DynamoDB'ye yerleşik bir bağlayıcıya sahip, bulutta yerel bir veritabanıdır ve karmaşık birleştirmeleri içeren kullanım senaryoları da dahil olmak üzere analitik kullanım senaryolarını başlatmayı ve ölçeklendirmeyi kolaylaştırır. Rockset'i, Elasticsearch'e alternatif olarak 300 $ krediyle ücretsiz denememizde keşfedebilirsiniz.