آشنایی با دیتابیس Redis


مقدمه

این روزها کسب و کارها تجارت خود را به وب سایت­ ها و اپلیکیشن ­ها انتقال دادند و با این اوصاف محبوبیت برنامه ­هایی که سمت سرور اجرا می­شوند روز به روز افزایش می­ یابد. برنامه ­های سمت سرور باید بتوانند حجم بالای درخواست­ها را در زمان کم پاسخ دهند. برای این نیازمندی یکی از راه حل ­هایی که استفاده می­شود، استفاده از پایگاه داده­ های NoSQL است که انواع مختلفی دارد و یکی از محبوب­ترین و کارا ترین آن­ها Redis است.


ردیس چیست؟

ردیس مخفف عبارت Remote Dictionary Server پایگاه داده متن باز، NoSQL key/value و In-Memory است که به زبان ANSI C نوشته شده است که عمدتا به عنوان cache برنامه ها یا پایگاه داده­ با پاسخ سریع استفاده می‌شود؛ زیرا Redis داده ها را، به جای هارد دیسک یا درایو ssd، در حافظه RAM ذخیره می‌کند. این کار باعث می‌شود که سرعت دسترسی به اطلاعات بسیار بالاتر رود. بالا بودن سرعت بزرگترین مزیت و تفاوت اصلی پایگاه داده ردیس با دیگر پایگاه های داده است. با توجه به اینکه اطلاعات در ردیس داخل RAM‌ نگهداری می‌شود، آن را In-Memory Database می‌نامند. ردیس روش­هایی برای مقابله با از دست رفتن دیتاها ارائه می دهد که با عنوان Redis Persistence شناخته می­شود. به روش­های Persist کردن داده ­های ردیس در بخشی جداگونه پرداخته خواهد شد.

منظور از آنکه می­گوییم NoSQL می­باشد یعنی برای ذخیره داده ­ها ساختار مشخصی نیاز نیست داشته باشد بر خلاف پایگاه داده ­های SQLمانند: MySQLیا PostgreSQL.

ردیس به عنوان پایگاه داده، cache، message broker و در یادگیری ماشین برای موارد استفاده مانند تشخیص تقلب در بازی و خدمات مالی و مناقصه بلادرنگ در فناوری تبلیغات می­تواند استفاده شود. بیشترین استفاده از این دیتابیس به عنوان حافظه نهان (cache) است هر چند که میتوان به عنوان دیتابیس اصلی یا کارگزار پیام (message broker) هم از آن استفاده کرد. همچنین می تواند انواع داده های سطح بالا مانند lists، maps، sets، sorted setsو Hash را استفاده کند.

ردیس یک راه حل محبوب ذخیره سازی داده است و توسط غول های فناوری مانند GitHub ،Instagram، Pinterest، Snapchat، Twitter، StackOverflow، Flickr و ... استفاده می شود.


معماری های پیاده سازی Redis

1. Standalone (1 Master + n replica)

زمانی که اطلاعات در یک نود تنها ذخیره شود اگر اتفاقی برای آن نود بیافتد ممکن است اطلاعات از دست برود. برای جلوگیری از بروز چنین اتفاقی معمولا از چند سرور استفاده می­کنند که نوشتن روی یک نود انجام می­شود سپس این تغییرات به نودهایی تحت عنوان replica یا slave فرستاده می­شود که به این تکنیک replication گفته می­شود.

ردیس برای استفاده از این روش نودی را به عنوان master و نودهایی را به عنوان slaveدر نظر می­گیرد که تمام داده­ها بر روی نود مستر نوشته می­شود و از آن جا که تمام نودهای salveبه مستر متصل هستند، تغییرات بعد از اعمال بر روی نود مستر به آن­ها نیز فرستاده می­شود.

در حالت بالا اگر اتفاقی برای نود مستر بیافتد، دیتا از بین نمی­رود و دیتاها روی نودهای slave موجود است اما در این حالت دیگر امکان نوشتن داده بر روی پایگاه داده وجود ندارد تا دوباره همان نود مستر راه اندازی شود یا اگر نود مستری در حالت standby وجود داشت که به عنوان slave مستر قبلی بود و با آن سینک بود را به عنوان مستر جدید به تمام نود های slave معرفی شود.

راه حل مشکل بالا استفاده از Sentinel (نگهبان) می­ باشد. Sentinel از یک سری فرایندهای نظارتی و اعلان های خودکار استفاده می‌کند و به کاربران در صورت بروز مشکل در نمونه های master و slave، اطلاع می‌دهد. همچنین در صورت لزوم، پیکربندی اتصالات جدید برای برنامه ها نیز به طور خودکار انجام می‌شود.

2. Redis Cluster (Sharding)

کانفیگ 3 نود Master (تعداد مسترها > 3)

کانفیگ n نود Slave به ازای هر Master(تعداد کل Slave ها = تعداد master ها * تعداد Slave به ازای هر Master)

در صورت بروز failover اگر master بیافتد، یکی از slave های متناظر آن تبدیل به master می­شود و این کار با cluster bus port (gossip protocol)انجام می­شود و زمانی که مشکل رخ داده برطرف شود و سرور دوم مجددا به روند قبلی خودش برگردد کلاستر مجددا به روزرسانی شده و سرور به مجموعه کلاستر بر می­گردد.

