همانطور که احتمالاً میدانید، راهکارهای کلاندادهای، مبتنی بر رایانش توزیع شده[1] هستند. بر اساس تعریف ویکیپدیا، یک سامانهی توزیعشده شامل چندین رایانه است که از طریق یک شبکهی با هم ارتباط دارند و برای تحقق یک هدف مشترک با یکدیگر تعامل میکنند. در یک چنین سامانهای، چالشهای مختلفی قابل تصور است که برخی از آنها عبارتند از: بهبود اتکاپذیری، وجود تاخیر، محدودیت پهنای باند، حفظ امنیت، تغییر در توپولوژی، همگامسازی، ناهمگونی عناصر.
فناوریهای کلاندادهای با آگاهی از این چالشها، همواره در تلاش هستند تا با استفاده از سازوکارهای مختلف آنها را مدیریت نمایند. برای مثال، به منظور مقابله با چالش محدودیت پهنای باند تلاش میشود تا اصطلاحاً پردازش به سمت دادهها سوق داده شود. این امر به این مفهوم است که به جای اینکه دادهها جهت اجرای پردازش روی سامانههای خاصی بارگذاری شوند، پردازش به صورت توزیعشده روی سامانههای دربردارندهی دادهها، اجرا گردد.
در این مقاله قصد داریم تا به طور ویژه به چالش همگامسازی بپردازیم و ابزار زوکیپر را که برای این منظور در زیستبومهای کلاندادهای مورد استفاده قرار میگیرد، معرفی کنیم. معمولاً زمانی صحبت از همگامسازی میشود که نیاز به اجرای عملیاتی در بستر شبکه با نقشآفرینی چندین گره وجود داشته باشد. به عنوان مثال، در صورتیکه یک فایل روی چندین گره از یک سامانهی توزیعشده میزبانی شود و پردازههای مختلفی (روی گرههای متفاوت) جهت خواندن و نوشتن به آن دسترسی پیدا کنند، ممکن است در اثر دسترسیهای همزمان، محتوای فایل به صورت ناخواستهای تغییر پیدا کرده و اصطلاحاً خراب[2] شود. در چنین شرایطی نیاز است تا با استفاده از سازوکاری، دسترسیها به فایل همگامسازی شود. از آنجایی که ارائهی خدمت همگامسازی، هدف اصلی زوکیپر است، برای حل این مسئله میتوان از سازوکار قفل توزیعشده[3] موجود در این ابزار بهره جست. قبل از اینکه زوکیپر را معرفی کنیم لازم است مروری را روی روشهای مختلف همگامسازی در یک فضای توزیعشده داشته باشیم. روشهای عمده برای این منظور عبارتاند از:
- مبادلهی پیام از طریق شبکه
- خواندن/نوشتن در یک فضای ذخیرهسازی مشترک
- استفاده از قفل توزیعشده
هر کدام از این روشها، مزایا و معایب خود را دارند که بررسی آنها مقالهای جداگانه را میطلبد. برای همین در ادامه به سراغ معرفی زوکیپر میرویم.
زوکیپر یک خدمت همگامسازی توزیعشده و متنباز برای کاربردهای توزیعشده است. این خدمت، بسیار دسترسیپذیر[4] و تابآورنده در برابر خطا[5] است. زوکیپر، بستری متشکل از مجموعهای از عملیات اولیه[6] را در قالب یک واسط[7] ساده برای کاربردهای توزیعشده فراهم میآورد و آنها قادر میسازد تا با بهرهبرداری از این عملیات، خدمتهای سطح بالاتری را متناسب با نیازمندیهای خود طراحی نمایند. به عنوان نمونههایی از این خدمتها، میتوان به نامگذاری[8]، مدیریت پیکربندی[9]، قفلها و موارد مشابه اشاره نمود.
شکل ۱: دادهساختار درختی فضای نام در زوکیپر
اکنون لازم است به این پرسش پاسخ دهیم که زوکیپر، ما را در حل چه مسایلی یاری میرساند. به عنوان مواردی از کاربردهای زوکیپر میتوان به موارد زیر اشاره کرد:
- عضویت در گروه[10]
- انتخاب پیشرو[11]
- پیادهسازی سازوکارهای همگامسازی توزیعشده مانند قفلها، صفها[12]، موانع[13] و غیره
- جریان کاری توزیعشده
با یک جستجوی ساده در وب میتوانید اطلاعات بیشتری را در مورد هر کدام از کاربردهای گفتهشده در بالا بیابید.
معمولاً در محیط های توزیعشده با مسائلی از جنس عضویت در گروه، انتخاب پیشرو و موارد مشابه دیگر روبرو میشویم که زوکیپر میتواند به عنوان یک راهحل اساسی برای آنها مدنظر باشد. برای مثال در بسیاری از فناوریهای کلاندادهای مانند گیراف[14] که یک موتور پردازش گراف است، برای همگامسازی گرههای مختلف شبکه از خدمت مانع ارائهشده در زوکیپر استفاده میشود.
در آخر بحث باید به این نکته اشاره کرد که شاید برخی بر این باور باشند که طراحی و توسعهی این خدمات از صفر نسبت به استفاده از ابزارهایی مانند زوکیپر برای همگامسازی عملیات در یک محیط توزیعشده، ارجحیت دارد. برای متقاعد کردن این دوستان به استفاده از زوکیپر باید چند نکته را یادآوری نمود: اول اینکه، این کار چیزی جز اتلاف زمان نیست، زیرا خدمت دیگری وجود دارد که نیاز شما را برآورده میکند. دوم، عیبیابی باگهایی نظیر شرایط مسابقه[15] یا بنبستها[16] برای شما دشوار خواهد بود، و آخر اینکه، پشتیبانی از اتکاپذیری و تابآوری در برابر خطا، کار سادهای نخواهد بود. دقیقاً همانطور که شما برای پیادهسازی یک نرمافزار، مولد اعداد تصادفی[17] یا توابع درهمسازی[18] را خودتان پیادهسازی نمینمایید و از قابلیتها و کتابخانههای زبان برنامهنویسی بهره میجویید، بهتر است برای پیادهسازی خدمتهای مبتنی بر همگامسازی در فضای توزیعشده از ابزارهای موجود مانند زوکیپر استفاده نمایید.
[1] distributed computing
[2] corrupt
[3] distributed lock
[4] highly-available
[5] fault-tolerant
[6] primitive
[7] interface
[8] naming
[9] configuration management
[10] group membership problem
[11] leader election
[12] queue
[13] barrier
[14] Giraph
[15] race condition
[16] deadlock
[17] pseudo-random generator
[18] hash function