هشینگ و مصائب
فرض کنیم یه شبکه از سرور داریم که برای ذخیرهسازی دادهها از Redis استفاده میکنه. حالا برای تقسیم دادهها بین سرورها، به طور معمول ممکنه از یه الگوریتم سادهای مثل "مدولوس" استفاده کنیم. در این روش، دادهها رو بر اساس یه مقدار مثل ID یا شماره کلید هاش میکنیم و با استفاده از تقسیم باقیمانده (mod) اون رو به یکی از سرورها تخصیص میدیم.
مشکل با این روش:
فرض کنیم الان ۳ تا سرور داریم و میخواهیم دادهها رو به طور یکنواخت بین این سرورها تقسیم کنیم. حالا اگر یه سرور جدید اضافه بشه یا یکی از سرورها حذف بشه، همه دادهها باید دوباره توزیع بشن. یعنی باید دوباره کل دادهها رو با استفاده از تقسیم باقیمانده جدید روی سرورهای جدید توزیع کنیم. این کار باعث میشه:
🔹 بار اضافی روی سرورها بیفته چون باید دادهها جابجا بشن.
🔹 سرعت پردازش کاهش پیدا کنه چون همه دادهها باید دوباره پردازش بشن.
به عنوان مثال:
فرض کن ۳ سرور داریم و کلیدهای دادهها به این شکل به سرورها تخصیص داده میشن:
سرور ۱: کلیدهایی که باقیمانده تقسیمشون بر ۳، ۰ میشه.
سرور ۲: کلیدهایی که باقیمانده تقسیمشون بر ۳، ۱ میشه.
سرور ۳: کلیدهایی که باقیمانده تقسیمشون بر ۳، ۲ میشه.
حالا اگر بخواهیم سرور ۴ اضافه کنیم، باید تمام دادهها رو دوباره تقسیم کنیم. مثلا اگر کلیدی که قبلاً به سرور ۳ میرفته، حالا باید به سرور ۴ بره. یا دادههایی که قبلاً به سرور ۲ میرفتن، باید حالا بین سرور ۲ و ۴ تقسیم بشن. این باعث میشه که انتقال دادهها خیلی پیچیده و زمانبر بشه.
راهحل: Consistent Hashing....
فرض کنیم یه شبکه از سرور داریم که برای ذخیرهسازی دادهها از Redis استفاده میکنه. حالا برای تقسیم دادهها بین سرورها، به طور معمول ممکنه از یه الگوریتم سادهای مثل "مدولوس" استفاده کنیم. در این روش، دادهها رو بر اساس یه مقدار مثل ID یا شماره کلید هاش میکنیم و با استفاده از تقسیم باقیمانده (mod) اون رو به یکی از سرورها تخصیص میدیم.
مشکل با این روش:
فرض کنیم الان ۳ تا سرور داریم و میخواهیم دادهها رو به طور یکنواخت بین این سرورها تقسیم کنیم. حالا اگر یه سرور جدید اضافه بشه یا یکی از سرورها حذف بشه، همه دادهها باید دوباره توزیع بشن. یعنی باید دوباره کل دادهها رو با استفاده از تقسیم باقیمانده جدید روی سرورهای جدید توزیع کنیم. این کار باعث میشه:
🔹 بار اضافی روی سرورها بیفته چون باید دادهها جابجا بشن.
🔹 سرعت پردازش کاهش پیدا کنه چون همه دادهها باید دوباره پردازش بشن.
به عنوان مثال:
فرض کن ۳ سرور داریم و کلیدهای دادهها به این شکل به سرورها تخصیص داده میشن:
سرور ۱: کلیدهایی که باقیمانده تقسیمشون بر ۳، ۰ میشه.
سرور ۲: کلیدهایی که باقیمانده تقسیمشون بر ۳، ۱ میشه.
سرور ۳: کلیدهایی که باقیمانده تقسیمشون بر ۳، ۲ میشه.
حالا اگر بخواهیم سرور ۴ اضافه کنیم، باید تمام دادهها رو دوباره تقسیم کنیم. مثلا اگر کلیدی که قبلاً به سرور ۳ میرفته، حالا باید به سرور ۴ بره. یا دادههایی که قبلاً به سرور ۲ میرفتن، باید حالا بین سرور ۲ و ۴ تقسیم بشن. این باعث میشه که انتقال دادهها خیلی پیچیده و زمانبر بشه.
راهحل: Consistent Hashing....