سامانه مجازی‌سازی PVM راهکار اختصاصی و تولید شرکت «رایانش ابری آوید» به منظور پیاده‌سازی تکنولوژی مجازی‌سازی سرور/ میزکار در شرکت‌ها و سازمان‌ها است.

به جهت آشنایی دقیق‌تر با مسیر و ساختار توسعه PVM، مطلب حاضر با هدف ارائه جزئیات معماری و توسعه این سامانه آماده شده است.

اصول معماری PVM چیست؟

انتخاب معماری و اجزای نرم‌افزار از مهم‌ترین گام‌ها در روند توسعه محصول است. چراکه تضمین‌کننده حیات نرم‌افزار و موفقیت آینده محصول از جهت پاسخ‌گویی به نیازهای آینده و همچنین توان تغییر در مقابل درخواست‌های ناگهانی و پیشرفت تکنولوژی می‌باشد.

مقرون به‌صرفه بودن نرم‌افزار وابسته به هوشمندی تیم توسعه آن به جهت استفاده از معماری منطقی و مناسب است.
شرکت رایانش ابری آوید بعد از قریب به 20 سال تجربه کار در زمینه نرم‌افزارهای سیستمی و امنیتی بر بستر سیستم‌عامل لینوکس، چه از نظر توسعه و چه از نظر کاربری، بر اساس فرصت تشخیص داده شده اقدام به توسعه سامانه PVM کرد.

تجربه تیم در توسعه نرم‌افزارهایی همچون UTM, IPTables-TNG و همچنین کاربری نرم‌افزارهای امنیتی و شبکه در سطح وسیعی از شبکه‌های سازمان‌ها پشتوانه بسیار خوبی برای درک نیاز این‌گونه نرم‌افزارها و همچنین وضعیت موجود انتظارات از یک محصول زیرساختی می‌باشد.

شرکت «رایانش ابری آوید» بر پایه تجربه‌های ارزشمند خود توسعه Frameworkهای مورد نیاز به جای استفاده و وابستگی به Frameworkهای موجود را، از ابتدای حرکت در مسیر توسعه PVM، در برنامه خود داشته است. این مهم برگرفته از تجربه‌های موفق جهانی در شرکت‌های بزرگ فناوری‌اطلاعات جهان و همچنین به دلیل تضمین چرخه حیات طولانی نرم‌افزار و توان پشتیبانی از آن توسعه، انجام شده است.

آشنایی با تجربه جهانی در حوزه رایانش ابری و مجازیسازی

هم‌اکنون ارائه‌دهندگان و توسعه‌دهندگان بزرگی در حوزه رایانش ابری در حال فعالیت هستند که از جمله آن‌ها می‌توان به Amazon, Google, Facebook, Redhat اشاره کرد.
به دلیل ماهیت کاری شرکت، تمامی نرم‌افزارهای متن‌باز موجود در حوزه رایانش ابری به صورت کامل از منظر معماری و کاربرد مورد بررسی قرار گرفتند. همچنین تیم فنی شرکت تحقیق جامعی در نحوه کار و توسعه نرم‌افزارها در شرکت‌های مطرح حوزه رایانش ابری انجام داده است که اکثر خروجی‌های این بررسی‌ها به این شرح است:

  • این شرکت‌ها تمامی Frameworkهای مورد نیاز خود را به صورت کامل توسعه می‌دهند و عمده‌ این Frameworkها به صورت متن‌باز ارائه نمی‌شوند. (تقریباً تمام آن‌ها)
    دلیل توسعه Frameworkها عدم وابستگی به نرم‌افزارهای ثانویه و قدرت انعطاف در توسعه قابلیت‌ها و پاسخ‌گویی به نیازها می‌باشد.
  • پردازش تمامی اطلاعات وب در این شرکت‌ها توسط برنامه‌هایی به زبان C و یا ++C انجام می‌شود. این شرکت‌ها از Web Serverها به شیوه معمول استفاده نمی‌کنند. یکی از نکات بسیار مهم در این شرکت‌ها جایگاه ویژه زبان‌های C و ++C در توسعه نرم‌افزارهای سیستمی است.
  • صاحب تکنولوژی بودن برای این شرکت‌ها بسیار حائز اهمیت است. به عنوان مثال شرکت ردهت برای کار در حوزه مجازی‌سازی شرکت دارنده KVM را خریداری کرد. این موضوع بدین معنا است که برای دست‌یابی به خروجی مناسب باید تا حد امکان صاحب Frameworkها و تکنولوژی‌های مورد نیاز باشید.
  • تمام این شرکت‌ها از نحوه توسعه به صورت متدولوژی متن‌باز استفاده می‌کنند. به این معنی که شما از نرم‌افزارهای پایه و کاملاً متن‌باز استفاده کرده و اقدام به توسعه Frameworkهای مدیریتی یا تکنولوژی‌های خاص خود می‌کنید. (با فلسفه‌ی تولید آوید آشنا شوید)
  • در فضای متن‌با‌ز هیچ‌گونه محصول آماده و رایگانی برای کار در محیط‌های Enterprise وجود ندارد. اکثر نرم‌افزارهایی که به صورت متن‌باز و رایگان ارائه می‌شوند به صورت یک Prototype عرضه می‌شوند که علاوه بر استخراج نیازهای محصولات شرکت‌های دارنده تکنولوژی، فضای بسیار خوبی برای Bug Fix و درک نیاز کاربران می‌باشد.
  • بدون توسعه زیرساخت‌های مورد نیاز در محصول خود، قابلیت پاسخ‌گویی به نیاز کارفرمایان و پشتیبانی از محصول در طولانی‌مدت برای دارنده محصول فراهم نخواهد شد.

