رَفت (Raft) یک الگوریتم توزیع شده است که به منظور حفظ توافق بین چندین نود در یک سیستم توزیع شده مورد استفاده قرار میگیرد. این الگوریتم به منظور ایجاد هماهنگی در سیستمهای توزیع شده که احتمال وقوع خرابی یا اختلال در ارتباطات را دارند، طراحی شده است. یکی از محبوبترین الگوریتمهای توافق در سیستمهای توزیع شده به شمار میآید.
در معماری توزیع شده، ممکن است چندین نود (سرور یا سیستمها) با یکدیگر ارتباط برقرار کنند. این نودها باید توافق داشته باشند که کدامیک از آنها مسئول انجام کارهای خاصی است. به عبارت دیگر، نیاز است که در صورت خرابی یکی از نودها یا بروز اختلالات در ارتباطات، نودها همچنان توانایی ادامه کار با حفظ توافق داشته باشند.
الگوریتم Raft به منظور ایجاد توافق بین نودها بر روی یک مدل کاری به نام “رهبر-تعداد-بیشتریت” (Leader-AppendEntries) تکیه میکند. در این مدل، یکی از نودها به عنوان “رهبر” انتخاب میشود که مسئول مدیریت تغییرات و افزودن دادهها به سیستم میشود. سایر نودها نیز به عنوان “دنبالکنندهها” عمل میکنند که دستورات رهبر را اجرا میکنند و تغییرات را اعمال میکنند.
فرآیند توافق در Raft به این شکل است:
- انتخاب رهبر (Leader Election): در ابتدا، تلاش میشود یک رهبر جدید انتخاب شود یا رهبر فعلی تایید شود. این فرآیند با استفاده از تبادل پیامها بین نودها انجام میشود.
- تنظیم تغییرات (Log Replication): پس از انتخاب رهبر، دادهها و تغییرات در سیستم توسط رهبر اعمال میشوند. رهبر پیامهای AppendEntries به دنبالکنندهها ارسال میکند تا تغییرات را در دستگاههای آنها نیز اعمال کنند.
- تایید تغییرات (Consensus): هر دنبالکننده پس از دریافت پیامهای AppendEntries از رهبر، تغییرات را اعمال میکند و به رهبر تایید انجام تغییرات را میدهد. این تاییدیهها موجب میشود که رهبر بتواند بررسی کند که تغییرات به درستی در نودها اعمال شدهاند.
در مورد Single Node Raft، به عنوان یک شکل سادهتر، تنها یک نود به عنوان همه چیز عمل میکند. این مدل برای آموزش و تست الگوریتم Raft به کار میرود. در این حالت، توافق بین چند نود وجود ندارد، زیرا تنها یک نود در سیستم وجود دارد که هم رهبر و هم دنبالکننده است.