Amazon DynamoDB - Amazon DynamoDB

Amazon DynamoDB
DynamoDB.png
Geliştirici (ler)Amazon.com
İlk sürümOcak 2012; 8 yıl önce (2012-01)[1]
İşletim sistemiÇapraz platform
Uyguningilizce
Tür
LisansTescilli
İnternet sitesiaws.Amazon.com/ dynamodb/

Amazon DynamoDB tamamen yönetilen bir tescillidir NoSQL veri tabanı destekleyen hizmet anahtar / değer ve veri yapılarını belgeleyin[2] ve tarafından sunulmaktadır Amazon.com bir parçası olarak Amazon Web Hizmetleri portföy.[3] DynamoDB, benzer bir veri modelini ortaya çıkarır ve adını Dinamo, ancak temelde farklı bir uygulamaya sahiptir. Dynamo, istemcinin sürüm çakışmalarını çözmesini gerektiren çok liderli bir tasarıma sahipti ve DynamoDB birden çok cihazda eşzamanlı çoğaltma kullanıyor veri merkezleri[4] yüksek dayanıklılık ve kullanılabilirlik için. DynamoDB, Amazon CTO tarafından duyuruldu Werner Vogels 18 Ocak 2012 tarihinde,[5] ve bir evrim olarak sunulur Amazon SimpleDB çözüm.[6]

Arka fon

Werner Vogels Amazon.com CTO'su, 2012 duyurusunda proje için bir motivasyon sağladı.[5] Amazon, merkezi olmayan bir hizmet ağı olarak başladı. Başlangıçta, hizmetlerin birbirlerinin veritabanlarına doğrudan erişimi vardı. Bu, mühendislik operasyonlarında bir tıkanıklığa dönüştüğünde, hizmetler bu doğrudan erişim modelinden, halka dönük lehine uzaklaştı. API'ler. Yine de üçüncü taraf ilişkisel veritabanı yönetim sistemleri Amazon'un müşteri tabanını idare etmekte zorlandı. Bu, yüksek trafik altında birkaç teknolojinin başarısız olduğu 2004 tatil sezonunda doruğa ulaştı.

Mühendisler bu ilişkisel sistemleri normalleştiriyorlardı. veri yedekleme, depolamayı optimize eden bir tasarım. Fedakarlık: Verilerin belirli bir "öğesini" (örneğin, bir ürün veritabanındaki bir ürünle ilgili bilgiler) çeşitli ilişkilerde depoladılar ve bir sorgu için ayrık parçaları bir araya getirmek zaman alır. Amazon'un hizmetlerinin birçoğu, verilerinde çoğunlukla birincil anahtar okumalarını talep etti ve hızlı bir şekilde, bu parçaları bir araya getirmek son derece vergilendiriciydi.[7]

Depolama verimliliğinden ödün veren içerik, Amazon'un yanıtı Dinamo: Dahili kullanım için oluşturulmuş, yüksek oranda erişilebilir bir anahtar-değer deposu.[5] Görünüşe göre dinamo, mühendislerinin ihtiyaç duyduğu her şeydi, ancak benimseme gecikti. Amazon'un geliştiricileri, "sadece çalışır" tasarım modellerini seçtiler. S3 ve SimpleDB. Bu sistemler göze çarpan tasarım kusurlarına sahipken, donanım sağlama ve verileri ölçeklendirme ve yeniden bölümleme ek yükünü talep etmediler. Amazon'un bir sonraki yinelemesi NoSQL teknoloji, DynamoDB, bu veritabanı yönetimi işlemlerini otomatikleştirdi.

Genel Bakış

Web konsolu
Web konsolu

DynamoDB, geliştiricilerin aşağıdakilere dayalı bir hizmet satın almalarına izin vererek diğer Amazon hizmetlerinden farklıdır: çıktı, ziyade depolama. Otomatik Ölçeklendirme etkinleştirilmişse, veritabanı ölçek otomatik olarak.[8] Buna ek olarak, yöneticiler üretim değişiklikleri talep edebilir ve DynamoDB, verileri ve trafiği bir dizi sunucuya yayar. Yarıiletken sürücüler öngörülebilir performansa izin verir.[3] İle entegrasyon sunar Hadoop üzerinden Elastic MapReduce.[9]