موارد ذکر شده و تجربه‌های شرکت در توسعه و کاربری نرم‌افزارهای سیستمی پشتوانه انتخاب مسیر توسعه PVM و تکنولوژی‌های مورد استفاده در این مسیر بوده است.
شرکت «رایانش ابری آوید» اعتقاد دارد ارائه پشتیبانی مناسب به کارفرمایان و همچنین تضمین حیات طولانی‌مدت محصول بدون توسعه امکان‌پذیر نمی‌باشد.
در ادامه به بررسی جزئیات بیشتر در اجزای ساختار PVM و فلسفه وجودی و کاربرد آن‌ها می‌پردازیم.

اجزای اصلی PVM

در معماری PVM سه اصل مورد توجه بوده است:

  • توسعه Frameworkهای مورد نیاز
  • Modular بودن و قدرت و انعطاف مناسب در توسعه
  • سادگی و روانی و عدم وابستگی به نرم‌افزارهای ثانویه
معماری PVM

در یک نگاه کلی شکل سامانه PVM در تصویر فوق مشخص شده است:

  • QEMU
    Qemu یک شبیه‌ساز ماشین مجازی عمومی و متن‌باز است که می‌تواند مجازی‌سازی سخت‌افزاری را انجام دهد.
  • KVM
    KVM به‌تنهایی یک درایور هسته لینوکس است، نقش KVM فعال‌سازی قابلیت کنترل و بهره‌برداری از تکنولوژی مجازی‌سازی سخت‌افزاری در پردازنده‌ها است. این تکنولوژی به ماشین مجازی اجازه می‌دهد با سرعتی بسیار نزدیک به سیستم واقعی، در شرایط مختلف اجرا شود.
  • Rocky
    سیستم‌عامل برپایه ردهت که به‌عنوان سیستم‌عامل پایه مورد استفاده قرار گرفته است.
  • PVM
    شامل پیاده‌سازی هسته سامانه مجازی‌سازی PVM است.

اجزای اصلی سامانه PVM به شرح زیر است. ترتیب ذکر شده از پایه‌ای‌ترین لایه به سطوح بالاتر می‌باشد:

  • PParam
  • Putil
  • sball
  • PVM Modules
اجزای اصلی سامانه PVM

زبان برنامه‌نویسی

