ডায়নামোডিবি থেকে বিপুল সংখ্যক আইটেম মুছে ফেলার প্রস্তাবিত উপায় কী?


111

আমি ডায়নামোডিবিতে একটি সাধারণ লগিং পরিষেবা লিখছি।

আমার একটি লগ টেবিল রয়েছে যা ইউজার_আইডি হ্যাশ এবং একটি টাইমস্ট্যাম্প (ইউনিক্স ইপোচ ইনট) পরিসীমা দ্বারা সজ্জিত।

যখন পরিষেবাটির কোনও ব্যবহারকারী তাদের অ্যাকাউন্টটি সমাপ্ত করে, সারণির মান নির্বিশেষে আমার সারণীতে থাকা সমস্ত আইটেম মুছতে হবে।

এই ধরণের অপারেশন করার প্রস্তাবিত উপায় কী (লক্ষ লক্ষ আইটেম মুছতে পারে)?

আমার বিকল্পগুলি, যতদূর আমি দেখতে পাচ্ছি:

উত্তর: কোনও আইটেম না রেখে যতক্ষণ না প্রতিটি প্রত্যাবর্তিত আইটেমটিতে ডিলিট কল করে একটি স্ক্যান অপারেশন সম্পাদন করুন

বি: একটি ব্যাচগেট অপারেশন সম্পাদন করুন, আবার কোনও আইটেম না রেখে যতক্ষণ না প্রতিটি আইটেমটিতে ডিলিট কল করুন

এগুলি উভয়ই আমার কাছে ভীষণ ভয়ঙ্কর দেখায় কারণ তারা অনেক দিন সময় নিবে।

আমি আদর্শভাবে যা করতে চাই তা হ'ল লগটবেল.ডিলিটআইটেম (ইউজার_আইডি) - সীমা সরবরাহ না করে এবং এটি আমার জন্য সমস্ত কিছু মুছে ফেলা উচিত।

উত্তর:


52

আমি আদর্শভাবে যা করতে চাই তা হ'ল লগটবেল.ডিলিটআইটেম (ইউজার_আইডি) - সীমা সরবরাহ না করে এবং এটি আমার জন্য সমস্ত কিছু মুছে ফেলা উচিত।

সত্যই একটি বোধগম্য অনুরোধ; আমি এই জাতীয় উন্নত ক্রিয়াকলাপগুলি এডাব্লুএস টিমের মাধ্যমে সময়ের সাথে যুক্ত হতে পারে (তাদের প্রথম গ্রাহকের প্রতিক্রিয়ার ভিত্তিতে সীমিত বৈশিষ্ট্য সেট এবং এক্সটেনশনগুলি মূল্যায়ন করার ইতিহাস রয়েছে) কল্পনা করতে পারি, তবে এখানে ব্যয়টি এড়াতে আপনার কী করা উচিত তা এখানে রয়েছে কমপক্ষে একটি সম্পূর্ণ স্ক্যান:

  1. ব্যবহারের ক্যোয়ারী বদলে স্ক্যান জন্য সব আইটেম পুনরুদ্ধার করতে user_id- এই সম্মিলিত হ্যাশ নির্বিশেষে কাজ করে /, ব্যবহারে প্রাথমিক কী পরিসীমা কারণ HashKeyValue এবং RangeKeyCondition এই API পৃথক পরামিতি এবং সাবেক শুধুমাত্র লক্ষ্য যৌগিক এর হ্যাশ উপাদানের অ্যাট্রিবিউট মান প্রাথমিক কী

    • দয়া করে মনে রাখবেন যে এখানে যথারীতি এখানে কোয়েরি এপিআই পেজিংয়ের সাথে ডিল করতে হবে, এক্সক্লুসিভ স্টার্টকি প্যারামিটারটি দেখুন:

      পূর্ববর্তী কোয়েরি চালিয়ে যাওয়ার জন্য আইটেমের প্রাথমিক কী। পূর্বের ক্যোয়ারী শেষের মূল্যায়ন হিসাবে এই মানটি সরবরাহ করতে পারে যদি কোয়েরিটি শেষ করার আগে যদি সেই ক্যোয়ারী অপারেশনটি বাধাগ্রস্ত হয়; হয় ফলাফল সেট আকার বা সীমা পরামিতি কারণে। সর্বশেষ মূল্যায়নকিকে সেই বিন্দু থেকে ক্রিয়াকলাপ চালিয়ে যাওয়ার জন্য নতুন ক্যোয়ারী অনুরোধে ফেরত দেওয়া যেতে পারে।

  2. সমস্ত প্রত্যাবর্তিত আইটেমের উপর লুপ করুন এবং হয় যথারীতি মুছুন আইটেমকে

    • আপডেট : সম্ভবত ব্যাচউইরাইটআইটিমে এই জাতীয় ব্যবহারের ক্ষেত্রে আরও উপযুক্ত (বিশদগুলির জন্য নীচে দেখুন)।

