حسین بیگی
حسین بیگی
خواندن ۳ دقیقه·۳ سال پیش

حکایت شیخ و مریدان : consistent hashing

روزی شیخ در حال گذر از بازار بود که مریدی بر وی یکهو نازل گشت و پرسید!یا شیخ مسئلتون؟
شیخ نگاهی به وی کرد و گفت : شما؟
مرید گفت : یا شیخ از دیشب تصمیم گرفتم که مرید شما بشوم!حال آمده­ام از دموی شما استفاده کنم تا در صورت رضایت از پکیج های شما را خریداری کنم!
شیخ گفت : تو میتوانی یک سوال را به صورت تستی بپرسی.حال بپرس!
مرید گفت : یا شیخ فرق پایتون با پای­اسکریپت چیست! شیخ گفت : پای اسکریپت کوچک شده پایتون است!(مرید که برای درآمد 30 میلیون تومانی از برنامه نویسی در 1 ماه به شیخ مراجعه کرده بود، قفل کرد]رجوع شود به م.م[).
مرید خندید و گفت : بچه جان علم نرم افزار پیچیدگی های خاص خودش را دارد!بشین تا از برایت ریز یک منبر بروم!

فکر کن یک سیستمی داری که بزرگ شده و حال مجبور شده­ای علیرغم فرار از این موضوع Sharding را پیاده سازی کنی!حال مجبوری به سرور بگویی که برای دریافت اطلاعات این کلاینت به کدام دیتابیس رجوع کند.سوالی که پیش می­آید این است.چگونه؟خب یک راهش این است که هش کنی!و سپس هش را بر تعداد Node های خود MOD بگیری تا همیشه یک عددی در میان کد Node خود بدست آوری. سپس هروقت که درخواستی از کلاینت آمد بدون مشکل راهش را پیدا میکند!

اما اگر یکی از سرور ها به گفت پوف! و دیگر روشن نشد چه؟(مثل لپتاپ من)آن وقت مشتری ها را چه کنیم؟؟مسئله این است که اگر تا دیروز 3 سرور داشتی و MOD عمل هش را بر 3 میگرفتی، الان دیگر 2 عدد سرور داری! یا اصلا این هیچ!فرض مثال یک سرور به سرور هایت اضافه کردی!آنوقت که دیگر نمیتوانی بر 3 MOD بگیری و این یعنی اگر کلاینت اطلاعاتش، در Node سوم باشد، به اشتباه به Node دوم رجوع خواهد کرد!همچنین گفت: آیا از هش های نامطمئن خود خسته شده اید؟پیشنهاد ما به شما Consistent Hashing .....
الگورتیمی است هلو!اصلا آدم عشق میکند به والله!
در این الگورتیم ما هش ها را به صورت دایره ای فرض میکنیم و تعداد Node های خود را در درون آن میگذاریم و پس از هش کردن داده آن را به 2π تقسیم میکنیم و فرزند این تقسیم یک درجه از صفر تا 360 خواهد بود! و آن درجه را در درون دایره میگذاریم!حال دو راه داریم که جهت عقربه های ساعت و یا خلاف آن حرکت کنیم! به اولین سرور که رسیدیم، زدیم به خال!

)یک عکس از بلاگ های بلاد فرنگ کش رفتم، ببینم باهم...(

در عکس ما چهار سرور داریم که دلمان میخواهد که اسم های عجیب بگذاریم (ZEPPO-CHICO-HARPO-GROUC)
آن عدد ها هم که میبینید، مشخصه هایی هستند که تصمیم گرفتیم هش کنیم و MOD آن را بگیریم!سپس با یک چرخش قهرمانانه، به راحتی مشخص میشود که کدام کاربر ها مال کدام سرور ها هستند! در این صورت اگر فردا Node کم یا زیاد شود باز هم تغییری در خروجی الگوریتم نخواهد داشت!چون اصلا به تعداد آن ها کاری ندارد.!

و این را بدان که این الگورتیم را بسیار برابر نیاز های خود تغییر میدهند و این مثال و دستور العملی که من گفتم یک حالت عمومی از این الگورتیم بود!

این الگورتیم در میکروسرویس ها و لود بلانسر ها کاربرد دارد.

بسیاری از بانک ها به طور پیش فرض از این استفاده میکنند مانند apache Cassandra (چِش خوشگله)

و شاید باورتان نشود اما دیسکورد هم از این روش استفاده میکند.کجایش را دیگر نمیدانم!

در کل منظورم این بود که دانستن این الگورتیم، شاخ نمیزند. اشکال شرعی هم ندارد!

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