در PVM از چند زبان برنامه‌نویسی براساس نیاز، استفاده می‌شود:

  • زبان ++C که برای توسعه هسته (Core) PVM در سیستم‌عامل لینوکس استفاده شده است. بیشتر مباحث فنی و توسعه‌ای PVM و نکات اصلی در معماری PVM در این لایه می‌باشد.
    قابل ذکر است این زبان در رنکینگ زبان‌های برنامه‌نویسی دنیا در رده 5 زبان برتر دنیا قرار دارد و به دلیل ماهیت شیءگرایی و همچنین سرعت اجرای آن، بسیار مورد توجه قرار گرفته است.
  • Bash که در سمت هسته برای توسعه برنامه‌های مکمل کوچک همچون سرویس‌ها مورد استفاده قرار گرفته است.
  • #C برای توسعه رابط کاربری ویندوزی استفاده می‌شود.
  • Python برای توسعه رابط تحت وب PVM مورد استفاده قرار گرفته است. این زبان نیز در رده 5 زبان برتر دنیا قرار دارد.
  • Java برای توسعه رابط کاربری میزکار مجازی PVM برای کاربران استفاده می‌شود.

کتابخانه PParam

کتابخانه Pparam پایه‌ای‌ترین کتابخانه در PVM می‌باشد که به صورت متن‌باز در github ارائه شده است. در ابتدای توسعه PVM دغدغه اصلی استفاده از پروتکل و فرمت ارتباطی مناسب بین نودهای کلاستر و همچنین ارتباط کاربر با آن بود.

آنچه که هم‌اکنون بسیار مرسوم است استفاده از XML و JSON است. ما به دنبال شیوه‌ای مناسب جهت تبدیل اشیاء و کلاس‌ها در زبان ++C به XML و یا JSON بودیم و به طور کلی به دنبال لایه‌ای که ذغدغه‌های تبدیل فرمت اطلاعات را به عهده بگیرد. اولویت یک در این لایه، سبکی و سادگی آن بود.

بعد از بررسی‌های گوناگون اقدام به توسعه کتابخانه Pparam کردیم. این کتابخانه که منطبق با استانداردهای زبان ++C توسعه یافته است، ساختار تعریف پارامترهای داده‌ای را مشخص می‌کند.

با این کتابخانه برنامه‌نویس قادر است به‌راحتی شیء خود را تعریف کرده و آن را به فرمت‌های داده‌ای مختلف تبدیل کند و یا اینکه با فرمت‌های داده‌ای مختلف شیء خود را بارگذاری کند.

توسعه پارامترهای گوناگون در این کتابخانه در قالب sparam علاوه بر غنی کردن این کتابخانه، در جهت پشتیبانی ازفرمت‌های داده‌ای متنوع، صحت داده‌ای این پارامترها را نیز تضمین می کند. از جمله این پارامترها عبارتند از:

  • IP4Param
  • IP6Param
  • MACParam
  • BoolParam
نمونه از کد PParam

براساس استاندارد توسعه‌یافته در Pparam شیء ویژه‌ای به نام Xobject توسعه پیدا کرده است. در فضای Xobject تمامی اشیاء موجود در مجموعه قادر هستند با یکدیگر اتصالاتی (Connection) برقرار کنند. این اتصالات دنیایی از اشیاء و اتصالات آن‌ها را فراهم می‌کند.

Xobject مبنای (والد) و به تبع آن Xparam والد تمامی اشیاء در PVM هستند که این موضوع قاعده ارث‌بری و شیء‌گرایی در PVM را به شکلی یک‌دست و همگن ایجاد کرده است.

آگاهی به قواعد Xparam و Xobject برنامه‌نویس را قادر می‌سازد حجم بسیاری از قواعد حاکم بر PVM را درک نماید.
این یک قاعده در PVM است که قابلیت‌های توسعه به صورت درختی از ریشه‌ای‌ترین کتابخانه تا لایه‌های بالاتر توسعه می‌یابد. ریشه این درخت Pparam و به دنبال آن Xobject می‌باشد.
در هر کدام از این کتابخانه‌های قواعدی برای صحت اشیاء و پارامترهای داده‌ای تعریف می‌شود که به تبع آن توسعه در سطوح بالاتر را راحت‌تر می‌کند.

کتابخانه Putil

این کتابخانه بر پایه Pparam با هدف ایجاد قابلیت توسعه Modular سامانه PVM پیاده‌سازی شده است. با استفاده از این کتابخانه، افزودن ماژول جدید به سامانه نیازمند تغییراتی در هسته برنامه به منظور پذیرش آن نیست.