হালনাগাদ

আইভান্টের দ্বারা হাইলাইট করা হিসাবে , ব্যাচউইরাইটআইটেম ক্রিয়াকলাপ আপনাকে একক এপিআই কল [জোর দেওয়া খনি] তে একাধিক টেবিল জুড়ে বেশ কয়েকটি আইটেম স্থাপন বা মুছতে সক্ষম করে :

একটি আইটেম আপলোড করতে, আপনি পুতআইটেম এপিআই ব্যবহার করতে পারেন এবং একটি আইটেম মুছতে আপনি মুছুন আইটেম এপিআই ব্যবহার করতে পারেন। তবে, আপনি যখন অ্যামাজন ইলাস্টিক ম্যাপ্রেডস (ইএমআর) থেকে বিপুল পরিমাণে ডেটা আপলোড বা অন্য ডাটাবেস থেকে অ্যামাজন ডায়নামোডিবিতে ডেটা মাইগ্রেটের মতো বিশাল পরিমাণে ডেটা আপলোড বা মুছতে চান, তখন এই এপিআই একটি কার্যকর বিকল্প প্রস্তাব করে।

দয়া করে মনে রাখবেন এটির এখনও কিছু প্রাসঙ্গিক সীমাবদ্ধতা রয়েছে, উল্লেখযোগ্য:

  • একক অনুরোধে সর্বাধিক ক্রিয়াকলাপ - আপনি মোট 25 টি পর্যন্ত অপারেশন পুট বা মুছতে পারবেন; তবে, মোট অনুরোধের আকার 1 এমবি (এইচটিটিপি পেলোড) ছাড়িয়ে যাবে না।

  • পারমাণবিক অপারেশন নয় - একটি ব্যাচরাইট্রাইম আইটেমে স্বতন্ত্র অপারেশনগুলি পারমাণবিক; তবে সামগ্রিকভাবে ব্যাচরাইটআইটেমটি একটি "সেরা চেষ্টা" অপারেশন এবং কোনও পারমাণবিক অপারেশন নয়। এটি, একটি ব্যাচরাইটআইটেম অনুরোধে, কিছু ক্রিয়াকলাপ সফল হতে পারে এবং অন্যরা ব্যর্থ হতে পারে। [...]

তবুও এটি সম্ভবত হাতের মতো ব্যবহারের ক্ষেত্রে সম্ভাব্য উল্লেখযোগ্য লাভের প্রস্তাব দেয়।


4
আমি মনে করি দ্বিতীয় পদক্ষেপের জন্য ব্যাচ
মুছাটি

1
@ আইভান্ট - ইঙ্গিতটির জন্য অনেক ধন্যবাদ, এই "মুখোশযুক্ত" ব্যাচউইরটাইমের কার্যকারিতা মুছে ফেলা সত্যই আমাকে তখন পালিয়ে গেছে; আমি সেই অনুযায়ী উত্তর আপডেট করেছি।
স্টিফেন ওপেল

BatchWriteItemআইটেমগুলির সাথে মুছে ফেলার জন্য নির্দিষ্ট করা দরকারTableWriteItems
নীল

1
ব্যাচউইরাইটআইটেমের লিঙ্কটি এখন ডকস.অওস.মাজোন.com
টনি

3
আমি বুঝতে পেরেছি যে এটি পুরানো, এবং ওপি কোনও নির্দিষ্ট ভাষা এসডিকে উল্লেখ করেনি, তবে পাইথনে API এর batch_writer()অংশ হিসাবে একটি উচ্চ স্তরের রয়েছে boto3.resource.Tableযা "স্বয়ংক্রিয়ভাবে ব্যাফগুলিতে বাফারিং এবং আইটেম প্রেরণ করবে handle এছাড়াও, ব্যাচ লেখক কোনও অ-প্রক্রিয়াজাত আইটেম স্বয়ংক্রিয়ভাবে হ্যান্ডেল করুন এবং প্রয়োজনীয় হিসাবে তাদের পুনরায় পাঠান "অর্থাত্ এটি ব্যাচউইরআইটেমের চারপাশে একটি মোড়ক যা বিরক্তিকর অংশগুলি পরিচালনা করে। boto3.amazonaws.com/v1/docamentation/api/latest/references/…
দাভোস