Amazon, Eylül 2013'te geliştiricilerin DynamoDB destekli uygulamaları yerel olarak test edebilmesi için DynamoDB'nin yerel geliştirme sürümünü kullanıma sundu.[10]

Geliştirme hususları

Veri modelleme

Web konsoluna genel bakış

Bir DynamoDB masa özniteliklere sahip öğeler içerir, bunlardan bazıları bir birincil anahtar.[11] Bununla birlikte, ilişkisel sistemlerde, bir öğe her tablo özniteliğini içerir (veya yokluğunda "boş" ve "bilinmeyen" değerleri karıştırır), DynamoDB öğeleri şemasızdır. Tek istisna: Bir tablo oluştururken, bir geliştirici birincil bir anahtar belirler ve tablo her öğe için bir anahtar gerektirir. Birincil anahtarlar skaler olmalıdır (Teller, sayılar veya ikili ) ve iki formdan birini alabilir. Tek öznitelikli birincil anahtar, tablonun "bölüm anahtarı" olarak bilinir ve bu anahtar, bir öğenin karmalar –– aşağıda bölümlemeyle ilgili daha fazlası –– bu nedenle ideal bir bölüm anahtarı, aralığı boyunca tekdüze bir dağılıma sahiptir. Birincil anahtar, DynamoDB'nin tablonun "sıralama anahtarı" olarak adlandırdığı ikinci bir özniteliği de içerebilir. Bu durumda, bölüm anahtarlarının benzersiz olması gerekmez; her öğe için benzersiz bir tanımlayıcı oluşturmak üzere sıralama anahtarlarıyla eşleştirilirler. Bölüm anahtarı, öğenin hangi bölümde saklandığını belirlemek için hala kullanılır, ancak her bölüm içinde öğeler sıralama anahtarına göre sıralanır.

Endeksler

İlişkisel modelde, endeksler tipik olarak "yardımcı" işlevi görür veri yapıları bir tabloyu tamamlamak için. DBMS'nin başlık altındaki sorguları optimize etmesine izin verirler ve sorgu işlevselliğini geliştirmezler. DynamoDB'de yok sorgu iyileştirici ve bir dizin, orijinalin yanında oturan farklı bir anahtarı (veya iki) olan başka bir tablodur.[11] Bir geliştirici bir dizin oluşturduğunda, verilerinin yeni bir kopyasını oluşturur, ancak yalnızca belirledikleri alanlar kopyalanır (en azından, dizine aldıkları alanlar ve orijinal tablonun birincil anahtarı).

DynamoDB kullanıcıları, sorgularını doğrudan dizinlerine gönderir. Kullanılabilir iki tür endeks vardır. Genel bir ikincil dizin, orijinal tablonun bölüm anahtarından farklı bir bölüm anahtarı (ve isteğe bağlı sıralama anahtarı) içerir. Yerel bir ikincil dizin, orijinal tablo ile aynı bölüm anahtarına, ancak farklı bir sıralama anahtarına sahiptir. Her iki dizin de, yeni anahtarlarda sorgulara izin vererek DynamoDB veritabanına tamamen yeni sorgu işlevselliği sunar. İlişkisel veritabanı yönetim sistemlerine benzer şekilde, DynamoDB, ekleme / güncelleme / silme işlemlerinde endeksleri otomatik olarak günceller, bu nedenle bunları oluştururken dikkatli olmanız veya çok sayıda dizin güncellemesi ile yazma ağırlıklı bir veritabanını yavaşlatma riskiyle karşı karşıya kalmanız gerekir.

Sözdizimi