نمایی از اجزای این کتابخانه به شکل زیر است:

نمایی از اجزای کتابخانه Putil

قابلیت‌های ماژول‌ها (API) در قالب Action در سامانه PVM معرفی می‌شوند. Actionها در اصل APIهای هر ماژول هستند. کاربر می‌تواند با فراخوانی APIها از طریق putil اقدام به تعامل با آن ماژول کند.

  • Modules
    • نماینده ماژول‌های موجود در PVM هستند.
    • هر ماژول در PVM با یک ID یکتا که از صفر شروع می‌شود، مشخص می‌شود.
  • Action Repository
    • یک Action عملیاتی است که کاربر می‌تواند به واسطه آن با سیستم(ماژول) تعامل کند.
    • هر ماژول مجموعه‌ای از Actionها را در سیستم مشخص می‌کند که این Actionها هر کدام با یک ID که از صفر شروع می‌شود، مشخص می‌شوند.
    • ترکیب ID مربوط به یک ماژول و ID مربوط به هر کدام از Actionهای آن ماژول یک عدد یکتا برای Action ایجاد می‌کند. به‌عبارتی هر Action با ID مربوط به ماژول و ID مربوط به خودش مشخص شده و صدا زده می‌شود.
    • Action Repository به صورت یک انباره مجتمع تمامی اطلاعات Actionهای موجود را میزبانی و امکان فراخوانی آن‌ها را فراهم می‌کند.
  • Fire Loop
    • وظیفه آن تعامل با کاربر و دریافت دستورات وی و اجرای Actionهای مورد نظر کابر است.
    • هم‌اکنون Fire Loop تمامی دستورات کاربر را از طریق UNIX Socket و TCP Socket دریافت می‌کند.

چنانچه مشاهده می‌کنید تمامی امکانات تعاملی سامانه PVM با استفاده از putil فراهم شده است که قابلیت بسیار مناسبی به جهت اعمال سیاست‌های تعاملی مورد نیاز، به صورت متمرکز، را فراهم می‌آورد.

همچنین این کتابخانه می‌تواند درگاه‌های ارتباطی متعدد مانند UNIX Socketو TLSو TCP Socket و هر نوع درگاه ارتباطی مورد نیاز را پیاده‌سازی کند. این پیاده‌سازی کاملاً مستقل از کتابخانه‌های بالادستی PVM انجام می‌شود و از این منظر قدرت انعطاف مناسبی را ایجاد می‌کند.

ارسال دستورات به PVM

ارسال دستورات از طریق ارسال یک رشته به فایل /vat/run/pvm/sballd.sock انجام می‌شود. فرمت رشته ارسالی که یک رشته XML است به این شرح است:

Copy to Clipboard
  • sid: مشخص‌کننده sub-system id یا همان module-id است.
  • cid: مشخص‌کننده command-id یا همان action-id است.
  • params: دربرگیرنده پارامترهای مورد نیاز action مورد نظر است.

Your Content Goes Here

پاسخ به دستورات ارسالی

PVM با ارسال یک رشته XML به دستور ارسالی پاسخ می‌دهد. فرمت این رشته به این شکل است:

Copy to Clipboard
  • تگ status وضعیت پاسخ را نشان می‌دهد که مقادیر آن عبارتند از: success, failed, warning
    • warning وضعیتی را نشان می‌دهد که دستور به صورت ناقص اجرا شده است، success اجرا موفقیت‌آمیز بوده است و failed اجرا به صورت کامل ناموفق بوده است.
  • Description شامل جزئیات پاسخ دستور ارسالی است.

ماژول Sball

اسبال بزرگ‌ترین کتابخانه PVM است که وظیفه مهم Cluster Engine یا موتور همروندی در PVM را بر عهده دارد. قابل ذکر است در اوایل توسعه PVM از محصولات متن‌باز در این لایه استفاده می‌شد که به دلیل بروز مشکلات متعدد و باگ‌های گوناگون در این محصولات اقدام به توسعه حساس‌ترین و مهم‌ترین لایه نرم‌افزار یعنی Cluster Engine کردیم.