در کوبرنتیس به سرویس ردیس درخواست زده می­شود و سرویس آن را به یکی از پادها میفرستد و پاد ها بین خودشان و با توجه به کلید و هش آن درخواست را به پاد مربوطه میفرستد.

هر گره Redis Cluster به دو اتصال TCP باز نیاز دارد: یک پورت TCP Redis که برای سرویس دهی به مشتریان استفاده می شود، به عنوان مثال، 6379، و پورت دوم که به عنوان پورت گذرگاه کلاستر شناخته می شود. به طور پیش فرض، پورت گذرگاه خوشه ای با افزودن 10000 به پورت داده تنظیم می شود (به عنوان مثال، 16379). با این حال، می توانید این را در پیکربندی cluster-port تغییر دهید.

این پورت دوم برای گذرگاه خوشه ای استفاده می شود که یک کانال ارتباطی گره به گره با استفاده از یک پروتکل باینری است. گذرگاه خوشه ای توسط گره ها برای تشخیص خرابی، به روز رسانی پیکربندی، مجوز خرابی و غیره استفاده می شود. کلاینت ها هرگز نباید سعی کنند با پورت گذرگاه کلاستر ارتباط برقرار کنند، بلکه همیشه با پورت دستوری عادی Redis ارتباط برقرار کنند. هر دو پورت در فایروال باید باز باشد، در غیر این صورت گره های کلاستر Redis قادر به برقراری ارتباط نخواهند بود.


مزایای و کاربردهای Redis

  • پایگاه داده In-Memory

تمام داده‌های موجود در Redis در RAM ذخیره می‌شوند و سریع‌ترین زمان‌های دسترسی ممکن را برای درخواست‌های خواندن و نوشتن به داده‌ها ارائه می‌دهند.

  • بهینه شده برای سرعت

ردیس برای کارایی طراحی و پیاده سازی شده است. با ANSI C نوشته شده است، که بسیار کارآمد کامپایل می شود و نیاز به سربار کمی دارد. بیشتر اوقات از یک مدل حلقه رویداد single threadedاستفاده می کند که به طور بهینه از هسته CPU ای که روی آن در حال اجراست استفاده می کند. ساختارهای داده مورد استفاده داخلی توسط Redis برای حداکثر کارایی پیاده سازی شده اند و اکثر عملیات داده ها به زمان و فضا ثابت نیاز دارند.

  • ساختارهای داده انعطاف پذیر

داده های ذخیره شده در Redis می تواند به هر شکل و اندازه ای باشد. Redisایمن باینری است، بنابراین می تواند هر گونه داده، از متن قابل خواندن توسط انسان گرفته تا باینری های رمزگذاری شده را ذخیره کند. اندازه یک عنصر داده در Redisمی تواند از 0 بایت تا 0.5 گیگابایت متغیر باشد و به آن اجازه می دهد عملاً هر داده ای را در حافظه پنهان ذخیره کند. در حالی که در Memcached می‌توانند تنها 250 بایت باشند.

  • دسترسی مبتنی بر کلید

ردیس بر اساس مدل کلید-مقدار است که در آن داده ها ذخیره شده و توسط کلید از Redis واکشی می شوند. دسترسی مبتنی بر کلید زمان‌های دسترسی بسیار کارآمد را فراهم می­کند.

  • عملیات­های چند کلیدی

تعدادی از دستورات Redis بر روی چندین کلید عمل می کنند. عملیات چند کلیدی عملکرد کلی بهتری را در مقایسه با انجام عملیات پشت سر هم ارائه می‌کنند، زیرا به ارتباطات و مدیریت بسیار کمتری نیاز دارند.

  • اتمی بودن عملیات و transactions

هر عملیات در Redis اتمی است. این یکپارچگی داده‌های ذخیره‌شده را تضمین می‌کند و یک نمای ثابت از آن به فرآیندهایی که آن‌ها را به اشتراک می‌گذارند، ارائه می‌کند. اعمال سطح بالاتری از سازگاری در مدل داده‌ها با گروه‌بندی چندین عملیات در تراکنش‌ها امکان‌پذیر است، که در آن آنها به‌طور متوالی و بدون هیچ گونه عملیات درهم‌پیچیده دیگری اجرا می‌شوند.

  • منقضی شدن داده و Eviction policies

ردیس دارای چندین خط مشی تخلیه داده هست که وقتی مقدار فضایی که از مموری مشخص کردیم را اشغال کرد و به آن حد رسید دیتا را با policy مورد نظر حذف کند. در حالی که به عنوان مثال Memcachedفقط LRUرا ارائه می دهد.

  • کاهش منابع و هزینه ­ها

با استفاده از ردیس میتوان منابع کمتری را در سرور درگیر کرد و این نیاز به تهیه زیرساخت های پر هزینه را کمتر و کمرنگ تر می­کند. وقتی از خدمات رایانش ابری استفاده شود این کاهش منابع و هزینه ها ملموس تر خواهد بود.