DynamoDB tablosundan büyük veriler nasıl silinir?

Terabaytlarca veriyi AWS DynamoDB tablolarından silmekle görevlendirildiğinde, aşağıdaki yaklaşımları denedim.

1) Mevcut tabloyu bırak & amp; yeniden oluşturun

2) TTL (Geçerlilik Süresi) sütununu güncelleme

3) Öğeyi sil kullanarak sil

4) Toplu yazma öğesini kullanarak silme

Amazon DynamoDB’de, bir tablodaki her öğe, birincil anahtarıyla benzersiz bir şekilde tanımlanır. Bu nedenle birincil anahtar, DynamoDB tablosuna yazılan her öğeye dahil edilmelidir. Benim durumumda, bu bileşik birincil anahtardır; burada birinci öznitelik bir bölüm / karma anahtarı ve ikinci öznitelik bir sıralama / aralık anahtarıdır.

1) Mevcut tabloyu kaldır & amp; yeniden oluşturun

Tüm öğeleri silmeniz gerekiyorsa, DynamoDB tablosunu kaldırıp yeniden oluşturmayı düşünebilirsiniz.

Bu, en hızlı & amp; en basit yöntem, eğer tüm öğeler tablodan silinecekse, her bir öğeyi taramak ve silmek için zaman harcamadan.

DeleteTable komutu / API, tabloyu ve tüm öğelerini siler. Tablonun silinmesi yaklaşık 2-4 dakika sürebilir.

Daha önce sahip olduğunuz ayarları korumak istiyorsanız, şema eşleştirme –generate-cli-skeleton bayrağına ihtiyacınız var.

Ancak, tablo için kesinti olacaktır. Kesinti süresi, tablo silme süresine, oluşturma süresine ve DynamoDB tablo özelliklerini değiştirme / güncelleme süresine bağlıdır.

Bu yaklaşımı üretim dışı veritabanlarında denedim, ancak üretimde bu kesinti yaklaşımını izleyemiyorum.

Uygulama kodu değişikliğini içeren yeni tablo adını kullanmaya gücünüz yetiyorsa, yepyeni bir tablo oluşturun ve bu tabloya yazmaya başlayın ve daha sonra eski tabloyu kaldırabilirsiniz. DynamoDB tablosunu yeniden adlandırmanın doğrudan bir yolu yoktur .

2) Öğeleri DynamoDB’den silmek için TTL sütununu güncelleme

TTL (Yaşam Süresi) özelliği, DynamoDB tablo öğesinin sona erme zaman damgasıdır. TTL özellikleri Sayı veri türü olmalıdır.

Bizim durumumuzda veriler, TTL sütunu doldurulmadan DynamoDB tablosuna eklendi.

Tablodaki öğelerin TTL’sini değiştirmek, her öğenin TTL özniteliğinin değerinin güncellenmesini gerektirir. Bu nedenle, silmek istediğiniz sonuçları tarayıp filtrelemeniz ve ardından TTL değerini güncellemek için tüm öğelerde bir güncelleme öğesi gerçekleştirmeniz gerekir.

toplu yazma öğesinde güncelleme öğesini kullanamayız, yalnızca koyma ve silme isteklerini kullanabiliriz.

TTL sütununu (sıfırsa) mevcut / geçmiş dönem zaman biçimiyle (ör. 1587191489) güncellemeyi denedim. Dönem süresi 5 yıldan eski olmamalıdır.

Dönem zamanı, 1 Ocak 1970’ten bu yana geçen saniye sayısıdır.

Mevcut çağ saatini öğrenmek için, herhangi bir UNIX çeşnili makinede “ tarih +% s ” komutunu çalıştırabiliriz.

Tarama işlemini çalıştırmadan önce, yeterli RCU yoksa veya talep üzerine yoksa, RCU’ları (Okuma Kapasite Birimleri) artırmanız gerekir.

TTL, geçerli saati bir öğenin TTL özelliğinde depolanan zamanla karşılaştırır.

DynamoDB, diğer veri işlemleri için aktarım hızının (WCU) kullanılabilirliğini sağlamak için süresi dolan öğeleri en iyi şekilde siler.

TTL sona erdikten sonra, kayıt silinmek üzere işaretlenecek ve bu kayıt 48 saat içinde silinecektir (AWS’ye göre). 15 günden daha uzun süreceğini gözlemledim, masa boyutuna bağlı. iş yükü.

TTL silmeleri, kapasite birimlerine veya talep birimlerine sayılmaz. TTL silme işlemleri ücretsizdir.

Tablo boyutunu küçültmek veya eski verilerden kurtulmak istiyorsanız, TTL’yi güncellemek önerilen yaklaşım değildir .

3) Delete-item command / API kullanarak DynamoDB’den kayıt silme

RDBMS veritabanlarının çoğunda, silme komutları kesin değerleri veya kalıbı kabul eden koşulla çalışır ve where cümlesi içinde birincil olmayan anahtar sütunları kullanarak silme sorguları çalıştırabiliriz.