وظایف اسبال در PVM به این شرح است:

  • انتخاب Master در کلاستر به منظور انجام فعالیت‌های مدیریتی در کلاستر
  • به‌هنگام‌سازی اطلاعات اشیاء (اطلاعات ماشین‌های مجازی، سوییچ‌های مجازی و ..) در تمامی نودهای کلاستر
  • آگاهی از وضعیت نودهای کلاستر و تشخیص وضعیت جاری آن‌ها
  • مدیریت ماژول‌های PVM

این ماژول از دو ماژول زیرمجموعه به شرح زیر تشکیل شده است:

  • انباره اشیاء Sball: که انباره کلاستری اشیاء موجود در PVM است. این ماژول از جمله مهم‌ترین ماژول‌های و وظایف Sball است.
  • مدیریت کلاستر: مدیریت وضعیت نودها و پیام‌رسانی بین آن‌ها را بر عهده دارد.

انباره اشیاء

از جمله مهم‌ترین وظایف اسبال مدیریت انباره توزیع‌شده از اشیاء در سطح کلاستر است. در PVM همه چیز در قالب اشیاء تعریف و مدیریت می‌شوند که از آن جمله می‌توان به ماشین مجازی، سوییچ مجازی، زمان، سایت پشتیبان و .. اشاره کرد.

برای پیروی مناسب از قاعده شیءگرایی، بر اساس استاندارد Pparam و Xobject شیء SballObject توسعه یافته است. این شیء والد تمامی اشیاء در PVM می‌باشند که تمامی آن‌ها در قالب انباره اشیاء در PVM و در سطح کلاستر نگهداری می‌شوند.
اسبال وظیفه دارد این انباره را در سطح کلاستر با یکدیگر همگام نگه دارد.

Sball Object

ساختار XML شیء اسبال به این شرح است:

Copy to Clipboard
  • تگ uuid که مخفف Universally Unique Identifier است، به عنوان کلید Object در تمام PVM مورد استفاده قرار می‌گیرد. به عبارتی تمام ارجاعات به Objectهای مورد نیاز توسط uuid که کلید است انجام می‌گیرد. این فیلد در تمام طول عمر Object ثابت و یکتا است.
  • تگ name نام موجودیت را تعیین می‌کند که در چرخه زندگی Object قابل تغییر است و راه ارتباطی قابل تفسیر توسط کاربر با Object است.
  • تگ type نوع Object را تعیین می‌کند.
  • فیلدهای داده که در ادامه می‌آیند بستگی به نوع Object دارد(type) و برای هر Object به صورت جداگانه تعریف می‌شود.
    همچنین قابل ذکر است که تگ‌های ابتدایی و انتهایی اشیاء بر اساس نوع شیء می‌توانند متفاوت باشند.

Object List

یک لیست از Objectها است. هر لیست دارای یک نام یکتا در PVM است. چنانچه لازم باشد تا لیست تمامی Objectهای مربوط به لیست در اختیار کاربر قرار گیرد ساختار XML مربوطه به این شرح است:

Copy to Clipboard

pvm_object_list_name نام یکتای لیست است.

Object Repository

مجموعه تمامی Object Listهای موجود در PVM توسط Object Repository مدیریت می‌شوند. هر ماژول در PVM می‌تواند بر اساس نیاز خود Object Listهایی را در Object Repository رجیستر کند.
این انباره در سطح کلاستر مدیریت می‌شود.

توسعه ماژول در PVM

توسعه ماژول در PVM بر اساس قواعد استاندارد موجود در کتابخانه‌های بالادستی به شرح زیر انجام می‌شود:

  • Pparam
  • Putil
  • Sball

هر ماژول اقدام به توسعه اشیاء خود که از SballObject ارث برده‌اند می‌کند و قابلیت‌های موردنیاز کاربران را در قالب Actionها توسعه می‌دهد.
سپس این اشیاء و لیست‌های مورد نیاز جهت نگهداری آن‌ها در Sball رجیستر می‌شوند و همچنین Actionدر putil رجیستر می‌شوند.

از آن به بعد اسبال وظیفه مدیریت و همگام‌سازی اشیاء در سطح کلاستر را بر عهده خواهد گرفت و همچنین کاربر قادر خواهد بود با فراخوانی Actionها اقدام به تعامل با ماژول مورد نظر کند.

