اگر با دیتابیسهای توزیعشده، میکروسرویسها یا حتی سیستمهای Cloud-based سروکار داشته باشید، احتمالاً اسم CAP Theorem رو شنیده باشید.
معمولاً هم در حد یه جمله که: «نمیتونی Consistency، Availability و Partition Tolerance رو با هم داشته باشی» ولی واقعیت این هست که CAP خیلی عمیقتر از این جمله کلیشهای است. تو این مقاله میخوایم از صفر تا صد CAP رو باز کنیم و موضوع رو دقیق بررسی کنیم ببینیم که اصل قضیه چی هست و مدیر پایگاه داده ما چه اصولی رو باید بلد باشه.

قبل از ورود به موضوعات فنی، باید بررسی کنیم که CAP اصلاً چرا به وجود اومد؟
قبل از CAP، بیشتر دیتابیس ها متمرکز (Centralized) بودند. به این معنا که ما یک سرور داشتیم و روی اون سرور یک زیرساخت پایگاه داده که دیتابیس روی اون بود.
وقتی سیستم ها بزرگ شدن، چند تا اتفاق بسیار مهم رخ داد:
○ دیتابیس ها روی چند سرور پخش شدن
○ دیتاسنتر ها جغرافیایی شدن
○ latency و network failure واقعی شدن
خب، الان که فهمیدیم CAP چرا به وجود اومده، میریم به سراغ تعریف و اینکه هر حرف از چه کلمه ای میاد.
CAP میگه در یک سیستم دیتابیس توزیع شده، فقط میتونی دو تا از این سه ویژگی رو هم زمان تضمین کنی:
○ Consistency (سازگاری)
○ Availability (دسترسپذیری)
○ Partition Tolerance (تحمل پارتیشن شبکه)
Consistency یعنی همه یک چیز ببینن! کمی بریم جلو توضیح بدم یعنی چی.
Consistency (سازگاری) یعنی: هر درخواست Read، آخرین Write معتبر رو برگردونه و این یعنی چی؟
بیایید فرض کنیم که کاربر A موجودی حساب رو از ۱۰۰ به ۲۰۰ تغییر میده کاربر B بلافاصله بعدش Read میزنه Consistency یعنی کاربر B حتماً ۲۰۰ رو ببینه، نه ۱۰۰
نکتهی مهمی که وجود داره عبارت است از اینکه، این Consistency با ACID Consistency فرق داره و نباید اشتباه بگیریم. اینجا حرف از Single Source of Truth توی کل نودهاست. بزارید بهتر بگم، تا وقتی کلیه نود ها از Write ی که انجام شده، مطمئن نشده اند و عملیات همگام سازی کلیه نود ها انجام نشده باشه، نباید (منظورم از کلمه نباید این هست که باید حداکثر سعی خودمون رو بکنیم) نتیجه Write در عملیات Read برگرده. من هر چقدر از اهمیت درک این قسمت بگم، کم گفتم. نباید طوری باشه که وقتی چند نفر هم زمان درخواست میدند، اطلاعات متفاوتی رو دریافت کنند.
Availability یعنی سیستم همیشه جواب بده
Availability (دسترس پذیری) یعنی: هر درخواست، یه پاسخ بگیره (حتی اگه پاسخ کامل یا بهروز نباشه) یعنی: سیستم Down نشه و Timeout نده حتی اگه دیتای قدیمی برمیگردونه، حداقل جواب بده.
این موضوع برای سیستم هایی مثل شبکه های اجتماعی یا سیستم های Recommendation ها یا سرویس هایی که باید دسترس پذیری بالایی داشته باشند، خیلی مهم هست.
بهتره این طور بگم که Availability خیلی مهمتر از Consistency لحظهایه.
Partition Tolerance یعنی وقتی شبکه خراب میشه چی؟
Partition یعنی ارتباط بین نود ها قطع یا ناپایدار بشه و Partition Tolerance یعنی سیستم حتی در صورت قطع ارتباط بین نودها، همچنان کار کنه.
حقیقت این هست که تو دنیای واقعی Network Failure اجتناب ناپذیر هست. پس عملاً هر سیستم توزیع شدهی واقعی باید P رو داشته باشه.
بسیار خب. الان که تعریف و مفهوم هر سه موضوع رو فهمیدیم، بریم سراغ اینکه چرا نمیتونیم هر سه گزینه رو در یک حالت داشته باشیم.
بیایید فرض کنیم شبکه بین دو نود قطع شده (Partition اتفاق افتاده). حالا دو تا انتخاب داریم:
حالت اول این هست که Consistency رو نگه داریم. یعنی چی؟ یعنی اینکه اگر نودها مطمئن نباشن دیتا یکیه اونموقع درخواست رو Reject میکنن و نتیجه این میشه که Availability رو از دست میدیم.
حالت دوم این هست که Availability رو نگه داریم و هر نود هر چی داره جواب میده و نتیجه این میشه که Consistency رو از دست میدیم.
اینجاست که CAP خودش رو نشون میده و ما باید در زمان Partition، باید بین C و A یکی رو انتخاب کنیم.
خب حالا بریم سراغ چند تا واژه مهم که دیتابیس کارهامون باید این ها رو بدونند:
اینکه ما دیتابیس ها رو از منظر CAP به چند مدل طبقه بندی میکنیم:
دیتابیس CP Databases (Consistency + Partition Tolerance)
دیتابیس AP Databases (Availability + Partition Tolerance)
دیتابیس CA Databases (Consistency + Availability)
این حالت سوم در اصل وجود نداره. چرا؟ چون CA یعنی Consistency + Availability بدون Partition Tolerance و این فقط تو سیستم های غیرتوزیعشده یا Single Node ممکنه.
خب، حالا موضوع CAP رو در دنیای واقعی برای DBA هامون هم بررسی کنیم
برای یه DBA، مفهوم CAP یعنی اینکه بدونی دیتابیسی که انتخاب میکنی چه رفتاری تو بحران داره بدونی Failover چطوری کار میکنه و بدونی Read و Write تحت Partition چی میشن.
سؤال درست این نیست که کدوم دیتابیس بهتره؟
سؤال درست این هستش که سیستم من تو شرایط خرابی باید چطوری رفتار کنه؟
طراح دیتابیس ما باید بدونه Eventually Consistency یعنی چی واقعاً؟ اینکه سیستم قول میده که اگه Write جدیدی نیاد، بالاخره همه نودها همگام میشن. ببینید این ها موضوعات مهمی هستند که نیاز هست بدونیم.
امیدوارم کمک کننده بوده باشه ...