DynamoDB kullanımları JSON her yerde olması nedeniyle sözdizimi için.[kaynak belirtilmeli ] Tablo oluşturma eylemi yalnızca üç bağımsız değişken gerektirir: TableName, KeySchema –– bir bölüm anahtarı ve isteğe bağlı bir sıralama anahtarı içeren bir liste –– ve AttributeDefinitions– en azından bölüm olarak kullanılan öznitelikler için tanımları içermesi gereken, tanımlanacak özniteliklerin bir listesi ve anahtarları sıralayın. Buna karşılık ilişkisel veritabanları güçlü sorgu dilleri sunar, DynamoDB yalnızca Put, Get, Update ve Delete işlemleri sunar. Yerleştirme istekleri, öğenin sahip olduğu tüm özelliklerden ve değerlerden oluşan TableName özniteliğini ve bir Öğe özniteliğini içerir. Bir Güncelleme isteği aynı sözdizimini izler. Benzer şekilde, bir öğeyi almak veya silmek için bir TableName ve Key belirtmeniz yeterlidir.

Sistem mimarisi

DynamoDB'de oluşturma tablosu

Veri yapıları

DynamoDB kullanımları hashing ve B ağaçları verileri yönetmek için. Girişte, veriler önce bölüm anahtarında hashing yapılarak farklı bölümlere dağıtılır. Her bölüm 10GB'a kadar veri depolayabilir ve varsayılan olarak 1.000 yazma kapasitesi birimi (WCU) ve 3.000 okuma kapasitesi birimi (RCU) işleyebilir.[12] Bir RCU, birini temsil eder son derece tutarlı saniyede bir veya iki okuma sonunda tutarlı 4KB boyutuna kadar öğeler için saniyede okur.[11] Bir WCU, boyutu 1 KB'a kadar olan bir öğe için saniyede bir yazmayı temsil eder.

Veri kaybını önlemek için DynamoDB, iki katmanlı bir replikasyon ve uzun vadeli depolama sistemine sahiptir.[13] Her bölüm, her biri o bölümün verilerinin bir kopyasını içeren üç düğüme sahiptir. Her düğüm ayrıca iki veri yapısı içerir: öğeleri bulmak için kullanılan bir B ağacı ve düğümde yapılan tüm değişiklikleri not eden bir çoğaltma günlüğü. DynamoDB, periyodik olarak bu iki veri yapısının anlık görüntülerini alır ve bunları bir ay boyunca S3 böylece mühendisler veritabanlarının belirli bir noktaya kadar geri yüklemelerini gerçekleştirebilir.

Her bölüm içinde, üç düğümden biri "lider düğüm" olarak adlandırılır. Tüm yazma işlemleri, yayılmadan önce lider düğüm boyunca ilerler ve bu da DynamoDB'de yazma işlemlerinin tutarlı olmasını sağlar. Lider, durumunu korumak için her 1,5 saniyede bir diğer düğüme bir "kalp atışı" gönderir. Başka bir düğüm kalp atışlarını durdurursa, yeni bir lider seçimi başlatabilir. DynamoDB, Paxos algoritması liderleri seçmek.

Amazon mühendisleri, bölümleri ve düğümleri sağlama ve yönetme gibi mühendislik ek yükleri nedeniyle başlangıçta Dynamo'dan kaçındı.[7] Buna yanıt olarak DynamoDB ekibi, bir veritabanını yönetmek için AutoAdmin'i çağırdığı bir hizmet oluşturdu.[13] AutoAdmin, başka bir düğümden veri kopyalayarak yanıt vermeyi durdurduğunda bir düğümün yerini alır. Bir bölüm, üç eşik değerinden (RCU, WCU veya 10GB) herhangi birini aştığında, AutoAdmin verileri daha fazla bölümlere ayırmak için otomatik olarak ek bölümler ekleyecektir.[12]

İlişkisel modeldeki indeksleme sistemleri gibi, DynamoDB bir tablodaki tüm güncellemelerin tablonun indekslerinin her birine yansıtılmasını talep eder. DynamoDB bunu, her düğümdeki çoğaltma günlüklerine abone olan ve gerektiğinde dizinlere ek Koyma, Güncelleme ve Silme istekleri gönderen "günlük yayıcı" olarak adlandırdığı bir hizmeti kullanarak ele alır.[13] Dizinler yazma istekleri için önemli performans isabetleri ile sonuçlandığından, DynamoDB herhangi bir tabloda bir kullanıcıya en fazla beş tanesine izin verir.[kaynak belirtilmeli ]

Sorgu yürütme