به عبارتی توسعه ماژول در PVM به توسعه اشیاء بر اساس قواعد SballObject و همچنین Actionهای مورد نیاز خلاصه شده است و این به دلیل روح حاکم بر معماری PVM به دلیل ایجاد قواعد درختی بر اساس ساختار وابستگی درختی بین کتابخانه‌ها از پایه‌ای‌ترین کتابخانه تا کتابخانه‌های بالادستی است.
قابل ذکر است که توسعه ساختار ماژول نیز بر اساس قواعد حاکم بر اشیاء اسبال و با ارثبری از SballModules انجام می‌شود.
در ادامه نمایی از کد SballModule قابل مشاهده است.

کد SballModule

چنانچه ملاحظه می شود قاعده ارثبری از SballObject در کل اجزای PVM رعایت شده است و این موضوع همبستگی معماری PVM و همچنین قابل توسعه مدیریت شده و سریع در آن را فراهم می‌کند.

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

یکی از وظایف اسبال در حوزه ماژول‌ها بررسی تطابق ویرایش‌های مختلف ماژول موجود در سطح کلاستر است. به عبارتی اسبال کنترل می‌کند که نسخه‌های مختلف از یک ماژول که ممکن است بر روی نودهای یک کلاستر باشند با یکدیگر تطابق دارند و یا خیر؟

در صورت عدم تطابق نودی که دارای عدم تطابق هست را از کلاستر خارج می‌کند تا از بروز مشکلات برای سیستم جلوگیری کند.

در کد فوق نمایی از نحوه مستندسازی (Comment) کدهای PVM نیز قابل مشاهده است.

پیاده‌سازی PVM

چنانچه در بخش قبل اشاره شد زبان ++C به‌عنوان زبان اصلی برنامه‌نویسی در PVM است. در ادامه جزئیاتی از تکنیک‌های به کار رفته در پیاده‌سازی اجزای PVM مورد بررسی قرار می‌گیرد.

ارتباط با ماشین مجازی‌

جهت ارتباط با ماشین مجازی از پروتکل QMP استفاده می‌شود. این پروتکل که بر اساس JSON است مبنای فعالیت‌های مدیریتی ماشین مجازی است.
این پروتکل در ویرایش‌های مختلف ساختار KVM ثابت است و در هر ویرایش نسبت به ویرایش قبلی توانایی‌هایی اضافه می‌شود.

کامپایل هسته

هسته سیستم‌عامل PVM بر اساس هسته‌های ردهت است و بر اساس نیازمندی‌های ماشین‌های مجازی و به جهت دستیابی به کارآیی بالا تنظیم و کامپایل مجدد شده است.
تمامی فعالیت‌های شرکت بر روی این هسته به راحتی قابل انتقال به ویرایش‌های بالاتر هسته لینوکس است.

مستندسازی

در شرکت رایانش ابری آوید مستندسازی از اصول اساسی و پایه محسوب می‌شود. تمامی ماژول‌های PVM در سطوح طراحی و پیاده‌سازی دارای مستندسازی با جزئیات مناسب هستند.

سیستم‌عامل پایه

از سیستم‌عامل Redhat به عنوان سیستم‌عامل پایه در ساخت PVM OS استفاده شده است (نسخه Rocky). این موضوع قابل توجه است که ساختار توسعه یافته توسط PVM وابستگی به سیستم‌عامل خاصی ندارد.
به عبارتی ما قادر هستیم که PVM را بر روی هر نسخه لینوکسی برپا کنیم، البته دلیل انتخار Redhat پشتیبانی سطح حرفه‌ای است که این سیستم‌عامل دارد.

سبک کد نویسی یا Coding Style

تیم توسعه PVM از استانداردهای موجود در توسعه محصولات متن‌باز همچون هسته لینوکس بهره گرفته و سبک کدنویسی را حرفه‌ای برای توسعه خود انتخاب کرده است.
سبک کدنویسی در پروژه Pparam که به صورت متن‌باز عرضه شده است به خوبی قابل مشاهده است.

به اشتراک بگذارید.