Ancak, DynamoDB gibi NoSQL veritabanlarında, silme koşulunda tam değerler sağlamalıyız ve hem birincil anahtarı hem de her öğenin aralık anahtar değerleri.

Amazon DynamoDB’de, DeleteItem API her seferinde bir öğeyi siler.

öğeyi sil ‘de, koşullu silmeler ( koşul ifadesi bağımsız değişkeni kullanılarak) yalnızca belirli koşullar karşılandığında öğelerin silinmesi için yararlıdır.

Öğeler silindikçe, varsa yerel ikincil dizinlerden ve genel ikincil dizinlerden kaldırılırlar.

Tablodaki öğeleri silmek için tarama ve filtreleme yapıyordum.

Tek bir Tarama işlemi – max-items / Limit ile belirtilen maksimum öğe sayısını okur.

Tarama işlemleri sırayla ilerler, daha büyük tablolarda daha hızlı performans için Segment ve TotalSegments parametrelerini sağlayarak paralel bir Tarama işlemi talep edebiliriz.

TotalSegments , tabloya aynı anda erişecek toplam çalışan sayısını gösterir.

Segment , çağıran işçi / komut dosyası tarafından erişilecek tek tek tablo segmentini gösterir. Segment , 0’a eşit veya 0’dan büyük ve TotalSegments için sağlanan değerden küçük olmalıdır.

Segmentasyon / sayfalandırma kullanıyordum, 10 segmentte çalışıyordum ve her segment 1000 öğeyi siliyordu, bu da 20-30 dakika sürüyordu. Dolayısıyla, 10.000 öğeyi silmek için komut dosyası yaklaşık 20-30 dakika sürüyordu.

4) DynamoDB öğelerinin (AWS CLI) toplu yazma öğesi kullanılarak toplu olarak silinmesi

BatchWriteItem işlemi, birden çok öğeyi bir veya daha fazla tabloya yerleştirir veya siler.

Süreci hızlandırmak için öğeleri tek tek silmek yerine bir BatchWriteItem çağrısında 25 adede kadar öğeyi silebilirsiniz.

CLI’deki toplu yazma öğesi , bireysel silme isteğini belirten bir RequestItems JSON gerektirir.

JQ yardımcı programını kullanarak, Tarama sonucu sayfasını istek öğeleri biçimine dönüştürebiliriz.

tara komutunu çalıştırmadan önce, RCU’ları artırın (Kapasite Birimlerini Oku) ve toplu-yazma-öğe CLI / API komutunu çalıştırmadan önce , WCU’ları artırın (Yazma Kapasitesi Birimleri).

Daha fazla segment kullanıyordum, bu da her bir tarama segmentinin sonuç kümesini azaltabilir, bu da segment sayısına göre eşdeğer paralel öğe silme çağrılarının yapılmasına yardımcı olur. Bu, silme işleminin paralelliğini artıracak ve öğelerin tablodan silinmesini hızlandırmaya yardımcı olacaktır.

BatchWriteItem ‘de bahsedilen DeleteItem işlemleri atomiktir. İşlemler herhangi bir hata nedeniyle başarısız olursa, çıktıda yalnızca başarısız işlemler döndürülür.

Temmuz 2020 itibarıyla toplu yazma öğesindeki 25 istek , DynamoDB’de kesin bir sınırdır ve artırılamaz.

Açıkçası, silinecek kayıtlar listemizde 25’ten fazla kayıt olacak, bu nedenle tüm kayıtları yinelemek için döngüler kullanmamız gerekiyor.

Döngüler kullanarak tarama (her segment için):

Döngüler kullanarak silme (her segment için):

100 segmentli öğeyi sil komutunu kullanarak, komut dosyaları dakikada 2500-2700 öğeyi silebilir (c5.4xlarge EC2 makinesinde).

100 segmentli toplu-yaz-öğe komutunu kullanarak, komut dosyaları dakikada 28000-45000 öğeyi silebilir (c5.4xlarge EC2 makinesinde).

Aynı silme işlemini r5 (r5.4xlarge) ve m5 (m5.4xlarge) EC2 makinelerinde denedim, ancak DynamoDB silme için yeterince hızlı değiller.

toplu yazma öğesi , c5 örnek türü ile saatte 5 milyondan fazla kaydı silmeme yardımcı oldu.

Özet

jq , JSON sorgu işlemcisi, DynamoDB sorguları tarafından sağlanan JSON çıktısını oynatabileceğimiz ve biçimlendirebileceğimiz için çok yararlıdır.

Üretim öncesi veritabanları veya kritik olmayan AWS DynamoDB tabloları için, mevcut tabloyu bırakmanız, boş tabloyu yeniden oluşturmanız ve kullanmaya başlamanız gereken kesinti süresi yaklaşımını izlemek daha iyidir.

Üretim veritabanları ve kritik Amazon DynamoDB tabloları için, tera baytlık veriyi temizlemek için toplu yazma öğesinin kullanılması önerilir.

toplu yazma öğesi ( DeleteRequest ile) öğeyi sil ’den 10 ila 15 kat daha hızlıdır.