در گذشته، هنگامی که ما می خواستیم داده های بیشتری را ذخیره کنیم یا توان پردازشی خود را افزایش دهیم، دو گزینه و راه کار داشتیم ۱) مقیاس پذیری عمودی با افزودن گرفتن ماشین های نیرومند تر یا ۲) بهینه کردن و بهبود کدها. ولی امروزه، با پیشرفت در سیستم های پردازش موازی (Parallel System) و سیستم های توزیع شده (Distributed System)، مقایس پذیری بصورت افقی متداول تر است. بنابراین با مفاهیم موازی سازیو توزیع شدگی و با داشتن ماشین های بیشتری، کارهای بیشتر را می توان همزمان و تندتر انجام داد.

تئوری CAP یک تئوری مشهور در سیستم های توزیع شده، همانند سیستم پایگاه داده های توزیع شده است که دارای سه مولفه C=Consistency یا سازگاری، A=Availability یا دسترس پذیزی و P=Partition Tolerance یا تحمل در برابر پارتیشن شدن یا بخش شدن و چند تکه شدن یک سیستم توزیع شده. از دید تئوری CAP، یک سیستم توزیع شده تنها می تواند دو تا از این سه مولفه را داشته باشد.

شکل بالا سه حالت CA و CP و AP از داشتن تنها دوتایی ها برای یک سیستم توزیع شده را نشان می دهد. تئوری CAP در محیط کلان داده ها نیز بسیار برجسته است. بنابراین به زبان ساده تئوری CAP نشان می دهد که یک سیستم توزیع شده، مانند یک پایگاه داده توزیع شده در محیط کلان داده ها، نمی تواند همزمان هر سه سازگاری، دسترس پذیری و تحمل در برابر پارتیشن شدن را داشته باشد.

یک سیستم توزیع شده ساده

در شکل زیر نما و سناریوی ساده ای از یک سیستم توزیع شده سادی مانند یک کلاستر ساخته شده از دو گره G1 و G2 را نشان می دهد. هر دوی آنها بر روی یک متغیر V کار می کنند. در آغاز مقدار متغیر با نماد V0 نشان داده می شود. این دو گره بر روی یک شبکه بایکدیگر ارتباط دارند و در همان شبکه یک کلاینت با هر دو این گره در ارتباط است.

در نخستین شکل زیر، یک کلاینت درخواست Write یا نوشتن تغییرات را بر روی یک قلم داده به یکی از سرورها (مانند G1) می فرستد. سرور تغییرات و پردازش را انجام داده و پاسخی به کلاینت می فرستد. سپس کلاینت یک درخواست Read یا خواندن همان قلم داده (متغیر V) را می کند و در اینجا سرور مقدار آن رامی فرستد.

سازگاری

سازگاری ضمانت می کند که هر گره درون یک سیستم توزیع شده، مانند یک کلاستر (Cluster) همه عملیات های نوشتن (Write یا تغییردر وضعیت یک مولفه مانند یک متغیر یا یک رکورد از پایگاه داده) از سوی گره ها با موفقیت انجام شود. سازگاری بیان می کند که هر کلاینت، دید همسانی از داده ها دارد. توجه کنید که کلاینت درخواست نوشتن (مانند بروز رسانی یا تغییر) را می دهد و از این رو سیستم باید سازگار باشد، تا دیگر کلاینت که اکنون می خواهند از رکورد یا متغیری را بخوانند، مقدار درست نوشته شده را بخوانند.

در یک سیستم پایگاه داده، برای حفط سازگاری، مکانیزمی به نام قفل گذاری (Locking) به کار گرفته می شود. در این مکانیزم دو قفل Read و Write داریم. قفل Read زمانی است که تراکنش بخواهد داده را بخواند و Write زمانی است که بخواهد داده های را بنویسد یا تغییر دهد. با داشتن چندین تراکنش همزمان، برای حفظ سازگاری، تنها یکی از آنها می تواند در یک لحظه بر روی یک مولفه مانند یک رکورد پایگاه داده، قفل Write داشته باشد ولی هر شماری قفل Read مجاز است.

ولی یک نکته دیگر نیز هست و اینکه برای نگهداری سازگاری، هر قفل Read باید پس از پایان یافتن موفقیت آمیز قفل Write انجام شود، بدین گونه که تا زمانی که یک قفل Write آزاد نشده، هیچ قفل Read نمی تواند بر روی قلم داده زده شود. شکل زیر سیستم را به حالت ناسازگار (Inconsistent) می برد، زیرا نخست کلاینت درخواست نوشتن مقدار تازه V1 را به جای مقدار پیشین V0 بر روی متغیر V را به سرور G1 می دهد و سپس G1 پاسخی مبنی بر انجام شدن تغییر می دهد و سپس و پیش از تعامل میان دو سرور G1 و G2، کلاینت درخواست خواندن مقدار V را از سرور G2 می کند که هنوز همان مقدار پیشین V0 است.

ولی در شکل زیر، سیستم در حالت سازگار است، زیرا پس از آنکه درخواست تغییر روی V بدست G1 به طور موفقیت آمیز انجام شد، سرور G1 مقدار تازه بدست آمده را به سرور G2 می فرستد و پس از اعمال موفقیت آمیز تغییر روی G2، اکنون کلاینت می تواند درخواست خواندن را به G2 بفرستد. بنابراین برای سازگاری:

  • پیش از هر چیز، درخواست نوشتن ها باید بر روی همه گره ها یا سرورهای درون سیستم توزیع شده با موفقیت انجام شود. اگر یکی ناموفق باشد، پس دیگر تغییرات نیز از میان می روند.
  • هر درخواست خواندن، باید پس از انجام همه نوشتن ها باشد. از این رو در شکل زیر، پس از آنکه G1 پاسخ done را از G2 گرفت، پاسخ نوشتن موفقیت آمیز done را به کلاینت می دهد و سپس کلاینت درخواست Read را به G2 می فرستد.

دسترس پذیری

دسترس پذیری بدین مفهوم است که هر یک از گره های از کار نیفتاده (Non Failure Node۹) باید پاسخی به درخواست های نوشتن یا خواندن دهد.

تحمل پارتیشن شدن

پارتشین شدن یعنی اینکه یک سیستم توزیع شده به خاطر مشکل هایی مانند از کار افتادن ارتباط میان دو گره، به دو یا چند تکه تقسیم شود ولی با این وجود، بازهم باید قادر به پاسخ گویی به درخواست ها باشد.