Bir DynamoDB kullanıcısının bir yazma işlemi (Koy, Güncelle veya Sil) yayınladığını varsayalım. Tipik bir ilişkisel sistem SQL sorgusunu ilişkisel cebir ve optimizasyon algoritmalarını çalıştırdığınızda, DynamoDB her iki süreci de atlar ve hemen çalışmaya başlar.[13] İstek DynamoDB istek yönlendiricisine ulaşır ve kimlik doğrulaması yapar - "İstek nereden / kimden geliyor?" - ve yetkilendirme kontrolü yapar - - "İsteği gönderen kullanıcı gerekli izinlere sahip mi?" Bu kontrollerin başarılı olduğunu varsayarsak, sistem isteğin bölüm anahtarını uygun bölüme ulaştırmak için hashlar. İçinde her biri bölüm verilerinin bir kopyasını içeren üç düğüm vardır. Sistem önce lider düğüme yazar, ardından ikinci bir düğüme yazar, ardından bir "başarı" mesajı gönderir ve son olarak üçüncü düğüme yayılmaya devam eder. Yazılar tutarlıdır çünkü her zaman önce lider düğümden geçerler.

Son olarak, günlük yayıcı, değişikliği tüm endekslere yayar. Her bir dizin için, o dizinin birincil anahtar değerini öğeden alır, ardından bu dizine günlük yayılımı olmadan aynı yazmayı gerçekleştirir. İşlem önceden var olan bir öğenin Güncellemesiyse, güncellenen öznitelik bir dizin için birincil anahtar görevi görebilir ve bu nedenle bu dizine ilişkin B ağacının da güncellenmesi gerekir. B ağaçları yalnızca ekleme, silme ve okuma işlemlerini işler, bu nedenle pratikte, günlük yayıcı bir Güncelleme işlemi aldığında, tüm dizinlere hem bir Silme işlemi hem de bir Koyma işlemi yayınlar.

Şimdi bir DynamoDB kullanıcısının bir Alma işlemi yayınladığını varsayalım. Talep yönlendiricisi, kimlik doğrulama ve yetkilendirme ile önceki gibi devam eder. Sonra, yukarıdaki gibi, uygun hash'e ulaşmak için bölüm anahtarımızı hash ederiz. Şimdi, bir sorunla karşılaşıyoruz: Nihayetinde birbiriyle tutarlı olan üç düğüm ile, hangisini araştıracağımıza nasıl karar verebiliriz? DynamoDB, kullanıcıya bir okuma verirken iki seçenek sunar: tutarlı ve nihayetinde tutarlı. Tutarlı bir okuma, lider düğümü ziyaret eder. Ancak, tutarlılık-kullanılabilirlik ödünleşimi burada yine başını çekiyor: okuma ağırlıklı sistemlerde, her zaman liderden okumak tek bir düğümü alt edebilir ve kullanılabilirliği azaltabilir.

İkinci seçenek, bir Sonuçta tutarlı okuma, rastgele bir düğüm seçer. Uygulamada, DynamoDB'nin kullanılabilirlik için tutarlılık değiş tokuşu burada yapılır. Bu rotayı takip edersek, tutarsızlık ihtimali nedir? "Başarılı" yı döndürmek ve üçüncü düğüme yayılmaya başlamak, ancak bitirmek için bir yazma işlemine ihtiyacımız var. Bu üçüncü düğümü hedeflemek için Get'imize de ihtiyacımız var. Bu, yazma işleminin yayılma penceresinde 1'de 3 tutarsızlık şansı anlamına gelir. Bu pencere ne kadar uzun? Herhangi bir sayıda felaket, bir düğümün geride kalmasına neden olabilir, ancak çoğu durumda, üçüncü düğüm, liderden sonraki milisaniyeler içinde güncellenir.

Verim

Kapasite sekmesi, ölçeklendirme

DynamoDB, kullanıcıların doğru şekilde sağlamasına ve DynamoDB kullanan uygulamaların sorunsuz çalışmasını sağlamasına yardımcı olan performans ölçümlerini ortaya çıkarır:

  • İstekler ve kısıtlama
  • Hatalar: ProvisionedThroughputExceededException, ConditionalCheckFailedException, Dahili Sunucu Hatası (HTTP 500)
  • İle ilgili metrikler Küresel İkincil Endeksi oluşturma[14]

