سیستم ها و اپلیکیشنهای پردازشی توزیع شده معتبر، در بسیاری از کسب و کارهای مشهور به ویژه در حوزه های اتوماسیون، مدیریت فرآیندهای مهم کسب و کار و ارائه خدمات به مشتریان، یکی از عوامل بنیادی محسوب میشوند. توسعهدهندگان و مدیران این نوع سیستمها، مسئولیت ارائه تمامی راهکارهای فناوری اطلاعات (IT) جهت تضمین حداکثر بهینگی را برعهده دارند. طراحی، آزمایش و پیادهسازی استراتژیها برای بهبود عملکرد، دسترسی، قابلیت اعتماد و مقیاسپذیری، از جمله وظایف مهم این افراد است. کشینگ (Caching) یکی از روش های ساده ولی موثر جهت بهبود عملکرد برنامهها است که میتوان به آن اتکا کرد. پیش از بررسی چند ابزار کشینگ برای لینوکس، به طور خلاصه به مفهوم، جایگاه، نحوه استفاده و مزایای Caching پرداخته میشود.
تصویر(1)
کشینگ یا کش محتوا چیست؟
کشینگ (یا کش محتوا) یکی از روشهای رایج در فناوری اطلاعات است که برای افزایش سرعت و بهبود عملکرد در فراخوانی دادهها مورد استفاده قرار میگیرد. در این روش، نسخههایی از دادهها در یک مکان موقت (کش) ذخیره میشوند تا در هنگام فراخوانی، دادهها با سرعت بیشتری در دسترس قرار گیرند. با توجه به نوع و هدف کشینگ، دادههای مختلفی از جمله فایل ها (مانند فایل های HTML، اسکریپت ها، تصاویر، فایل متنی و غیره)، عملیات یا رکوردهای پایگاه داده، فراخوانی های API، رکوردهای DNS و… میتوانند در کش ذخیره شوند.
کش می تواند به صورت سخت افزاری یا نرم افزاری باشد. کش نرم افزاری که در این مقاله به آن پرداخته می شود، می تواند در لایه های مختلف پشته نرم افزاری (application stack) پیاده سازی گردد. Caching در سمت کلاینت یا در لایه نمایش اپلیکیشن نیز قابل اجرا است. به عنوان مثال، می توان به کشینگ مرورگر یا کشینگ اپلیکیشن ها اشاره کرد. تقریبا تمامی مرورگرهای جدید از کش HTTP پشتیبانی می کنند.
احتمالا عبارت معروف "پاک کردن کش" را در هنگام دسترسی به یک اپلیکیشن تحت وب شنیده باشید. این عمل به منظور مشاهده آخرین و بروزترین داده ها و محتوای وب سایت یا اپلیکیشن انجام می شود. با انجام این کار، مرورگر از نسخه قدیمی محتوا که در لوکال ذخیره شده است، استفاده نخواهد کرد. یکی دیگر از روشهای کشینگ سمت کلاینت، کشینگ DNS است که در سطح سیستم عامل (OS) انجام میشود. در این روش، اطلاعات مربوط به DNS lookup قبلی توسط سیستم عامل یا مرورگر در حافظه موقت ذخیره خواهد شد.
همچنین، کشینگ میتواند در سطح شبکه نیز پیادهسازی شود. از نمونههای رایج این نوع کشینگ، میتوان به شبکههای توزیع محتوا (CDN) اشاره کرد. همچنین می توانید کشینگ را در سرور(های) مبدا یا پشتیبان پیاده سازی نمایید. انواع مختلفی از کشینگ سطح سرور وجود دارد که عبارتند از:
- کشینگ وب سرور - برای کشینگ تصاویر، اسناد، اسکریپت ها و..
- کشینگ اپلیکیشن یا memorization - برای خواندن فایل ها از دیسک، داده ها از سرویس ها یا پروسه ها، درخواست اطلاعات از یک API و… کاربرد دارد.
- کشینگ دیتابیس - جهت دسترسی سریع به داده هایی که مکررا مورد استفاده قرار می گیرند، مانند ردیف های درخواست شده از پایگاه داده، نتایج کوئری و عملیات های دیگر
توجه داشته باشید که داده های کش شده می توانند در سیستمهای ذخیره سازی مختلف از جمله پایگاه داده، فایل، حافظه سیستم و… نگهداری شوند اما جهت عملکرد بهتر نیاز است در یک محیط سریع تر از منبع اصلی ذخیره شوند. در این زمینه، کشینگ in-memory یکی از مؤثرترین و رایجترین انواع کشینگ است که میتواند بهبود قابل توجهی در عملکرد سیستم و کاهش زمان دسترسی به دادهها ایجاد کند.
چرا از کشینگ استفاده می شود؟
کشینگ مزایای بسیار زیادی دارد که می توان به موارد زیر اشاره کرد:
- در سطح پایگاه داده، عملکرد خواندن داده ها بهبود پیدا کرده و به میکروثانیه می رسد. همچنین می توانید از کش نوشتاری استفاده نمایید تا عملکرد نوشتن نیز بهبود پیدا کند. در این روش، دادهها در حافظه (memory) نوشته شده و در بازه زمانی مشخصی در دیسک یا حافظه اصلی ذخیره می شوند اما از نظر یکپارچگی دادهها، این روش ممکن است پیامدهای نامطلوبی در پی داشته باشد. به عنوان مثال، زمانی که سیستم قبل از ذخیره داده ها در حافظه اصلی اصطلاحا کرش کند، میتواند منجر به از دست رفتن دادهها شود.
- در سطح اپلیکیشن، کش می تواند دادههای پراستفاده را درون فرایند اپلیکیشن ذخیره کند. به این ترتیب زمان جستجوی داده ها، به خصوص در بستر شبکه، از چندین ثانیه به میکروثانیه کاهش پیدا خواهد کرد.
- با در نظر گرفتن عملکرد کلی اپلیکیشن و سرور، کشینگ به کاهش بار سرور، تاخیر و پهنای باند شبکه کمک میکند. زیرا دادههای کش شده به کلاینت ها ارائه می شود و در نتیجه زمان پاسخ دهی و سرعت تحویل، بهبود می یابد.
- کشینگ، قابلیت دسترسی آسان به محتوا (content availability)، به خصوص از طریق CDN ها را فراهم می کند.
در این مقاله، به بررسی نمونه هایی از ابزار کشینگ برای لینوکس، پرداخته می شود.
1- Redis
تصویر(2)
Redis که مخفف REmote DIctionary Server است، یک سیستم متن باز و رایگان می باشد که با سرعت بالا و انعطاف پذیری، در اکثر زبان های برنامه نویسی قابل استفاده است. اگر چه ردیس یک ابزار کشینگ برای لینوکس (پلتفرم پیشنهادی جهت پیاده سازی) و OS X است اما در سایر سیستم های POSIX مانند BSD* نیز بدون وابستگی خارجی کار می کند.
ردیس انواع مختلف ساختار داده ها از جمله رشتهها، هشها، لیستها، مجموعهها، مجموعههای مرتب شده، بیت مپها و استریمها را پشتیبانی میکند. این ویژگی برنامه نویسان را قادر می سازد تا برای حل مسئله خاص خود، از ساختار داده مشخصی استفاده کنند. ردیس از عملیات خودکار روی ساختار داده های خود پشتیبانی می کند. از جمله این موارد می توان به اضافه کردن در انتهای یک رشته (append)، اضافه کردن عناصر به یک لیست، افزایش مقدار یک هش و… اشاره کرد. از ویژگی های Redis می توان به پشتیبانی transactions (به وسیله transaction امکان اجرای مجموعه ای از دستورات در یک مرحله وجود دارد)، اسکریپت Lua و گستره متنوعی از امکانات در خصوص پایداری و رمزنگاری ارتباط بین مشتری و سرور اشاره کرد.
Redis به عنوان یک پایگاه داده که اطلاعات را در حافظه و همچنین دیسک (جهت حفظ و ایمنی داده ها) ذخیره می کند، بهترین عملکرد خود را هنگام کار با in-memory dataset (مجموعه داده مبتنی بر حافظه) ارائه می دهد. با این حال شما می توانید از آن جهت کار با پایگاه داده های ذخیره شده روی دیسک همچون MySQL و PostgreSQL و... استفاده نمایید. به عنوان مثال، می توانید دادههای کوچک را در Redis نگهداری کرده و بخش های دیگر داده را در یک پایگاه داده ذخیره شده روی دیسک حفظ کنید.
ردیس از روش های مختلفی برای امنیت پشتیبانی می کند. از جمله این روش ها میتوان به استفاده از قابلیت protected-mode یا "حالت محافظت شده" جهت مراقبت از داده های ردیس در برابر دسترسی شبکه های خارجی اشاره کرد. این سیستم از احراز هویت در سمت کلاینت و سرور و همچنین TLS در تمامی کانال های ارتباطی مانند ارتباط با مشتری، لینک های تکراری و.. پشتیبانی می کند. ردیس (Redis) کاربردهای بسیار زیادی دارد که شامل کش کردن پایگاه داده، کش کامل صفحات، مدیریت داده های سشن کاربر، ذخیره پاسخ های API و.. می شود. این ویژگیها میتوانند در بازیها، برنامههای شبکه اجتماعی، فید RSS، تحلیل فوری داده و… مورد استفاده قرار گیرند.
2- Memcached
تصویر(3)
Memcached ابزار کشینگ برای لینوکس است که با ذخیره سازی کوچکترین اطلاعات مانند نتایج پایگاه داده در حافظه، به بهبود سرعت سایت ها کمک میکند. این ابزار رایگان می باشد و روی انواع سیستم عامل ها قابل استفاده است. Memcached دارای دو بخش کلاینت و سرور است. کلاینت میداند که اطلاعات را باید به کجا ارسال کند و همچنین در صورت عدم اتصال به سرور، چه کاری انجام دهد. Memcached فقط قادر به ذخیره رشته ها است و امکان تکثیر دادهها را مانند Redis ندارد. با اضافه کردن سرورهای بیشتر، میتوانید حجم حافظه موجود را افزایش دهید. همچنین Memcached میتواند عملیات رمزنگاری از طریق TLS و احراز هویت را انجام دهد اما این ویژگی هنوز در دست آزمایش است.
3. Apache Ignite
تصویر(4)
آپاچی ایگنایت، یک سیستم مدیریت پایگاه داده متن باز و مقیاسپذیر افقی می باشد و به منظور ذخیره دادههایی با فرمت کلید-مقدار، کش و پایگاه داده چند مدلی طراحی شده است. این سیستم، APIهای پردازشی قدرتمندی را برای محاسبه دادههای توزیع شده فراهم می کند. این ابزار کشینگ برای لینوکس با سیستمعاملهای مختلف قابل استفاده است و قابلیت ارتباط با پایگاه داده هایی مانند MySQL و PostgreSQL را خواهد داشت. ویژگیهای ایگنایت، امنیت اطلاعات را تضمین می کند. همچنین میتواند کارهایی از جمله سازماندهی داده برای دسترسی سریع، تحلیل داده و پیگیری رابطه بین بخش های مختلف داده را انجام دهد.
یکی از ویژگیهای مهم Apache Ignite، امکان پردازش توزیعشده است. با استفاده از این سامانه، میتوان دادهها را در خوشه های متعدد ذخیره و پردازش کرد. Ignite از الگوریتمهای پیچیده پردازش توزیعشده برای مدیریت دادهها و پردازش آنها استفاده میکند. بنابراین، استفاده از Apache Ignite میتواند در پروژههایی که با دادههای بزرگ سر و کار دارند، منجر به بهبود کارایی و کاهش هزینهها شود.
4- Couchbase Server
تصویر(5)
Couchbase Server یک نوع پایگاه داده NoSQL است که برای ذخیره و دسترسی به دادههای ساختاری و غیرساختاری استفاده میشود. این پایگاه داده با استفاده از فناوریهای جدید و پیشرفته، امکاناتی را برای برنامهنویسان و مدیران سیستم فراهم میکند که در پایگاههای داده رابطهای بهصورت پیشفرض موجود نیستند.
یکی از ویژگیهای مهم Couchbase Server، قابلیت کشسازی دادهها است که با استفاده از فناوری Memcached انجام میشود. این ویژگی باعث افزایش سرعت و کاهش زمان دسترسی به دادهها می گردد. به طور کلی، Couchbase Server بهعنوان یک پایگاه داده قدرتمند و ابزار کشینگ برای لینوکس، باعث افزایش کارایی و کاهش هزینهها در پروژههای نرمافزاری مختلف میشود.
5- Hazelcast IMDG
تصویر(6)
Hazelcast IMDG یک سامانه پردازش توزیع شده می باشد که به منظور پردازش و ذخیره دادههای بزرگ، پیادهسازی شده است. این سامانه از طریق توزیع دادهها و پردازش آنها روی گرههای مختلف، امکاناتی را فراهم میکند تا در مواردی که نیاز به پردازش حجم بزرگی از دادهها است دارای عملکرد مناسبی باشد. از دیگر ویژگیهای Hazelcast IMDG میتوان به پشتیبانی از حافظه اشتراکی در سطح اپلیکیشن، امکان استفاده از راهکارهای متنوع ذخیرهسازی داده، مانند key-value ،Map و همچنین پشتیبانی از برنامهنویسی چند رشته ای اشاره کرد. یکی از ویژگیهای مهم Hazelcast IMDG، قابلیت انعطافپذیری آن است. Hazelcast IMDG از الگوریتمهای پیچیده مربوط به پردازش توزیعشده استفاده میکند و به کاربران این امکان را میدهد که با دادههای بزرگ سر و کار داشته باشند.
6- Mcrouter
Mcrouter یک نرمافزار رایگان و متن باز است که توسط فیسبوک توسعه یافته و نگهداری میشود. این ابزار کشینگ برای لینوکس به منظور افزایش مقیاس پذیری سامانههای Memcached طراحی شده است. Mcrouter از پروتکل Memcached ASCII پشتیبانی میکند و ویژگیهایی مانند مسیریابی قابل تنظیم، پشتیبانی از چندین خوشه، حافظه کش چند سطحی، ادغام اتصال، چندین شیوه هش کردن، مسیریابی بر پایه پیشوند، عملیات پخش و دسترسیهای آماری و اشکالزدایی را دارا می باشد. همچنین، این نرمافزار از IPv6 و SSL پشتیبانی میکند.
این نرمافزار در فیسبوک و اینستاگرام به عنوان بخش اصلی زیرساخت حافظه کش، برای پردازش تقریبا 5 میلیارد درخواست در ثانیه استفاده میشود. به طور کلی، Mcrouter یک راهکار مفید برای افزایش کارایی و مقیاسپذیری سامانههای Memcached است. این نرم افزار با ویژگیهای پیشرفتهای که دارد، میتواند به بهبود عملکرد سامانههای پردازش داده کمک کند.
7- Varnish Cache
تصویر(7)
Varnish Cache یک ابزار کشینگ برای لینوکس با سیستم شتاب دهنده برای اپلیکیشن های تحت وب است که با نصب آن می توانید درخواست های کاربران را به سمت وب سروری که اپلیکیشن شما در آن قرار دارد، هدایت کنید. سپس این امکان را خواهید داشت که درخواست های کاربران را در حافظه نگهداری نموده تا بار ترافیکی روی سرور کمتر شود و پاسخ سریعتری به کاربران ارائه گردد.
این سیستم با ویژگی هایی مانند پشتیبانی از ماژول های Varnish یا VMODS و قابلیت استفاده به عنوان فایروال، دفاع در برابر حملات DDoS، حفاظت در برابر hotlinking، توزیع بار و ... ارائه می شود. در کنار این مزایا، محدودیت هایی نیز وجود دارد. برای مثال به صورت پیش فرض از SSL/TLS پشتیبانی نمی کند.
8- Squid Caching Proxy
Squid Caching Proxy یک نرمافزار متنباز و رایگان برای ارائه خدمات کش سرور است که برای پروتکلهای HTTP، HTTPS و FTP قابل استفاده می باشد. این نرمافزار درخواست مشتریان را دریافت کرده و آنها را به سرورهای مشخص شده، می فرستد. پس از دریافت پاسخ از سرور، نسخهای از محتوا را در کش ذخیره کرده و سپس به مشتریان ارائه میدهد. با استفاده از کش سرور، درخواستهای آتی برای همان محتوا از طریق کش پاسخ داده میشوند که موجب بهبود عملکرد و سرعت تحویل محتوا به مشتریان خواهد شد. همچنین این نرمافزار از قابلیتهای امنیتی مانند کنترل دسترسی، اعتبارسنجی و احراز هویت، پشتیبانی از SSL / TLS و… برخوردار می باشد.
9- Nginx
تصویر(8)
NGINX یک وب سرور است و از پرطرفدارترین راهکارها برای ایجاد زیرساخت وب می باشد. یکی از ویژگی های جذاب NGINX، قابلیت تنظیم آن به گونه ای است که در صورت عدم دریافت محتوای جدید از سرور اصلی، محتوای قدیمی را از حافظه کش خود به کاربران ارائه میدهد.
NGINX امکانات امنیتی فراوانی را جهت ایمن سازی سیستمهای تحت وب فراهم میکند. از جمله این موارد می توان به پشتیبانی از SSL، محدود کردن دسترسی با استفاده از اعتبار سنجی HTTP، اعتبار سنجی JWT، محدود کردن دسترسی بر اساس موقعیت جغرافیایی و… اشاره کرد. همچنین NGINX به عنوان یک توزیع کننده بار، ترمینال SSL، شتاب دهنده اپلیکیشن و API gateway در یک پشته نرم افزاری بهکار میرود.
10- Apache Traffic Server
Apache Traffic Server یک نرمافزار متن باز، سریع، قابل توسعه و بسیار گسترده می باشد که به عنوان یک سرور کش در سطح شبکه، جهت بهبود عملکرد آن طراحی شده است. این نرمافزار در سازمان ها و شرکتهای ارائه دهنده اینترنت و… استفاده میشود. همچنین این نرمافزار از احراز هویت و اعتبار سنجی از طریق افزونه، ثبت گزارش (برای درخواست ها و خطاهایی که تشخیص میدهد) و مانیتورینگ پشتیبانی میکند.
نتیجه گیری
حافظه کش یکی از مفیدترین و قدیمیترین فناوری های ارائه محتوای وب می باشد که در درجه اول برای افزایش سرعت وب سایت ها یا اپلیکیشنها طراحی شده است و ده ابزار کشینگ برای لینوکس در این مقاله معرفی شده اند. این قابلیت به کاهش بار سرور، تاخیر و پهنای باند شبکه شما کمک می کند زیرا داده های کش شده به مشتریان ارائه می شود. بنابراین زمان پاسخگویی اپلیکیشن و سرعت تحویل به مشتریان را بهبود می بخشد.