46

ডায়নামোডিবি ডকুমেন্টেশন অনুসারে আপনি কেবল পুরো টেবিলটি মুছতে পারেন।

নিচে দেখ:

"পুরো টেবিলটি মুছে ফেলা একের পর এক আইটেমগুলি অপসারণের চেয়ে উল্লেখযোগ্যভাবে কার্যকর, যা আপনি যতগুলি মুছে ফেলা অপারেশন হিসাবে মুছে ফেলেন অপরিহার্যভাবে লেখার মধ্য দিয়ে দ্বিগুণ করেন"

আপনি যদি নিজের ডেটা কেবলমাত্র একটি উপসেট মুছতে চান, তবে আপনি প্রতি মাস, বছর বা অনুরূপ জন্য আলাদা টেবিল তৈরি করতে পারেন। এইভাবে আপনি "গত মাসে" মুছে ফেলতে এবং আপনার বাকী ডেটা অক্ষত রাখতে পারেন।

আপনি অ্যাডাব্লুএস এসডিকে ব্যবহার করে জাভাতে কোনও টেবিলটি এভাবে মুছবেন:

DeleteTableRequest deleteTableRequest = new DeleteTableRequest()
  .withTableName(tableName);
DeleteTableResult result = client.deleteTable(deleteTableRequest);

8
আমি এই উত্তরটিও পছন্দ করি তবে সাবধানতা: এটি আপনার সিস্টেমে অনেকগুলি সারণী তৈরি করতে পারে এবং আমরা প্রতি টেবিল বিধানের জন্য অর্থ প্রদান করি। সুতরাং, এই টেবিলটি মোছা না হয়ে আপনি মাসের শেষে (যদি আপনার টেবিল প্রতিমাসে থাকে) বিধান কমাতে হবে।
সের্জিও এমসি ফিগুয়েরিডো

2
এই উত্তরটির সাথে একমত হন, এটি প্রয়োগ করা হয় যদি আপনার সমস্ত রেকর্ড মুছে ফেলা প্রয়োজন সারণীটি তৈরি করে, তবে এখানে প্রশ্নকর্তা পুরো টেবিলটি না করে ব্যবহারকারীর বেস এন্ট্রিগুলি মুছতে চান।
ইহতেশাম মিনহাস

1
প্রতিটি ব্যবহারকারীর জন্য পৃথক টেবিল টেবিল থাকা ডায়নামোডিবি মূল্যবান ব্যয়বহুল হবে। প্রতি মাসে একটি টেবিল আসলে জিনিসগুলিকে আরও খারাপ করে দেবে। এটি স্পষ্টভাবে একটি পৃথক, খুব নির্দিষ্ট সমস্যার উত্তর an
আন্দ্রে ওয়ার্ল্যাং

11
আপনি যদি সারণির অংশ হিসাবে নিজের টেবিলটি পরিচালনা করতে ক্লাউডফর্মেশন-এর মতো স্বয়ংক্রিয় ব্যবস্থা ব্যবহার করেন তবে টেবিলটি মোছা আকর্ষণীয় বিকল্প নাও হতে পারে। ক্লাউডফর্মেশনটি আপনি নিজের হাতে মুছে ফেলা একটি টেবিলটি পুনরায় তৈরি করার সহজ উপায় সম্পর্কে অবগত নই।
ব্র্যাবস্টার

2
এই পদ্ধতির পুরো সময়টি অনুপলব্ধ হয়ে টেবিলটি মুছতে এবং পুনরায় তৈরি করতে (যখন প্রয়োজন হয়) বেশ সময় নেয়। প্রশ্নটিতে স্পষ্টভাবে ব্যবহারকারীদের ডেটা অপসারণের কথা বলা হয়েছে, যা ব্যবহারকারীর টেবিলকে পৃথক পৃথক করে দেওয়া হবে ract
আন্দ্রে ওয়ার্ল্যাং

13

আপনি যদি কিছু সময়ের পরে আইটেমগুলি মুছতে চান, উদাহরণস্বরূপ এক মাস পরে, কেবলমাত্র লাইভের জন্য সময় বিকল্পটি ব্যবহার করুন। এটি লেখার ইউনিট গণনা করবে না