Bu ölçümler kullanılarak izlenebilir AWS AWS'yi kullanarak Yönetim Konsolu Komut satırı arayüzü veya entegre bir izleme aracı Amazon CloudWatch.[15]


Dil bağlamaları

DynamoDB ile diller ve çerçeveler bağlayıcı Dahil etmek Java, JavaScript, Node.js, Git, C # .AĞ, Perl, PHP, Python, Yakut, Haskell, Erlang, Django, ve Taneler.[16]

Kod örnekleri

AWS DynamoDB: öğe görünümü

Karşısında HTTP API, sorgu öğeleri:

İLETİ / HTTP /1.1Ana bilgisayar: dynamodb. . ;Kodlamayı Kabul Et: Kimlikİçerik Uzunluğu: <PayloadSizeBytes>Kullanıcı-Aracı: <UserAgentString>İçerik türü: uygulama / x-amz-json-1.0Yetki: AWS4-HMAC-SHA256 Kimlik Bilgisi = , SignedHeaders = , İmza = <İmza>X-Amz-Tarihi: <Date>X-Amz-Hedef: DynamoDB_20120810.Sorgu{    "Tablo ismi": "Yanıtla",    "DizinAdı": "Yayınlanan Dizin",    "Sınır": 3,    "ConsistentRead": doğru,    "ProjectionExpression": "Kimlik, PostedBy, ReplyDateTime",    "KeyConditionExpression": "Kimlik =: v1 VE YayınlananBETWEEN: v2a AND: v2b",    "ExpressionAttributeValues": {        ": v1": {"S": "Amazon DynamoDB # DynamoDB İş Parçacığı 1"},        ": v2a": {"S": "Kullanıcı A"},        ": v2b": {"S": "Kullanıcı C"}    },    "ReturnConsumedCapacity": "TOPLAM"}

Örnek yanıt:

HTTP /1.1 200 TAMAM MIx-amzn-RequestId: <RequestId>x-amz-crc32: <Checksum>İçerik türü: uygulama / x-amz-json-1.0İçerik Uzunluğu: <PayloadSizeBytes>Tarih: <Date> {    "Tüketilen Kapasite": {        "CapacityUnits": 1,        "Tablo ismi": "Yanıtla"    },    "Miktar": 2,    "Öğeler": [        {            "ReplyDateTime": {"S": "2015-02-18T20: 27: 36,165Z"},            "Tarafından gönderildi": {"S": "Kullanıcı A"},            "İD": {"S": "Amazon DynamoDB # DynamoDB İş Parçacığı 1"}        },        {            "ReplyDateTime": {"S": "2015-02-25T20: 27: 36,165Z"},            "Tarafından gönderildi": {"S": "B Kullanıcısı"},            "İD": {"S": "Amazon DynamoDB # DynamoDB İş Parçacığı 1"}        }    ],    "ScannedCount": 2}

GetItem girişi Git:

getItemInput := &dinamodb.GetItemInput{	Tablo ismi: aws.Dize("mutlu pazarlamacı"),	Anahtar: harita[dizi]*dinamodb.AttributeValue{		"pk": {			S: aws.Dize("proje"),		},		"sk": {			S: aws.Dize(e-posta + " " + isim),		},	},}getItemOutput, hata := dynamodbClient.GetItem(getItemInput)

DeleteItem in Git:

deleteItemInput := &dinamodb.DeleteItemInput{	Tablo ismi: aws.Dize("mutlu pazarlamacı"),	Anahtar: harita[dizi]*dinamodb.AttributeValue{		"pk": {			S: aws.Dize("proje"),		},		"sk": {			S: aws.Dize(e-posta + " " + isim),		},	},}_, hata := dynamodbClient.Öğeyi silmek(deleteItemInput)Eğer hata != sıfır {	panik(hata)}

UpdateItem Go kullanarak İfade Oluşturucu:

Güncelleme := ifade.Ayarlamak(	ifade.İsim(isim),	ifade.Değer(değer),)ifade, hata := ifade.NewBuilder().WithUpdate(Güncelleme).İnşa etmek()Eğer hata != sıfır {	panik(hata)}updateItemInput := &dinamodb.UpdateItemInput{	Tablo ismi: aws.Dize(Tablo ismi),	Anahtar: harita[dizi]*dinamodb.AttributeValue{		"pk": {			S: aws.Dize("proje"),		},		"sk": {			S: aws.Dize("mySortKeyValue"),		},	},	UpdateExpression:          ifade.Güncelleme(),	ExpressionAttributeNames:  ifade.İsimler(),	ExpressionAttributeValues: ifade.Değerler(),}fmt.Printf("updateItemInput:% # v  n", updateItemInput)_, hata = dynamodbClient.UpdateItem(updateItemInput)Eğer hata != sıfır {	panik(hata)}

Ayrıca bakınız

Referanslar

  1. ^ "Amazon DynamoDB - İnternet Ölçekli Uygulamalar için Tasarlanmış Hızlı ve Ölçeklenebilir NoSQL Veritabanı Hizmeti - Her Şey Dağıtılmış". www.allthingsdistributed.com.
  2. ^ "Amazon DynamoDB - SSS". Amazon Web Services, Inc.
  3. ^ a b Clark, Jack (2012-01-19). "Amazon, DynamoDB bulut veritabanı hizmetini etkinleştiriyor". ZDNet. Alındı 2012-01-21.
  4. ^ "SSS: Ölçeklenebilirlik, Kullanılabilirlik ve Dayanıklılık". Amazon Web Hizmetleri.
  5. ^ a b c Vogels, Werner (2012-01-18). "Amazon DynamoDB - İnternet Ölçekli Uygulamalar için Tasarlanmış Hızlı ve Ölçeklenebilir NoSQL Veritabanı Hizmeti". Dağıtılmış Her Şey blogu. Alındı 2012-01-21.
  6. ^ "Amazon DynamoDB - SSS". Amazon Web Services, Inc. Alındı 2019-06-03.
  7. ^ a b DeCandia, Giuseppe; Hastorun, Deniz; Jampani, Madan; Kakulapati, Günavardhan; Lakshman, Avinash; Pilchin, Alex; Sivasubramanyan, Swaminathan; Vosshall, Peter; Vogels, Werner (Ekim 2007). "Dynamo: Amazon'un Yüksek Erişilebilir Anahtar-Değer Deposu". SIGOPS Oper. Syst. Rev. 41 (6): 205–220. doi:10.1145/1323293.1294281. ISSN  0163-5980.
  8. ^ "DynamoDB Otomatik Ölçeklendirme ile Aktarım Kapasitesinin Otomatik Olarak Yönetilmesi". Amazon DynamoDB. Alındı 2017-07-05.
  9. ^ Gray, Adam (25 Ocak 2012). "AWS HowTo: Amazon Elastic MapReduce'u DynamoDB ile Kullanma (Konuk Gönderi)". AWS Haber Blogu. Alındı 29 Ekim 2019.
  10. ^ "Masaüstü Geliştirme için DynamoDB Local". Amazon Web Hizmetleri. 12 Eylül 2013. Alındı 13 Eylül 2013.
  11. ^ a b c "Amazon DynamoDB Geliştirici Kılavuzu". AWS. 10 Ağustos 2012. Alındı 18 Temmuz 2019.
  12. ^ a b Günasekara, Archie (2016-06-27). "DynamoDB Bölümlerine Ayrıntılı Bir Bakış". Shine Solutions Group. Alındı 2019-08-03.
  13. ^ a b c d AWS re: Invent 2018: Amazon DynamoDB Under the Hood: How We Build a Hyper-Scale Database (DAT321), alındı 2019-08-03
  14. ^ "En iyi DynamoDB performans ölçümleri".
  15. ^ "DynamoDB metrikleri nasıl toplanır?".
  16. ^ "Amazon DynamoDB Kitaplıkları, Haritacıları ve Sahte Uygulamaları Bolca!". Amazon Web Hizmetleri.

Dış bağlantılar