Pouya Doostdar
Pouya Doostdar
خواندن ۵ دقیقه·۲ سال پیش

ردیس: نصب و راه اندازی Redis (Cluster) بخش 1

Redis in Kuber
Redis in Kuber

غول مرحله اخر سرویس Redis بخش کلاسترینگ است که توی این سری پست قراره کلی نکات را پوشش بدیم.
پست های قبلی پیشنیاز این پست است. پس قبل از این که به خواندن ادامه دهید، پست های زیر را بخوانید:
سرویس Redis چیست؟
طریقه استفاده از سرویس Redis
Redis Persisting Data
راه اندازی Redis (Standalone)
خوب در مقالات قبلی برخی مباحث پوشش داده شد که با توجه به آن توضیحات، میریم برای پیاده سازی و مفاهیم کلاسترینگ در ردیس.

تعاریف:

تعریف کلاسترینگ:

به اتصال چندین Node ردیس به شکلی که بتواند ذخیره و واکشی اطلاعات را به صورت مساوی بین Node ها پخش کند تا بار پردازشی و سایر منابع مساوی مصرف کنند کلاسترینگ ردیس میگیم. که از دو نوع Master و Slave تشکلی میشود.

تعریف Master:

در بخش طریقه کارکرد ردیس دیدیم که دیتا ها با چه الگوریتمی بین اسلات های مختلف پخش میشوند. در شاردینگ ردیس هر اسلات به یک master اختصاص داده میشود. بنابراین میتوانیم master را اینگونه تعریف کنیم:
"هر Node که وظیفه مدیریت اسلات ها را داشته باشد را master میگوییم"
اما ممکن است یک node از نوع master باشد ولی هیچ اسلاتی را مدیریت نکند و در این صورت آن master هیچ وقت هیچ اطلاعاتی را شامل نخواهد بود و هیچ وقت هیچ کویری را پاسخگو نخواهد بود ( دلیل این اتفاق در ادامه متوجه خواهیم شد). پس تعریف دقیقتر میتواند این باشد: "Node های master دسترسی ایجاد، تغییر و حذف اطلاعات از کلاستر را دارند و میتوانند بخشی از اسلات های کلاستر را مدیریت کنند."

تعریف Slave:

هر Slave Node وظیفه دارد تا به یک master وصل شود و تمام اطلاعات داخل master را بر روی دیتابیس خودش دوباره نویسی (Replication) کند. نود های Slave نمیتواند شامل اسلاتی غیر از اسلات های master اش باشد و همچنین Slave Node ها دسترسی تغییر ، حذف و یا ایجاد رکورد در کلاستر را ندارند و تنها میتوانند اطلاعات master خود را درون خود ذخیره سازی کنند تا زمانی که یک درخواستی مبنی بر واکشی اطلاعاتی که شامل اسلات های اون نود هست داده شد جواب مناسب را برگرداند. پس تعریف دقیقتر میتواند این باشد: "Node های Slave اجازه ذخیره ، تغییر و یا حذف رکورد را ندارند اما میتوانند مقادیری را که master اش شامل میشود را خوانده و برگرداند."

تعریف Sharding:

به فرایند اختصاص دادن slot ها به Node های master شاردینگ گفته میشود.

تعریف Meeting:

مرحله ای از کلاسترینگ که اتصال اولیه نود ها برای انتقال اطلاعات کلاستر است را Meeting گفته میشود.

تعریف Bus Port:

بعد از اجرای نود های ردیس در حالت clustering یک پورتی به عنوان busport باز میشود.اگر پورت خود ردیس 6379 باشد. همین پورت به اضافه 10000 میشود یعنی busport این نود 16379 است. این پورتی هست که نود های کلاستر بر روی این پورت باهم در ارتباط هستند و تغییرات و تنظیمات جدید کلاستر را به یکدیگر اطلاع میدهند.

روش کارکرد Redis در حالت Clustering:

در پست های قبلی دیدیم که ردیس به صورت Standalone با چه الگوریتم هایی کار میکرد. در حالت Clustering تمام آن شرایط بر قرار است. اما مفاهیم جدید تری برای تکمیل شرایط اضافه شده. ما قبلا دیدیم که Redis برای این که بفهمد یک کلید در کدام اسلات ذخیره میشود از الگوریتم CRC16 استفاده میکرد. و در تعاریف بالا توضیح دادیم که هر master شامل یک سری از اسلات ها میباشد. پس!!!

خیلی مهم:

اگر ما کلاستری با سه master بر روی پلتفرم کوبرنتیز با این معماری بالا اورده باشیم :
master 1 شامل اسلات های 0 تا 5460 با ایپی پاد 10.244.1.98
master 2 شامل اسلات های 5461 تا 10922 با ایپی پاد 10.244.2.105
master 3 شامل اسلات های 10923 تا 16383 با ایپی پاد 10.244.3.223
اگر بخواهیم یک کیلیدی را داخل master 1 ذخیره کنیم که بر اساس خروجی CRC16 شماره اسلات 10000 انتخاب شده باشد. master 1 به شما جواب MOVE همراه با ایپی پاد master 2 و شماره اسلات را برمیگرداند. پس ارتباط شما از بیرون کلاستر کوبر در حالت کلاستر ردیس امکان پذیر نخواهد بود، به دلیل این که ادرس ایپی برگردانده شده ایپی داخلی کلاستر کوبر خواهد بود. برای این که بتوانید ارتباط بیرون از کلاستر کوبر را با داخل کوبر برقرار کنید نیاز به یک پراکسی خواهید داشت که داخل کلاستر کوبر مستقر شود. (در ادامه توضیحات کاملتری داده خواهد شد)

روش های کلاسترینگ ردیس:

دستی (Manual):

نکته:توصیه میشود برای آموزش و تست حداقل یک بار با این روش پیش بروید.(پست جدایی برای این روش مینویسم)
در این روش کلاسترینگ شما باید ابتدا Node های ردیس را با cluster-enable: true اجرا کنید، سپس یک به یک به کلاستر اضافه کنید.
اضافه کردن Node جدید به یک کلاستر شامل مراحل زیر است:
1- اضافه کردن نود جدید
2- اتصال نود Slave به Master (درصورتی که نود جدید از نوع Slave باشد)
3- انتقال بخشی از اسلات ها به نود Master (درصورتی که نود جدید از نوع Master باشد)
4- Meeting با نود جدید برای انتقال اطلاعات جدید

ردیس کلاستر (‌Redis Cluster):

ردیس کلاستر، ابزاری برای کلاستر بندی نود های ردیس است. این ابزار امکاناتی مانند node affinity و اختصاص اسلات ها به master و ... دارد.
در این روش شما نیاز نیست مراحل را به صورت دستی انجام دهید. کافی است لیست ایپی ادرس نود ها را به این ابزار بدید تا این ابزار معماری بهینه مورد نیاز برای کلاستر شما را پیشنهاد دهد. در صورتی که کلاستر شما بر روی کوبر مستقر شود این ابزار تلاش میکند که نود های Slave شما بر روی نود های کلاستر کوبر پخش شود. مثلا اگر master 1 بر روی نود کوبر 1 باشد تلاش میکند تا حداقل یکی از Slave های مربوط به master 1 را بر روی نود کوبر 2 مستقر کند. بعد از پیاده سازی معماری کلاستر بر روی تمامی نود ها به صورت اتوماتیک MEETING انجام میدهد.

در پست های بعدی پیاده‌سازی هر دو روش توضیح داده خواهد شد.

rediskubernetesclusteringdatabasesharding
عاشق برنامه نویسی و مهندسی DevOps. تقریبا 8 ساله که برنامه نویسی میکنم و حدود 2 سال هم هست که به حوزه زیر ساخت و DevOps شدیدا علاقه مند شدم :)
شاید از این پست‌ها خوشتان بیاید