আপনার ক্ষেত্রে, লগগুলি মেয়াদ শেষ হয়ে গেলে এবং ব্যবহারকারী মুছে ফেলার পরে সেগুলি ছেড়ে দেওয়ার জন্য আমি টিটিএল যুক্ত করব। টিটিএল নিশ্চিত করবে যে লগগুলি শেষ পর্যন্ত সরানো হবে।

লাইভ টাইম টু লাইভে যখন কোনও টেবিলে সক্ষম করা হয়, তখন একটি পটভূমি কাজ আইটেমের মেয়াদ শেষ হয়ে গেছে কিনা তা দেখার জন্য টিটিএল বৈশিষ্ট্যটি পরীক্ষা করে।

ডায়নামোডিবি সাধারণত মেয়াদোত্তীর্ণ হওয়ার 48 ঘন্টার মধ্যে মেয়াদোত্তীর্ণ আইটেমগুলি মুছে দেয়। মেয়াদোত্তীর্ণ হওয়ার পরে কোনও আইটেমটি সত্যিকার অর্থে মুছে ফেলা হবে তার সঠিক সময়কালটি কাজের চাপের প্রকৃতির এবং টেবিলের আকারের সাথে সুনির্দিষ্ট। মেয়াদ শেষ হয়ে গেছে এবং মোছা হয়নি এমন আইটেমগুলি এখনও পঠন, অনুসন্ধান এবং স্ক্যানগুলিতে প্রদর্শিত হবে। এই আইটেমগুলি এখনও আপডেট করা যেতে পারে এবং মেয়াদোত্তীকরণের বৈশিষ্ট্যটি পরিবর্তন করতে বা সরানোর জন্য সফল আপডেটগুলি সম্মানিত হবে।

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/howitworks-ttl.html


টিটিএল যুক্ত করা একটি "আপডেট" (রচনা অপারেশন)। আমি নিশ্চিত না যে একটি "মুছুন" এর পরিবর্তে "আপডেট" করার কোনও লাভ আছে।
টোমর

আপনার কাছে সেই ডেটা মূল লেখার সাথে sertedোকানো এবং অন্য কোনও আপডেট ক্রিয়াতে আপডেট করা যেতে পারে। অবশ্যই, যদি আপনার কাছে প্রচুর ডেটা থাকে এবং আপনি এটি মুছতে চান তবে এটি কোনও বিকল্প নয়। তবে এটি এমন ক্ষেত্রেগুলির জন্য একটি বৈধ বিকল্প যা আপনার সন্নিবেশ বা আপডেট করা তথ্যের জন্য টিটিএল থাকতে পারে।
লুকাস লিসিস

1
আমি সম্মত হই, যদি ইতিমধ্যে টিটিএল কনফিগার করা থাকে এবং ক্লিনআপ 48 ঘন্টা অবধি অপেক্ষা করতে পারে এটি অবশ্যই সর্বোত্তম বিকল্প। আমি অস্পষ্ট থাকলে আমার ক্ষমা চাই ologies
টোমর

4

এই প্রশ্নের উত্তর আইটেমের সংখ্যা এবং তাদের আকার এবং আপনার বাজেটের উপর নির্ভর করে। আমাদের উপর নিম্নলিখিত 3 টি মামলা রয়েছে তার উপর নির্ভর করে:

1- টেবিলের আইটেমের সংখ্যা এবং আইটেমের আকার খুব বেশি নয়। তারপরে স্টিফেন ওপেল যেমন বলেছিলেন আপনি ব্যবহারকারী_আইডির জন্য সমস্ত আইটেম পুনরুদ্ধার করতে স্ক্যানের চেয়ে ক্যোয়ারী ব্যবহার করতে পারেন এবং তারপরে সমস্ত ফিরে আসা আইটেমগুলি লুপ করতে পারেন DeleteItemবা হয় সুবিধাজনক বাBatchWriteItem। তবে মনে রাখবেন আপনি এখানে প্রচুর থ্রুপুট ক্ষমতা পোড়াতে পারেন। উদাহরণস্বরূপ, এমন একটি পরিস্থিতি বিবেচনা করুন যেখানে আপনার ডায়নামোডিবি টেবিল থেকে 1000 আইটেম মুছতে হবে। ধরুন যে প্রতিটি আইটেমের আকার 1 কেবি, ফলে প্রায় 1 এমবি ডেটা হয়। এই বাল্ক-মোছা টাস্কটির জন্য ক্যোয়ারী এবং ডিলিটের জন্য মোট 2000 রাইটিং ক্ষমতা ইউনিট প্রয়োজন। 10 সেকেন্ডের মধ্যে এই ডেটা লোডটি সম্পাদন করতে (যা কিছু অ্যাপ্লিকেশনগুলিতে এমনকি দ্রুত হিসাবে বিবেচনা করা হয় না), আপনাকে টেবিলের বিধানিত লেখার থ্রুটপুটটি 200 রাইটের ক্ষমতা ইউনিটে সেট করতে হবে। আপনি দেখতে পাচ্ছেন যে এইভাবে ব্যবহার করা তার করণীয় যদি কম সংখ্যক আইটেম বা ছোট আকারের আইটেমের জন্য থাকে।

