Dynamo یک ذخیرهسازی کلید-مقدار با دسترسیپذیری بالا است که توسط آمازون برای استفاده داخلیشان توسعه یافته است. بسیاری از سرویسهای آمازون، مانند سبد خرید، لیستهای پرفروش، رتبهبندی فروش، کاتالوگ محصولات و غیره، تنها نیاز به دسترسی بر اساس کلید اصلی به دادهها دارند. یک سیستم پایگاه داده رابطهای چندجدولی برای چنین سرویسهایی بیش از حد پیچیده است و مقیاسپذیری و دسترسیپذیری را نیز محدود میکند. Dynamo یک طراحی انعطافپذیر ارائه میدهد تا برنامهها بتوانند سطح دلخواه دسترسیپذیری و سازگاری را انتخاب کنند.
Dynamo ( با DynamoDB اشتباه گرفته نشه، DynamoDB از طراحی Dynamo الهام گرفته شده ) یک سیستم ذخیرهسازی کلید-مقدار توزیعشده است که تجربهای “always-on” (یا با دسترسیپذیری بالا) را در مقیاس بزرگ فراهم میکند. از نظر قضیه CAP در دسته سیستمهای AP قرار میگیرد ( دسترسیپذیری بالا و قابلیت پارتیشن بالا را در ازای از دست دادن سازگاری قوی )
انگیزه اصلی برای طراحی Dynamo یک سیستم با دسترسیپذیری بالا بوده است چراکه مشاهده شده بود که دسترسیپذیری یک سیستم مستقیماً با تعداد مشتریان همبستگی دارد. بنابراین، هدف اصلی این است که سیستم، حتی زمانی که ناقص است، برای مشتری در دسترس باشد، زیرا این امر رضایت بیشتری برای مشتری به همراه دارد. از سوی دیگر، ناسازگاریها میتوانند در پسزمینه حل شوند و بیشتر اوقات توسط مشتری قابل توجه نیستند. Dynamo به طور اساسی برای دسترسیپذیری بهینهسازی شده است.طراحی Dynamo بسیار تأثیرگذار بود، زیرا بسیاری از پایگاههای داده NoSQL مانند Voldemort ،Cassandra ،Riak ،DynamoDB را الهام بخشید.
همانطور که در بالا ذکر شد، هدف اصلی Dynamo دسترسیپذیری بالا است. در ادامه خلاصهای از سایر اهداف طراحی آن ذکر شده است:
Scalable : سیستم باید بسیار مقیاسپذیر باشد. باید بتوانیم یک ماشین را به سیستم اضافه کنیم و بهبود متناسبی مشاهده کنیم.
Decentralized : برای جلوگیری از single points of failure ، نباید هیچ فرآیند مرکزی/رهبری وجود داشته باشد.
Eventually Consistent : دادهها میتوانند به صورت خوشبینانه تکثیر (optimistically replicated) شوند تا در نهایت سازگار گردند. این بدان معناست که به جای تحمیل هزینههای زمان نوشتن برای اطمینان از صحت دادهها در سراسر سیستم (یعنی سازگاری قوی)، ناسازگاریها میتوانند در زمان دیگری (مثلاً طی عملیات خواندن) حل شوند.

کلاینتهای Dynamo از عملیات put() و get() برای نوشتن و خواندن دادههای مربوط به یک کلید مشخص استفاده میکنند. این کلید به طور منحصربهفرد یک شیء را شناسایی میکند.
get(key): عملیات get گرههایی را پیدا میکند که شیء مرتبط با کلید دادهشده در آنها قرار دارد و یا یک شیء واحد یا لیستی از اشیاء با نسخههای متعارض همراه با یک context را برمیگرداند. context حاوی متادیتای کدگذاریشده درباره شیء است شامل اطلاعاتی مانند نسخه شیء میشود.
put(key, context, object): عملیات put گرههایی را پیدا میکند که شیء مرتبط با کلید دادهشده باید در آنها ذخیره شود و شیء دادهشده را روی دیسک مینویسد. context یک مقدار است که با عملیات get برگردانده میشود و سپس با عملیات put ارسال میشود. context همیشه همراه با شیء ذخیره میشود و مانند یک کوکی برای تأیید اعتبار شیء ارائهشده در درخواست put استفاده میشود.
Dynamo هم شیء و هم کلید را به عنوان آرایهای دلخواه از بایتها (معمولاً کمتر از ۱ مگابایت) در نظر میگیرد. الگوریتم هش MD5 را روی کلید اعمال میکند تا یک شناسه ۱۲۸ بیتی تولید کند که برای تعیین گرههای ذخیرهسازی استفاده میشود.
در سطح کلان، Dynamo یک جدول هش توزیعشده (Distributed Hash Table ) است که برای دسترسیپذیری بالا و تحمل خطا در سراسر خوشه ها تکثیر میشود. مفاهیمی که در معماری در نظر گرفته شده است به شرح ذیل است :