Soroush Kheirkhah
Soroush Kheirkhah
خواندن ۴ دقیقه·۲ سال پیش

دیتابیس‌های In-memory (درون حافظه IMDB)

دیتابیس‌های IMDB دیتابیس‌هایی هستند که دیتا را در رم سیستم ذخیره می‌کنند و از آن می‌خوانند.

با استفاده از این روش مزیت سرعت بیشتر را نسبت به دیتابیس‌های معمولی داریم.

این دیتابیس‌ها برای اپلیکیشن‌هایی طراحی شده‌اند که نیاز به جواب دهی در کمترین زمان ممکن را دارند (میکرو ثانیه) یا ترافیک بالایی دارند.



تفاوت‌ها با دیتابیس‌های معمولی

درحالی که ذخیره دیتا در این نوع دیتابیس‌ها بسیار بهینه میباشد و سرعت را بالاتر میبرد، این روش ذخیره دیتا بسیار گران تمام میشود.

روشی که برای استفاده بهینه از این مدل دیتابیس‌ها و کنترل هزینه‌ها پیشنهاد می‌شود این است که داده‌هایی که بیشترین دسترسی را نیاز دارند در مموری ذخیره کنیم و بقیه داده‌ها را در دیسک نگهداری کنیم.

از آنجایی که در بعضی سیستم‌ها تشخیص اینکه چه داده‌ای را باید در دیسک ذخیره کنیم و چه داده‌ای را در مموری برخی از این سیستم‌ها بصورت داینامیک و بر حسب میزان استفاده از دیتا آنها بین دیسک و مموری تقسیم میکنند. این روش با کش کردن تفاوت دارد. در کش کردن آخرین دیتای ورودی در مموری ذخیره میشود ولی در این روش آخرین دیتایی که اپلیکیشن به آن دسترسی پیدا کرده.

این انعطاف پذیری استفاده Hybrid نام‌گذاری شده، و تعادلی بین موارد زیر را بوجود میارد:

  • بهینه‌سازی سرعت (کارایی)
  • هزینه
  • ماندگاری
  • عامل شکل، زیرا تراشه های RAM نمی توانند به چگالی یک هارد دیسک کوچک نزدیک شوند
  • برخی از دیتابیس‌های IMDB در زیر لیست شده‌اند:

Aerospike DBS

eXtremeDB

IBM Db2

Redis

Amazon_DynamoDB

MongoDB

Cosmos_DB

Apache_CouchDB




  • یکی از نقاط ضعف دیتابیس‌های IMDB عدم ماندگاری دیتا است؛ یعنی در هنگام crash کردن یا restartهای ناگهانی دیتای نگهداری شده در مموری پاک میشود.
  • برای حل این مشکل قدرت دیتابیس‌های IMDB را با دیتابیس‌های با ماندگاری دیتابیس‌های قدیمی ترکیب می‌کنیم، با این کار هم دیتای ما ماندگار هست و هم سرعت و کارایی دیتابیس‌های درون حافظه را داریم و بر عملکرد ما هیچ لطمه‌ای وارد نمیشه!

معروف‌ترین دیتابیس‌های IMDB با ماندگاری: Redis, Aerospike, Tarantool

سوال: چگونه دیتای ذخیره شده در مموری بدون پایین آوردن عملکرد ماندگار میشود؟

جواب: نکته این است که دیتا همچنان در مموری ذخیره میشود اما علاوه بر این هر عملیات در یک تراکنش روی دیسک هم ذخیره میشود به عکس زیر توجه کنید:

اگر دقت کنید در حالی که اکنون دیتای شما ماندگاری دارد کوئری‌های شما همچنان سرعت خودشان را حفظ میکنند زیرا مثل قبل دیتا را از مموری میخوانند.

اما عملیات تراکنش ذخیره روی دیسک چطور؟

هر تراکنش نه تنها باید دیتای مموری را بروز کند بلکه برای جلوگیری از ازدست رفتن دیتا باید روی دیسک هم ذخیره شود و دیسک سرعت کمی دارد. به عکس توجه کنید:

تراکنش‌ها فقط به صورت append (ضمیمه شونده) به لاگ اضافه میشوند و خوبی آن این است که چون به صورت ضمیمه شونده اضافه میشوند دیسک‌ها سرعت بهتری دارند. (دیسک‌ها در نوشتن اطلاعات میتوانند سرعتی برابر 100 Mbps داشته باشند.) پس دیسک‌ها اگر به صورت متوالی استفاده شوند میتوانند سرعت خوبی داشته باشند و میتوانند در ثانیه حدود ۱۰۰ عملیات را انجام دهند.

اگر SSD را در نظر بگیریم اوضاع بهتر هم میشود چرا که درایو‌های حالت جامد یا همان SSD‌ها سرعتی برابر 200–300 Mbps میتوانند داشته باشند.


  • برای جمع‌بندی مطالب گفته شده در رابطه با دیسک و دیتابیس‌های IMDB:
  • در بحث نوشتن و خواندن دیتا، IMDBها از RDBMSها سریعترند.
  • دیتابیس‌های IMDB میتوانند دیتا را در دیسک بصورت ماندگار ذخیره کنند.
  • دیتابیس‌های IMDB معمولا به خوبی در بین هسته‌های cpu مقیاس پذیر نمیشوند.
  • دیتابیس‌های IMDB فقط در صورتی کار میکنند که به مقدار کافی رم برای ذخیره داده داشته باشند.
  • دیتابیس‌های IMDB برای عملیات بدون تغییر از دیسک استفاده نمی‌کنند.
  • دیتابیس‌های IMDB برای عملیات تغییر از دیسک استفاده میکنند ولی در سریعترین و بهینه‌ترین حالت ممکن از آن استفاده میکنند.


حال که راجع به دیتابیس‌های IMDB صحبت کردیم موارد استفاده از آنها رو هم ببینیم:

  • در اپلیکیشن‌های RESTful که عملیات احراز هویت و ورود با JWT توکن‌ها انجام میشود.(اگر توکن‌ها در RDBMS ذخیره شوند هر درخواست یک عمل IO به همراه خواهد داشت سیستمی در نظر بگیرید که 1000req/s درخواست دارد.)
  • سبد‌های خرید در فروشگاه‌های اینترنتی که دارای تعداد زیادی کاربر هستند.
  • اپلیکیشن‌هایی که از BI Analytics استفاده میکنند.


حال که اطلاعاتی داریم میتوانیم بین دیتابیس‌های IMDB و RDBMS انتخاب کنیم.

  • همانطور که گفته شد هر دیتایی که نیاز به دسترسی آنلاین و زیر 1ms دارد باید در رم ذخیره شود.
  • هر دیتایی که نیاز به دسترسی آنلاین سریع ندارد (100ms) میتواند در RDBMS یا IMDB ذخیره شود.
  • در بعضی موارد دیتایی که نیاز به دسترسی سریع ندارد نیز در IMDB ذخیره می‌کنیم؛ چرا؟ چون IMDB هنگام
    دسترسی به دیتا از پردازنده بصورت بهینه‌تری استفاده میکند.
  • اگر دیتایی نداریم که زیر دسترسی سریع نیاز داشته باشد و از SSD استفاده می‌کنیم پس در این شرایط RDBMS بهترین گزینه است.

نکته‌ای که بهتر است مورد توجه قرار گیرد این است که دیتا‌یی که نیاز به دسترسی سریع دارند و دیتایی این نیاز را ندارند را در یک RDBMS قرار نداشته باشند.

منابع

In-memory databases | wikipedia

In-memory databases 2

When and why I use an in-memory database or a traditional database management system | Medium

What an in-memory database is and how it persists data efficiently | Medium


با عرض معذرت بابت مشکلات فراوان این مطلب.
خیلی خوشحال میشوم نظرات خود را اینجا بگذارید.

با تشکر از شما.

سروش خیرخواه | Soroush Kheirkhah

دانشجوی رشته علوم کامپیوتر - دانشگاه آزاد واحد تهران مرکز

وبسایت شخصی

LinkedIn

استاد راهنما:

دکتر مریم حاجی اسمعیلی | Dr.Maryam Hajiesmaeili

دکترای علوم کامپیوتر از دانشگاه کینگستون لندن | PhD of computer science from Kingston university of London

LinkedIn


شاید از این پست‌ها خوشتان بیاید