آشنایی با دیتابیس 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را ارائه می دهد.
- کاهش منابع و هزینه ها
با استفاده از ردیس میتوان منابع کمتری را در سرور درگیر کرد و این نیاز به تهیه زیرساخت های پر هزینه را کمتر و کمرنگ تر میکند. وقتی از خدمات رایانش ابری استفاده شود این کاهش منابع و هزینه ها ملموس تر خواهد بود.
مطلبی دیگر از این انتشارات
آشنایی با PaaS
مطلبی دیگر از این انتشارات
آشنایی با داکر
مطلبی دیگر از این انتشارات
آشنایی با پایگاه داده رابطه ای