یکی از مسائل دنیای واقعی که توی سیستمهای distributed خیلی کاربرد داره به اجماع رسیدنه (یا همون consensus)
مساله از این قراره که ما کامپیوترهای متفاوتی داریم که از طریق شبکه با هم در ارتباط هستن ولی ممکنه هم خودشون از کار بیفتن هم شبکه به درستی کار نکنه و تاخیر داشته باشه. پس نیاز داریم با یکسری مکانیسم کاری کنیم به اجماع برسن و حالتهای متفاوت مثل کرش سیستم های مختلف یا از دست رفتن شبکهشون (partition شدن اصطلاحا) رو در نظر بگیریم.
راههای ساده و ابتدایی برای این قضیه 2 phase commit و 3 phase commitئه که مشکلات خاص خودشو داره مثلا سیستم بلاک میشه تا همه جواب بدن.
روشهای بهتر شامل Paxos میشه که تضمینهای خوبی در زمینه ددلاک نشدن سیستم (liveness) و تحمل خطای بالاتر داره ولی روش نسبتا پیچیدهایه، هم از نظر فهم هم از نظر پیادهسازی. نسخهی سادهتر و قابل پیادهسازیش ارائه شده به اسم Raft که همون تضمینها رو میده همچنان در عین سادگی.
یه قسمت paxos که برام جالب بود هم براتون توضیح میدم: توی paxos، پروپوزال در واقع یه پیشنهاده که یه نود (proposer) برای انتخاب شدن یه مقدار میفرسته. هر پروپوزال یه شمارهی یکتا و صعودی داره که ترتیب و اولویت رو مشخص میکنه. نودها (acceptorها) فقط به پروپوزالی جواب مثبت میدن که شمارهش از همهی شمارههایی که قبلتر دیدن بزرگتر باشه. این مکانیزم شمارهگذاری باعث میشه حتی با وجود رقابت چند proposer یا کرش بعضی نودها، در نهایت فقط یه مقدار به عنوان مقدار نهایی انتخاب بشه و خاصیت safety حفظ بشه.
در اینجا خوبه به Byzantine Failure هم اشاره کنم. تا اینجا خطایی که باهاش مواجه بودیم این بود که سیستم کرش کرده یا قابل دسترس نیست ولی پاسخ غلط نمیده ولی مدل خطا ممکنه این باشه که سیستم به خاطر نویز یا هرچیزی پاسخ غلط هم میده. در این حالت الگوریتمهای دیگهای استفاده میشه و تعداد خطای کمتری رو میتونن تحمل کنن. مثلا اگر paxos تا نصف خطا رو تحمل میکنه، روشهایی که خطای Byzantine رو تحمل میکنن نهایتا تا یک سوم خطا رو تحمل میکنن.
https://en.wikipedia.org/wiki/Consensus_(computer_science)
https://en.wikipedia.org/wiki/Two-phase_commit_protocol
https://en.wikipedia.org/wiki/Paxos_(computer_science)
Post #3253
2.21K
- 👍 6
- ❤ 3
- 🤔 1