2- আমাদের টেবিলে প্রচুর আইটেম বা খুব বড় আইটেম রয়েছে এবং আমরা সময় অনুযায়ী সেগুলি বিভিন্ন টেবিলগুলিতে সঞ্চয় করতে পারি। তারপরে জোনাথন বলেছিলেন আপনি কেবল টেবিলটি মুছতে পারেন। এটি অনেক ভাল তবে আমি মনে করি না এটি আপনার ক্ষেত্রে মিলেছে। যেমন আপনি লগ তৈরির সময় কী তা বিবেচনা না করেই সমস্ত ব্যবহারকারীর ডেটা মুছে ফেলতে চান, তাই এই ক্ষেত্রে আপনি কোনও নির্দিষ্ট সারণী মুছতে পারবেন না। যদি আপনি প্রতিটি ব্যবহারকারীর জন্য পৃথক টেবিল রাখতে চান তবে আমি অনুমান করি যে ব্যবহারকারীর সংখ্যা বেশি হলে এটি এত ব্যয়বহুল এবং এটি আপনার ক্ষেত্রে ব্যবহারিক নয়।

3- আপনার কাছে যদি প্রচুর ডেটা থাকে এবং আপনি আপনার গরম এবং ঠান্ডা তথ্যগুলি বিভিন্ন টেবিলগুলিতে বিভক্ত করতে না পারেন এবং আপনাকে প্রায়শই বড় পরিমাণে মুছতে হবে তবে দুর্ভাগ্যক্রমে ডাইনামোডিবি আপনার পক্ষে মোটেই ভাল বিকল্প নয়। এটি আরও ব্যয়বহুল বা খুব ধীর হয়ে যেতে পারে (আপনার বাজেটের উপর নির্ভর করে)। এই ক্ষেত্রে আমি আপনার ডেটা জন্য অন্য একটি ডাটাবেস সন্ধান করার পরামর্শ দিচ্ছি।


0

ডায়নামোডিবি একটি টেবিল থেকে সমস্ত সারি মুছে ফেলার জন্য আমার দৃষ্টিভঙ্গি হ'ল ডায়নামোডাবস স্ক্যানএসিঙ্ক ব্যবহার করে টেবিল থেকে সমস্ত সারি টেনে আনা এবং তারপরে ফলাফল তালিকাটি ডায়নামডাবস অ্যাডডিলিটআইটেমগুলিতে ফিড করা। সি # এর কোডের নীচে আমার জন্য ভাল কাজ করে।

        public async Task DeleteAllReadModelEntitiesInTable()
    {
        List<ReadModelEntity> readModels;

        var conditions = new List<ScanCondition>();
        readModels = await _context.ScanAsync<ReadModelEntity>(conditions).GetRemainingAsync();

        var batchWork = _context.CreateBatchWrite<ReadModelEntity>();
        batchWork.AddDeleteItems(readModels);
        await batchWork.ExecuteAsync();
    }

দ্রষ্টব্য: সারণীটি মুছে ফেলা এবং তারপরে এটি আবার ওয়েব কনসোল থেকে পুনরায় তৈরি করা টেবিলটি তৈরি করতে যদি YAML / ক্লাউডফ্রন্ট ব্যবহার করে তবে সমস্যা হতে পারে।


0

আমাদের কাছে ডায়নামো টেবিলগুলি ছাঁটাই করার বিকল্প নেই। আমাদের টেবিলটি ফেলে আবার তৈরি করতে হবে। ডায়নামোডিবি চার্জগুলি রিডক্যাপাসিটিউনাইটস এবং রাইটক্যাপাসিটি ইউনাইটের উপর ভিত্তি করে। আমরা যদি ব্যাচউইরআইটেম আইটেমটি ব্যবহার করে সমস্ত আইটেম মুছে ফেলি, তবে এটি WritCapacityUnits ব্যবহার করবে specific সুনির্দিষ্ট রেকর্ডগুলি মুছতে বা টেবিলটি মুছতে এবং আবার শুরু করতে ভাল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.