هادی صفری
هادی صفری
خواندن ۴۹ دقیقه·۴ سال پیش

PolarFS

PolarFS یک فایل‌سیستم توزیع‌شدهٔ بسیار کم‌تأخیر و مقاوم به شکست با دسترسی‌پذیری بالا است که برای پایگاه‌دادهٔ POLARDB طراحی شده است. این پایگاه‌داده هم‌اکنون در ابر Alibaba در دسترس است. PolarFS یک پشتهٔ شبکهٔ سبک و پشتهٔ ورودی-خروجی فضای کاربر را مورد استفاده قرار می‌دهد تا بتواند از تکنولوژی‌های در حال ظهوری مانند RDMA، NVMe و SPDK نهایت استفاده را ببرد. به این شکل، تأخیر ابتدا تا انتها به طور چشمگیری کاهش می‌یابد. اندازه‌گیری‌ها نشان می‌دهد تأخیر نوشتن PolarFS بسیار به فایل‌سیستم‌های محلی روی SSD نزدیک است.

برای سازگار نگه داشتن نسخه‌بدل‌ها در عین به حداکثر رساندن گذردهی ورودی-خروجی PolarFS، الگوریتم ParallelRaft به عنوان یک پروتکل اجماع مبتنی بر Raft توسعه داده شده است. الگوریتم مذکور سلسله‌وار کردن سخت‌گیرانهٔ Raft را با بهره‌گیری از قابلیت پایگاه‌داده‌ها در پذیرش انجام بدون‌ترتیب ورودی-خروجی می‌شکند. این الگوریتم قابل‌فهم بودن و سادگی پیاده‌سازی را از Raft به ارث می‌برد و در عین حال مقیاس‌پذیری ورودی-خروجی بسیار بهتری را برای PolarFS تأمین می‌کند.

همچنین، معماری انبارهٔ مشترک PolarFS که به‌خوبی از POLARDB پشتیانی می‌کند توضیح داده شده است.


مقالهٔ «PolarFS: یک فایل‌سیستم توزیع‌شدهٔ بسیار کم‌تأخیر و مقاوم به شکست برای پایگاه‌داده‌های انباره‌مشترک» با نام اصلی «PolarFS: An Ultra-low Latency and Failure Resilient Distributed File System for Shared Storage Cloud Database» [3] را Wei Cao، Zhenjun Liu، Peng Wang، Sen Chen، Caifeng Zhu، Song Zheng، Yuhui Wang و Guoqing Ma از Alibaba در VLDB ۲۰۱۸ ارائه کرده‌اند. در نوشتار حاضر ترجمه‌ای آزاد از این مقاله ارائه شده است.

جز در بخش بررسی و نقد مقاله و مواردی که صراحتاً به منبع دیگری اشاره شده است، متون و تصاویر گزارش حاضر از منبع [3] برگرفته شده‌اند.

مقدمه، طرح مسأله و پیشینه

مقالهٔ مورد بررسی [3] به ارائهٔ راه‌حلی جایگزین برای حل مشکل کندی فایل‌سیستم‌های توزیع‌شده می‌پردازد، تا بتوان پایگاه‌داده‌ای توزیع‌شده با کارایی مناسب با بهره‌گیری از فناوری‌های سخت‌افزاری نوظهوری مانند RDMA و NVMe SSDها توسعه داد.

پیشینهٔ موضوع در حوزهٔ انباره‌ها، انباره‌های توزیع‌شده، RDMA و… در منابع [2, 3] بررسی شده است.

بیان مسأله

در سال‌های اخیر، جداسازی انباره (1) از محاسبه (2) به یک ترند در صنعت محاسبات ابری تبدیل شده است. چنین طراحی‌ای علاوه بر انعطاف‌پذیر کردن معماری، امکان استفاده از قابلیت‌های انبارهٔ مشترک را فراهم می‌کند؛ زیرا:

  1. گره‌های (3) محاسباتی و انباره‌ای می‌توانند از انواع مختلفی از سخت‌افزارهای سرویس‌دهنده استفاده کنند و جداگانه شخصی‌سازی شوند. برای مثال، دیگر لزومی ندارد در گره‌های محاسباتی نسبت حجم حافظهٔ اصلی به حجم دیسک رعایت شود. این نسبت بسیار وابسته به سناریوی کاربرد و پیش‌بینی‌ناپذیر است.
  2. دیسک‌های گره‌های انباره‌ای در یک خوشه (4) می‌توانند در کنار هم یک مخزن انباره (5) بسازند. این کار احتمال تکه‌تکه شدن (6) دیسک، نامتوازن شدن استفاده از دیسک در گره‌های مختلف و هدر رفتن حافظه را کاهش می‌دهد. همچنین، ظرفیت و گذردهی (7) یک خوشهٔ انباره‌ای را می‌توان بدون اطلاع استفاده‌کننده و به طور شفاف مقیاس کرد و افزایش داد.
  3. به دلیل آن که همهٔ داده‌ها در خوشهٔ انباره‌ای ذخیره می‌شوند، هیچ حالت پایدار محلی‌ای در گره‌های محاسباتی وجود ندارد. بی‌حالتی (8) گره‌های محاسباتی مهاجرت پایگاه‌داده‌ها را آسان‌تر و سریع‌تر می‌کند. همچنین تکثیر (9) داده‌ها و سایر ویژگی‌های دسترسی‌پذیری (10) سیستم زیرساختی انبارهٔ توزیع‌شده اتکاپذیری (11) داده‌ها را بهبود می‌دهد.

علاوه بر این، سرویس‌های پایگاه‌دادهٔ ابری نیز می‌توانند از این معماری بهره ببرند:

  1. پایگاه‌داده را می‌توان در محیطی امن و مقیاس‌پذیر مبتنی بر شگردهای مجازی‌سازی مانند Xen، KVM و Docker بنا کرد.
  2. برخی ویژگی‌های اساسی پایگاه‌داده را، مانند چک‌پوینت‌ها و نسخه‌های متعدد فقط‌خواندنی، می‌توان با پشتیبانی از قابلیت‌های خوشهٔ انباره‌ای زیرساختی که ورودی-خروجی سریع، اشتراک داده و اسنپ‌شات را فراهم می‌کند تقویت کرد.

اما فناوری انباره‌های داده با سرعت زیادی در حال تغییر است. به همین دلیل، سکوهای فعلی نمی‌توانند از همهٔ قابلیت‌های استانداردهای سخت‌افزاری نوظهوری مانند RDMA و NVMe SSDها استفاده کنند. برای مثال، برخی فایل‌سیستم‌های (12) توزیع‌شدهٔ متن‌باز پراستفاده مانند HDFS و Ceph تأخیری بسیار بیشتر از دیسک‌های محلی دارند. اگر از آخرین PCIe SSDها استفاده شود، تفاوت کارایی بیشتر به چشم می‌آید. کارایی یک پایگاه‌دادهٔ رابطه‌ای مانند MySQL که مستقیماً روی این فایل‌سیستم‌های توزیع‌شده اجرا می‌شود بسیار بدتر از اجرا روی PCIe SSDهایی با پردازنده و حافظهٔ مشابه است.

تکنولوژی‌های نوظهور

‫NVMe SSD

SSDها از پروتکل‌های قدیمی‌ای مانند SAS و SATA به پروتکل نوظهور NVMe تکامل یافته‌اند. یک NVMe SSD که به درگاه PCIe متصل می‌شود می‌تواند با تأخیری کمتر از ۱۰۰ میکروثانیه به گذردهی ۵۰۰ هزار ورودی-خروجی در ثانیه برسد.

با افزایش سرعت SSDها، سربار پشتهٔ قدیمی ورودی-خروجی هستهٔ سیستم‌عامل به گلوگاه (13) کارایی تبدیل می‌شود. اخیراً شرکت Intel کیت توسعهٔ کارایی قوی (SPDK) (14) را عرضه کرده است که مجموعه‌ای از ابزارها و کتابخانه‌هایی است که برای توسعهٔ نرم‌افزارهای مقیاس‌پذیر مبتنی بر NVMe در فضای کاربر (15) (و نه فضای هسته (16)) به کار می‌رود تا بتواند با پرهیز از وقفه‌ها (17)، سربار تغییر زمینه (18) و جابه‌جایی میان فضای کاربر و فضای هسته را نپردازد و کارایی را بهبود دهد.

‫RDMA

RDMA سازوکاری برای ارتباط سریع و کم‌تأخیر تحت شبکهٔ سرورهای درون یک مرکز داده فراهم می‌کند. انتقال ۴ کیلوبایت داده بین دو سرور که فقط به واسطهٔ یک سوییچ به یکدیگر متصلند با این روش حدود ۷ میکروثانیه طول می‌کشد که بسیار از شبکه‌های TCP/IP سنتی سریع‌تر است.

در RDMA نوشتن در حافظهٔ ماشین مقصد مستقیماً با استفاده از کارت‌شبکه‌های مخصوص و بدون درگیر شدن پردازنده صورت می‌گیرد.

دو سازوکار ارسال-دریافت (ارتباط دوطرفه) و خواندن-نوشتن (ارتباط یک‌طرفه) در RDMA استفاده می‌شود. PolarFS از ترکیبی از هر دوی این سازوکارها بهره می‌گیرد. محموله‌های کوچک مستقیماً با سازوکار ارسال-دریافت منتقل می‌شوند. برای ارسال تکه‌های بزرگ‌تر داده، ابتدا دو طرف با سازوکار ارسال-دریافت دربارهٔ آدرس در حافظهٔ گره مقصد به توافق می‌رسند، سپس انتقال دادهٔ واقعی با سازوکار خواندن-نوشتن صورت می‌گیرد.

یک راه‌حل رایج: انبارهٔ متصل به نمونهٔ ماشین مجازی

برای مقابله با این مسأله، فروشنده‌های پردازش ابری مانند Amazon AWS [9]، Google Cloud و Alibaba Cloud امکان استفاده از انبارهٔ متصل به نمونهٔ ماشین مجازی (19) را فراهم می‌کنند. یک انبارهٔ متصل به نمونهٔ ماشین مجازی یک SSD محلی و یک نمونهٔ ماشین مجازی با ورودی-خروجی بالا را استفاده می‌کند تا نیاز مشتری را به پایگاه‌داده‌های با سرعت بالا برآورده کند.

شکل 1: انبارهٔ متصل به نمونهٔ ماشین مجازی آمازون [9]
شکل 1: انبارهٔ متصل به نمونهٔ ماشین مجازی آمازون [9]

متأسفانه اجرای پایگاه‌داده روی انبارهٔ متصل به نمونهٔ ماشین مجازی چندین اشکال دارد:

  1. ظرفیت انبارهٔ متصل به نمونهٔ ماشین مجازی محدود است و برای سرویس‌های بزرگ پایگاه‌داده مناسب نیست.
  2. انبارهٔ متصل به نمونهٔ ماشین مجازی نمی‌تواند در مقابل خرابی دیسک‌های زیرساختی مقاومت کند. در نتیجه، پایگاه‌داده باید خودش تکثیر داده را مدیریت کند تا بتواند اتکاپذیری لازم را برای داده‌ها فراهم آورد.
  3. انبارهٔ متصل به نمونهٔ ماشین مجازی از یک فایل‌سیستم عام‌منظوره مانند ext۴ یا XFS استفاده می‌کند. اگر از سخت‌افزارهایی مانند RDMA یا PCIe SSD که تأخیر ورودی-خروجی کمی دارند استفاده شود، سازوکار انتقال پیام (20) بین فضای هسته و فضای کاربر گذردهی سیستم را به خطر می‌اندازد.
  4. انبارهٔ متصل به نمونهٔ ماشین مجازی از معماری خوشه‌های پایگاه‌دادهٔ همه‌چیزمشترک (21) که یک ویژگی مهم در سرویس‌های پایگاه‌دادهٔ ابری پیشرفته است پشتیبانی نمی‌کند.

راه‌حل ارائه‌شده: PolarFS

در مقالهٔ مورد بحث، نگارندگان طراحی و پیاده‌سازی PolarFS را توضیح داده‌اند که یک فایل‌سیستم توزیع‌شده است که تأخیر بسیار کم، گذردهی بالا و دسترسی‌پذیری بالا را فراهم می‌کند. این فایل‌سیستم:

  1. از سخت‌افزارهای نوظهوری مانند RDMA و NVMe SSD نهایت استفاده را می‌برد. همچنین، از یک پشتهٔ شبکهٔ سبک و پشتهٔ ورودی-خروجی فضای کاربر استفاده می‌کند تا از گیر افتادن در فضای هسته و سر و کار داشتن با قفل‌های هسته بپرهیزد.
  2. یک API شبهPOSIX عرضه می‌کند با این هدف که در پایگاه‌داده جایگزین رابط‌های فایل‌سیستمی شود که سیستم‌عامل عرضه می‌کند و تمام مسیر ورودی-خروجی را در فضای کاربر نگه دارد.
  3. مدل ورودی-خروجی واحد دادهٔ PolarFS به گونه‌ای طراحی شده که در مسیر حیاتی (22) اجرای برنامه از تغییر زمینه بپرهیزد و قفل‌ها را از بین ببرد. همچنین، تمام رونوشت‌برداری‌های غیرضروری حذف شده‌اند و از DMA (23) استفاده می‌شود تا داده‌ها بین کارت‌‌شبکه‌هأ RDMA و دیسک‌های NVMe جابه‌جا شود.

با استفاده از تمام موارد گفته‌شده، تأخیر ابتدا تا انتهای PolarFS تا سطحی نزدیک به دیسک‌های SSD محلی کاهش یافته است.

الگوریتم اجماع

فایل‌سیستم‌های توزیع‌شدهٔ معمولاً در محیط‌های اجرای ابری‌ای استقرار می‌یابند که هزاران ماشین دارند. در چنین مقیاسی خرابی‌های ناشی از مشکلات سخت‌افزاری یا نرم‌افزاری معمول است. بنابراین، یک الگوریتم اجماع مورد نیاز است تا اطمینان حاصل شود هیچ یک از تغییرات اعمال‌شده در حالات خاص گم نمی‌شوند و نسخه‌بدل‌ها (24) همواره می‌توانند به توافق برسند و بیت به بیت یکسان شوند.

خانوادهٔ پروتکل‌های Paxos برای حل مسألهٔ اجماع بسیار مشهورند. Raft یک گونه از Paxos است که فهم و پیاده‌سازی آن آسان‌تر است. سیستم‌های توزیع‌شدهٔ بسیاری بر اساس Raft توسعه یافته‌اند. اما زمانی که Raft روی PolarFS اعمال شد، نگارندگان دریافتند که هنگام استفاده از سخت‌افزارهای بسیار کم‌تأخیری مانند RDMA و NVMe SSD که تأخیری از مرتبهٔ ده‌ها میکروثانیه دارند، Raft به‌شدت مانع مقیاس‌پذیری PolarFS می‌شود. به همین دلیل، نگارندگان الگوریتم ParallelRaft را توسعه دادند. این الگوریتم یک پروتکل اجماع تقویت‌شدهٔ مبتنی بر Raft است که اجازهٔ تصدیق (25) بدون‌ترتیب و اعمال لاگ‌ها را می‌دهد و در عین حال تطابق PolarFS را با معنای سنتی ورودی-خروجی حفظ می‌کند. با پروتکل مذکور، همروندی ورودی-خروجی موازی PolarFS به شکل قابل ملاحظه‌ای بهبود یافته است.

‫POLARDB

نگارندگان پایگاه‌دادهٔ رابطه‌ای POLARDB را که یک گونهٔ تغییریافته از AliSQL (یک اشتقاق از MySQL/InnoDB) است بر روی بستر PolarFS توسعه داده‌اند. این پایگاه‌داده هم‌اکنون به عنوان یک سرویس پایگاه‌داده در سکوی محاسبات ابری Alibaba در دسترس است.

شکل 2:‫ POLARDB [9,3]
شکل 2:‫ POLARDB [9,3]

POLARDB از معماری انبارهٔ مشترک پیروی می‌کند و از نسخ متعدد فقط‌خواندنی پشتیبانی می‌نماید. گره‌های پایگاه‌دادهٔ POLARDB به دو نوع تقسیم می‌شوند: (شکل 3)

گره‌های اصلی

می‌توانند هم به پرس‌وجوهای خواندنی و هم به پرس‌وجوهای نوشتنی پاسخ دهند.

گره‌های فقط‌خواندنی(RO)

فقط به پرس‌وجوهای خواندنی پاسخ می‌دهند.

گره‌های اصلی و گره‌های فقط‌خواندنی فایل‌های لاگ و فایل‌های داده را ذیل یک دایرکتوری در PolarFS با هم به اشتراک می‌گذارند.

شکل 3: انواع گره‌های POLARDB و نحوهٔ ارتباط آن‌ها
شکل 3: انواع گره‌های POLARDB و نحوهٔ ارتباط آن‌ها

PolarFS با این ویژگی‌ها از POLARDB پشتیبانی می‌کند:

  1. تغییرات فراداده را (مانند: بریدن یا گسترش فایل‌ها و ساختن یا حذف کردن آن‌ها) بین گره‌های اصلی و گره‌های فقط‌خواندنی هم‌گام‌سازی می‌کند؛ در نتیجه گره‌های فقط‌خواندنی تمام تغییراتی را که گره‌های اصلی ایجاد می‌کنند می‌بینند.
  2. اطمینان حاصل می‌کند تغییرات فرادادهٔ فایل‌ها سلسله‌وار (26) می‌شود؛ بنابراین فایل‌سیستم همواره بین گره‌های مختلف سازگار خواهد ماند.
  3. تضمین می‌دهد اگر چند بخش شدن شبکه باعث شود گره‌های متعددی به عنوان گره اصلی عمل کنند و بخواهند همروند با یکدیگر روی فایل‌های مشترک بنویسند، فقط گره اصلی واقعی سرویس بگیرد؛ در نتیجه جلوی خرابی داده‌ها گرفته می‌شود.

مشارکت‌ها و نوآوری‌های مقاله

مقالهٔ مورد بحث سه نوآوری مهم دارد:

  1. روش بنا کردن فایل‌سیستم PolarFS را به عنوان یک فایل‌سیستم توزیع‌شدهٔ بسیار کم‌تأخیر با استفاده از سخت‌افزارهای نوظهور و بهینه‌سازی‌های نرم‌افزاری توضیح می‌دهد.
  2. ParallelRaft را به عنوان یک پروتکل اجماع جدید برای فایل‌سیستم‌های بزرگ‌مقیاس، مقاوم به شکست و توزیع‌شده ارائه می‌دهد. پروتکل مذکور نسخه‌ای تغییریافته از Raft است تا با معنی انباره‌ها سازگار باشد. در مقایسه با Raft، ParallelRaft پشتیبانی بهتری از ورودی-خروجی همروند در PolarFS ارائه می‌کند.
  3. ویژگی‌های اساسی PolarFS را نمایش می‌دهد که پشتیبانی مناسبی از معماری انبارهٔ مشترک POLARDB ارائه می‌کند.

معماری

PolarFS از دو لایهٔ اصلی تشکیل شده است. لایهٔ زیری مدیریت انباره را بر عهده دارد و لایهٔ رویی فراداده (27) را مدیریت می‌کند و API فایل‌سیستم را عرضه می‌کند.

لایهٔ انباره

مسؤولیت منابع انبارهٔ همهٔ گره‌های انباره‌ای را بر عهده دارد و برای هر نمونهٔ پایگاه‌داده، یک والیوم (28) پایگاه‌داده فراهم می‌کند.

لایهٔ فایل‌سیستم

مدیریت فایل‌ها در والیوم، تضمین انحصار متقابل (29) و هم‌گام‌سازی دسترسی همروند به فرادادهٔ فایل‌سیستم را بر عهده دارد. برای هر نسخهٔ پایگاه‌داده، PolarFS فرادادهٔ فایل‌سیستم را در والیوم مربوط به همان نمونه نگه می‌دارد.

شکل 5 اجزای اصلی PolarFS را نشان می‌دهد:

‫libpfs

یک کتابخانهٔ پیاده‌سازی فایل‌سیستم در فضای کاربر با یک API شبهPOSIX است که به پردازهٔ PolarFS متصل است.

سوییچ قطبی

در گره‌های محاسباتی قرار دارد و درخواست‌های ورودی-خروجی برنامه‌ها را به سرورهای تکه‌ها می‌فرستد.

سرورهای تکه

در گره‌های انباره‌ای مستقر می‌شوند تا به درخواست‌های ورودی-خروجی رسیدگی کنند.

کنترل‌کنندهٔ قطبی

واحد کنترل PolarFS است که شامل چندین میکروسرویس (30) و تعدادی عامل (31) در همهٔ گره‌های محاسباتی و انباره‌ای است. کنترل‌کنندهٔ قطبی از یک نمونهٔ MySQL به عنوان مخزن فراداده استفاده می‌کند.

لایهٔ فایل‌سیستم

لایهٔ فایل‌سیستم یک فایل‌سیستم مشترک موازی تأمین می‌کند که برای دسترسی همروند چندین گره پایگاه‌داده طراحی شده است. بنابراین تغییرات فرادادهٔ فایل‌سیستم باید میان گره‌ها هم‌گام‌سازی شود شود تا سازگار بماند و تغییرات همروند نیز باید سلسله‌وار شوند تا فراداده خراب نشود.

‫libpfs

شکل 4: رابط‌های شبه‌POSIX libpfs
شکل 4: رابط‌های شبه‌POSIX libpfs

libpfs یک پیاده‌سازی سبک فایل‌سیستم است که کاملاً در فضای کاربر اجرا می‌شود. همان‌گونه که در شکل 4 مشخص است، libpfs یک API شبهPOSIX عرضه می‌کند. در نتیجه تغییر یک پایگاه‌داده به گونه‌ای که به جای فایل‌سیستم سیستم‌عامل با libpfs کار کند آسان است.

هنگام راه‌اندازی یک گره پایگاه‌داده، pfs_mount به والیوم متناظر متصل می‌شود و آن را مقداردهی می‌کند. فرادادهٔ والیوم بارگیری می‌شود و داده‌ساختارهایی مانند درخت دایرکتوری‌ها در حافظهٔ اصلی تشکیل می‌شوند. هنگام خاموش شدن پایگاه‌داده، pfs_umount والیوم را جدا می‌کند. برای گسترش فضای والیوم نیز از pfs_mount_growfs استفاده می‌شود. سایر توابع نیز عملگرهایی معادل عملگرهای متناظر در POSIX هستند.

لایهٔ انباره

شکل 5: لایهٔ انباره
شکل 5: لایهٔ انباره

لایهٔ انباره رابط‌هایی برای مدیریت و دسترسی والیوم‌ها در اختیار لایهٔ فایل‌سیستم قرار می‌دهد.

معماری انباره

والیوم

به هر نمونهٔ پایگاه‌داده یک والیوم اختصاص داده می‌شود که از لیستی از تکه‌ها (32) تشکیل شده است. ظرفیت یک والیوم بین ۱۰ گیگابایت تا ۱۰۰ ترابایت متغیر است که به نیازمندی‌های اکثریت قریب به اتفاق پایگاه‌داده‌ها پاسخ می‌دهد. ظرفیت یک والیوم با افزودن تکه‌ها به آن افزایش می‌یابد. همانند انباره‌های سنتی، دسترسی تصادفی خواندن و نوشتن به والیوم با ترازهای (33) ۵۱۲بایتی امکان‌پذیر است. تغییرات یک تکه از داده که با یک درخواست ورودی-خروجی ارسال شده‌اند به شکل تجزیه‌ناپذیر صورت می‌گیرند.

تکه

یک والیوم به تعدادی تکه تقسیم می‌شود بین سرورهای تکه توزیع شده‌اند تکه کوچک‌ترین واحد توزیع داده است. و سرورهای تکه یک تکه را بین بیسک‌های متعدد پخش نمی‌کنند. نسخه‌بدل‌های هر سرور تکه به طور پیش‌فرض هر تکه داده را بین سه نسخه‌بدل متمایز که در قفسه‌های (34) متفاوت قرار دارند تکثیر می‌کنند. در صورت وجود نقاط داغ (35)، مهاجرت تکه‌ها به سرورهای تکهٔ دیگر امکان‌پذیر است.

اندازهٔ هر تکه در PolarFS برابر ۱۰ گیگابایت در نظر گرفته شده است که به شکل قابل‌توجهی بزرگ‌تر اندازهٔ متناظر در سایر سیستم‌هاست؛ برای مثال، اندازهٔ تکه‌ها در GFS برابر ۶۴ مگابایت است. این انتخاب حجم فراداده را بسیار کم می‌کند و مدیریت آن را تسهیل می‌نماید. برای مثال، یک والیوم ۱۰۰ترابایتی فقط ۱۰٬۰۰۰ تکه خواهد داشت. ذخیرهٔ ۱۰٬۰۰۰ رکورد در پایگاه‌داده هزینهٔ نسبتاً کمی دارد. علاوه بر این، تمام این فراداده را می‌توان در کش (36) کنترل‌کنندهٔ قطبی جا داد و در نتیجه در مسیر حیاتی اجرای برنامه، از هزینهٔ دسترسی به فراداده کاست.

عیب این تصمیم آن است که جدا کردن نقاط داغ موجود در یک تکه دیگر ممکن نیست. اما با توجه به نسبت بالای تعداد تکه‌ها به تعداد سرورها (حدود ۱۰۰۰ : ۱)، نمونه‌های متعددی پایگاه‌داده‌ها (هزاران نمونه یا بیشتر) و قابلیت مهاجرت تکه‌ها بین سرورهای تکه، معمولاً PolarFS می‌تواند بار کل سیستم را متعادل کند.

بلوک (37)

هر تکه در سرورهای تکه به بلوک‌های ۶۴کیلوبایتی تقسیم می‌شود. بلوک‌ها به در زمان نیاز به تکه‌ها اختصاص می‌یابند تا تأمین لاغر (38) محقق شود. یک تکهٔ ۱۰گیگابایتی ۱۶۳٬۸۴۰ بلوک داده دارد. جدول نگاشت آدرس منطقی بلوک (39) تکه به بلوک‌ها به همراه نقشهٔ بیتی (40) بلوک‌های خالی هر دیسک به شکل محلی در سرورهای تکه نگه‌داری می‌شود. جدول نگاشت هر تکه حدود ۴۶۰ کیلوبایت حافظه اشغال می‌کند که نسبتاً فضای کمی است و می‌تواند در کش سرورهای تکه نگه‌داری شود.

سوییچ قطبی

سوییچ قطبی یک پردازهٔ دیمن (41) است که به همراه یک یا چند نمونهٔ پایگاه‌داده در سرور پایگاه‌داده مستقر می‌شود. در هر نمونهٔ پایگاه‌داده، libpfs درخواست‌ها را به سوییچ قطبی می‌فرستد. هر درخواست اطلاعات آدرس‌دهی (مانند شناسهٔ والیوم، آفست و طول) را در اختیار دارد که با استفاده از آن می‌توان تکهٔ مربوط را شناسایی کرد.

libpfsهای نمونه‌های مختلف پایگاه‌داده درخواست‌های ورودی-خروجی را از طریق یک حافظهٔ مشترک به سوییچ قطبی می‌فرستند. این حافظهٔ مشترک با چند بافر حلقوی (42) پیاده‌سازی شده است. libpfs به شکل نوبت گردشی (43) یک بافر حلقوی را انتخاب می‌کند، درخواست را در آن می‌نویسد و منتظر پاسخ می‌شود. در سمت دیگر، سوییچ قطبی با اختصاص یک ریسمان (44) به هر بافر حلقوی، به شکل مداوم به دنبال درخواست‌های جدید از آن‌ها سرکشی (45) می‌کند. پس از دریافت یک درخواست جدید، سوییچ قطبی درخواست را برای سرور تکهٔ متناظر ارسال می‌کند.

یک درخواست ممکن است به چندین تکه مرتبط باشد. در این صورت درخواست به چندین درخواست فرعی تقسیم می‌شود. نهایتاً، یک درخواست پایه‌ای به سرور تکه‌ای که رهبر گروه اجماعی محل نگه‌داری تکهٔ دادهٔ متناظر است ارسال می‌شود.

سوییچ قطبی محل تمام نسخه‌بدل‌هایی را که به یک تکه مرتبطند با گشتن در کش محلی فرادادهٔ خود که با کنترل‌کنندهٔ قطبی هم‌گام است پیدا می‌کند. نسخه‌بدل‌های هر تکه داده یک گروه اجماعی می‌سازند که در آن یک گره رهبر و بقیهٔ گره‌ها پیرو هستند. فقط گره رهبر می‌تواند به درخواست‌ها پاسخ دهد. تغییر رهبر در گروه اجماعی نیز با سوییچ قطبی هم‌گام می‌شود و در کش محلی آن ذخیره می‌گردد. اگر در زمان مورد نظر درخواست بی‌پاسخ بماند (46) سوییچ قطبی با فواصل زمانی نمایی (47) مجدداً تلاش می‌کند. اگر در این میان رهبرگزینی صورت گرفته باشد، سوییچ قطبی مجدداً درخواست را ارسال می‌کند.

سرور تکه

سرور تکه وظیفهٔ ذخیرهٔ تکه‌ها را بر عهده دارد و امکان دسترسی تصادفی را به آن‌ها فراهم می‌کند.

سرورهای تکه در گره‌های انباره‌ای مستقر می‌شوند. در هر سرور انباره‌ای ممکن است چندین پردازهٔ سرور تکه در حال اجرا باشد که به هر کدام هستهٔ پردازندهٔ اختصاصی و دیسک NVMe SSD مستقل اختصاص می‌یابد؛ بنابراین بین دو سرور تکه رقابت بر سر منابع شکل نمی‌گیرد. در نتیجه میان ریسمان‌های ورودی-خروجی داده‌ساختار مشترکی وجود ندارد و ریسمان ورودی-خروجی بدون سربار قفل‌گذاری پیاده‌سازی شده است. سرورهای تکه از مدل سرکشی در کنار ماشین حالت محدود رخدادمحور (48) به عنوان مدل همروندی استفاده می‌کنند. خواندن از RDMA و صف‌های NVMe و پردازش درخواست‌های ورودی در یک ریسمان انجام می‌شود.

هر سرور تکه یک لاگ پیش‌نویس (49) دارد. برای تأمین تجزیه‌ناپذیری (50) و پایایی (51)، تغییرات هر تکهٔ داده پیش از به‌روزرسانی بلوک‌های داده به لاگ پیش‌نویس اضافه می‌شوند. لاگ پیش‌نویس در بافرهای غیرفرار SSD از نوع ۳D XPoint نگه‌داری می‌شوند. در صورت پر شدن این بافرها، سرور تکه سعی می‌کند با پاک کردن لاگ‌های قدیمی فضا ایجاد کند. اگر باز هم فضای کافی موجود نباشد، لاگ‌ها در NVMe SSD نوشته می‌شوند.

سرورهای تکه با الگوریتم ParallelRaft درخواست‌ها را بین خود تقسیم می‌کنند و یک گروه اجماعی می‌سازند. یک سرور تکه ممکن است به دلایل متعددی گروه اجماعی خود را ترک کند و ممکن است به شیوه‌های متفاوتی به این مسأله رسیدگی شود. گاهی این اتفاق به دلیل خرابی‌های موقتی گاه و بی‌گاه، مانند خرابی موقت شبکه رخ می‌دهد. همچنین ممکن است سرور در حال ارتقا باشد و راه‌اندازی مجدد شده باشد. در چنین شرایطی بهتر است سیستم منتظر سرور قطع شده بماند تا دوباره آنلاین شود، به گروه ملحق گردد و به بقیهٔ گره‌های گروه برسد. در موارد دیگر خرابی پایدار است و ممکن است مدتی طولانی ادامه یابد؛ مثلاً ممکن است سرور آسیب دیده باشد یا آفلاین شده باشد. در این صورت همهٔ تکه‌های دادهٔ سرور تکهٔ مفقود باید از نسخه‌بدل‌های دیگر در یک سرور دیگر رونویسی شود تا تعداد لازم نسخه‌بدل‌ها از آن تکه‌های داده وجود داشته باشد.

یک سرور تکهٔ قطع‌شده همواره به طور خودگردان سعی می‌کند دوباره به گروه اجماعی خود ملحق شود تا زمان در دسترس نبودن کاهش یابد. اما ممکن است کنترل‌کنندهٔ قطبی تصمیمات مکملی اتخاذ کند. کنترل‌کنندهٔ قطبی به شکل دوره‌ای فهرست سرورهای تکه‌ای را که قطع شده‌اند جمع‌آوری می‌کند و آنهایی را که به نظر می‌رسد خرابی دائمی دارند برمی‌گزیند تا اقدامات لازم را صورت دهد. گاهی تصمیم‌گیری دشوار است: مثلاً یک سرور تکه با دیسک کند ممکن است تأخیری بسیار بیشتر از بقیه داشته باشد، اما همواره می‌تواند به پویشگرهای حیات (52) پاسخ دهد. در چنین شرایطی الگوریتم‌های یادگیری ماشینی مبتنی بر آمار معیارهای عملکردی اجزای کلیدی مفیدند.

کنترل‌کنندهٔ قطبی

کنترل‌کنندهٔ قطبی واحد کنترل خوشهٔ PolarFS است. برای تأمین دسترسی‌پذیری بالای سرویس‌های، کنترل‌کنندهٔ قطبی روی یک گروه حداقل سه‌تایی از ماشین‌های اختصاصی مستقر می‌شود.

کنترل‌کنندهٔ قطبی سرویس‌های کنترلی خوشه را فراهم می‌کند؛ مانند: مدیریت گره‌ها، مدیریت والیوم‌ها، اختصاص منابع، هم‌گام‌سازی فراداده و نظارت (53).

اهم وظایف کنترل‌کنندهٔ قطبی عبارتند از:

  1. پیگیری عضویت و حیات همهٔ سرورهای تکهٔ عضو خوشه، آغاز مهاجرت نسخه‌بدل‌های یک تکهٔ داده از یک سرور به یک سرور دیگر در صورت اضافه‌بار سرور یا در دسترس نبودن آن به مدتی طولانی‌تر از یک آستانهٔ خاص
  2. نگه‌داری وضعیت همهٔ والیوم‌ها و موقعیت تکه‌های داده در پایگاه‌دادهٔ فراداده‌ها
  3. ساخت والیوم‌ها و اختصاص دادن تکه‌های داده به سرورهای تکه
  4. هم‌گام‌سازی فرادادهٔ سوییچ قطبی (با هر دو روش ارسال و دریافت)
  5. نظارت بر معیارهای تأخیر و گذردهی هر والیوم و تکه با استفاده از ردیابی (54) درخواست‌های ورودی-خروجی در مسیر
  6. برنامه‌ریزی بررسی دوره‌ای کدهای خطایابی CRC (55) بین نسخه‌بدل‌ها و درون آن‌ها برای تشخیص خطا و خرابی

کنترل‌کنندهٔ قطبی به شکل دوره‌ای فرادادهٔ خوشه را (مثلاً محل تکه‌های هر والیوم) از طریق دستورهای واحد کنترل با سوییچ قطبی هم‌گام می‌کند. سوییچ قطبی فراداده را در کش محلی خود ذخیره می‌کند. هنگام دریافت درخواست از libpfs، سوییچ قطبی بر اساس این کش محلی درخواست را به سرور تکهٔ متناظر ارسال می‌کند. سوییچ قطبی گاهی، در صورت عقب افتادن کش محلی از مخزن مرکزی فراداده، فراداده را از کنترل‌کنندهٔ قطبی می‌گیرد.

کنترل‌کنندهٔ قطبی به عنوان واحد کنترل در مسیر حیاتی ورودی-خروجی قرار ندارد؛ بنابراین می‌توان تداوم سرویس‌دهی آن را با شگردهای سنتی تضمین دسترسی‌پذیری بالا تأمین کرد. حتی در فواصل زمانی کوتاه میان خرابی و بازیابی کنترل‌کنندهٔ قطبی، به دلیل وجود فرادادهٔ کش‌شده در سوییچ قطبی و خودمدیریتی سرورهای تکه، جریان ورودی-خروجی PolarFS تحت تأثیر قرار نمی‌گیرد.

مدل ورودی-خروجی

شکل 6: جریان اجرای نوشتن
شکل 6: جریان اجرای نوشتن

شکل 6 نشان می‌دهد یک درخواست نوشتن چگونه در PolarFS اجرا می‌شود.

  1. POLARDB، از طریق بافر حلقوی بین libpfs و سوییچ قطبی، یک درخواست نوشتن برای سوییچ قطبی ارسال می‌کند.
  2. سوییچ قطبی، بر اساس کش محلی فرادادهٔ خوشه، درخواست را برای گره رهبر گروه اجماعی متناظر با تکهٔ دادهٔ تحت تأثیر درخواست ارسال می‌کند.
  3. با رسیدن یک درخواست نوشتن جدید، کارت‌شبکهٔ RDMA گره رهبر درخواست نوشتن را در یک بافر که از قبل مشخص است می‌نویسد و یک مدخل درخواست به صف درخواست‌ها اضافه می‌کند. یک ریسمان همواره از این صف سرکشی می‌کند و زمانی که یک درخواست جدید می‌رسد، بی‌درنگ پردازش آن را آغاز می‌کند.
  4. درخواست با استفاده از SPDK در بلوک لاگ در دیسک نوشته می‌شود و با RDMA به گره‌های پیرو نیز منتقل می‌گردد. هر دو عمل به شکل ناهم‌گام صورت می‌گیرند.
  5. با رسیدن درخواست تکثیر به گره‌های پیرو، کارت‌شبکهٔ RDMA گره پیرو نیز درخواست نوشتن را در یک بافر که از قبل مشخص است می‌نویسد و یک مدخل درخواست به صف تکثیر اضافه می‌کند.
  6. سپس ریسمان مربوط در گره پیرو فعال می‌شود و با SPDK به شکل ناهم‌گام درخواست را در دیسک می‌نویسد.
  7. با پایان موفقیت‌آمیز عملیات نوشتن، یک پاسخ تصدیق با RDMA به گره رهبر ارسال می‌شود.
  8. بعد از دریافت تصدیق اکثریت گره‌های پیرو، گره رهبر درخواست را با SPDK به بلوک‌های داده اعمال می‌کند.
  9. سپس گره رهبر با RDMA به سوییچ قطبی پاسخ می‌هد.
  10. سوییچ قطبی درخواست را به عنوان انجام‌شده علامت می‌زند و به کلاینت اطلاع می‌دهد.

مدل سازگاری

بازبینی الگوریتم Raft

یک سیستم عملیاتی انبارهٔ توزیع‌شده به یک پروتکل اجماع نیاز دارد تا تضمین کند هیچ تغییر اعمال‌شده‌ای در حالات خاص گم نمی‌شود. در ابتدای طراحی، الگوریتم Raft با توجه به پیچیدگی کم پیاده‌سازی آن برای حل این مسأله انتخاب شد. اما مشکلات به‌زودی پدیدار شدند.

Raft با هدف سادگی و قابل فهم بودن کاملاً سلسله‌وار طراحی شده است. در این پروتکل لاگ‌ها مجاز نیستند شامل حفره باشند؛ این بدان معنی است که اجزای لاگ باید به‌ترتیب توسط گره‌های پیرو تصدیق، توسط رهبر اعمال و در همهٔ نسخه‌بدل‌ها به کار گرفته شوند. درخواست‌های انتهای صف نمی‌توانند پاسخ داده شوند یا اعمال گردند پیش از آن که همهٔ درخواست‌های قبلیشان به شکل ماندگار در دیسک ذخیره شوند و پاسخ داده شوند. این مسأله شدیداً روی میانگین تأخیر تأثیر منفی می‌گذارد و گذردهی را کم می‌کند؛ چنان که مشاهدات حاکی از آن بود که با افزایش عمق ورودی-خروجی از ۸ به ۳۲، گذردهی نصف می‌شود.

الگوریتم Raft مناسب انتقال لاگ‌ها بین یک رهبر و پیروان آن در محیط‌هایی با چندین ارتباط نیست. اگر یک ارتباط قطع یا متوقف شود یا کند باشد، لاگ‌ها بدون‌ترتیب به گره‌های پیرو می‌رسد. به بیان دیگر، لاگ‌هایی در ابتدای صف ممکن است پس از لاگ‌هایی که در صف پشت سر آن‌ها قرار دارد به گره‌های پیرو برسند. اما در پروتکل Raft، گره پیرو باید به‌ترتیب لاگ‌ها را بپذیرد و در نتیجه نمی‌تواند به گره رهبر اطلاع دهد که لاگ‌های بعدی را دریافت کرده است. در چنین حالتی ممکن است گره رهبر در شرایطی گیر کند که گره‌های پیرو نمی‌توانند یک لاگ را دریافت کنند. اما در عمل استفاده از چندین ارتباط در محیط‌های بسیار همروند رایج است. بنابراین لازم بود تا الگوریتم Raft بازبینی شود تا چنین شرایطی را تحمل کند.

در یک سیستم پردازش تراکنش‌ها مانند پایگاه‌داده، الگوریتم‌های کنترل همروندی اجرای بدون‌ترتیب را در عین تضمین سلسله‌وار بودن نتایج میسر می‌سازند. پایگاه‌داده‌هایی مانند MySQL نسبت به‌ترتیب ورودی-خروجی انبارهٔ زیرساختی حساسیتی ندارند. سیستم قفل پایگاه‌داده تضمین می‌کند که در هر لحظه از زمان فقط یک ریسمان با هر صفحه کار می‌کند. در چنین شرایطی ترتیب انجام دستورها اهمیتی ندارد. با توجه به این مسائل، نگارندگان سعی کردند با آسان کردن برخی محدودیت‌ها، Raft را برای شرایط خاص استفاده مناسب‌سازی کنند.

الگوریتم ParallelRaft با توجه به نیازمندی‌های مذکور طراحی شده است. این الگوریتم ماشین حالت تکثیرشده را با لاگ تکثیرشده پیاده‌سازی کرده است. دو نوع گره رهبر و پیرو وجود دارند و رهبر لاگ‌ها را به پیروانش می‌فرستد. برای شکستن مسأله از دیدگاهی مشابه Raft استفاده می‌شود و ParallelRaft به سه بخش تقسیم می‌شود: تکثیر بدون‌ترتیب لاگ، رهبرگزینی و رسیدن.

ایده‌هایی برای اثبات درستی االگوریتم ParallelRaft در منبع [3] بیان شده است.

همچنین در منبع [3] کارایی دو الگوریتم Raft و ParallelRaft مقایسه شده است. با افزایش عمق ورودی-خروجی، ParallelRaft بیشتر و بیشتر از Raft پیشی می‌گیرد. زمانی که این عمق به ۳۲ می‌رسد، تأخیر Raft حدوداً ۲٫۵ برابر ParallelRaft است، در حالی که به کمتر از نیمی از گذردهی الگوریتم جدید دست می‌یابد.

شکل 7: مقایسهٔ کارایی ParallelRaft و Raft برای درخواست نوشتن تصادفی ۴کیلوبایتی
شکل 7: مقایسهٔ کارایی ParallelRaft و Raft برای درخواست نوشتن تصادفی ۴کیلوبایتی

تکثیر بدون‌ترتیب لاگ

الگوریتم Raft از دو جنبه به شکل سلسله‌وار عمل می‌کند:

  1. هنگامی که گره‌های پیرو دریافت و ثبت کردن لاگ‌هایی را که گره رهبر ارسال می‌کند تصدیق می‌کنند. این تصدیق همچنین به معنی تصدیق دریافت و ثبت کردن همهٔ لاگ‌های قبلی است.
  2. هنگامی که گره رهبر یک لاگ را اعمال می‌کند و این مسأله را به گره‌های پیرو اطلاع‌رسانی می‌کند. این مسأله همچنین به معنی اعمال همهٔ لاگ‌های قبلی است.

الگوریتم ParallelRaft این محدودیت‌ها را می‌شکند و همهٔ این مراحل را بدون‌ترتیب انجام می‌دهد. بنابراین الگوریتم جدید تفاوتی جزئی با الگوریتم قدیمی دارد: در این الگوریتم اعلام اعمال شدن یک لاگ به معنی اعمال شدن لاگ‌های قبل از آن نیست. برای اطمینان از درستی الگوریتم، باید از دو مسأله اطمینان حاصل شود:

  1. بدون این محدودیت‌های رفتار سلسله‌وار، همهٔ حالت‌های اعمال‌شده با معنای انباره‌ای که در پایگاه‌داده‌های رابطه‌ای استفاده می‌شوند سازگار است.
  2. هیچ تغییر اعمال‌شده‌ای در شرایط خاص گم نمی‌شود.

اجرای بدون‌ترتیب لاگ‌ها در ParallelRaft از این قانون پیروی می‌کند: اگر دامنهٔ نوشتن دو لاگ با هم هم‌پوشانی ندارد، این دو لاگ با هم تداخل نخواهند داشت و می‌توانند با هر ترتیبی اجرا شوند. در غیر این صورت لاگ‌ها تداخل دارند و باید با همان ترتیب دریافت شدن اجرا شوند. در این صورت تغییرات جدید هیچ‌گاه با تغییرات قدیمی بازنویسی نخواهند شد.

در ادامه، نحوهٔ بهینه‌سازی مراحل تصدیق، اعمال و به‌کارگیری (56) در ParallelRaft بررسی خواهد شد.

تصدیق بدون‌ترتیب

بر خلاف الگوریتم Raft که در آن گره‌های پیرو پیش از تثبیت کردن لاگ‌های قبلی نمی‌توانند دریافت یک لاگ را از رهبر تصدیق کنند، در ParallelRaft گره‌های پیرو به محض نوشتن یک لاگ دریافت‌شده، می‌توانند دریافت آن را تصدیق کنند.

این عمل زمان تلف‌شده را کاهش می‌دهد و میانگین تأخیر را بهبود می‌دهد.

اعمال بدون‌ترتیب

بر خلاف Raft که در آن گره رهبر نمی‌تواند یک لاگ را پیش از اعمال لاگ‌های قبلی آن اعمال کند، در ParallelRaft بلافاصله پس از آن که اکثریت گره‌های پیرو دریافت و ثبت لاگ را تصدیق کنند می‌توان لاگ را اعمال کرد.

این مسأله با معنای مورد استفاده در انباره‌ها سازگاری دارد؛ زیرا انباره‌هایی مانند NVMe بر خلاف سیستم‌های پردازش تراکنش‌ها سازگاری قوی (57) را تضمین نمی‌کنند و از انواع سازگاری ضعیف (58) استفاده می‌کنند.

به‌کارگیری تغییرات با حفره‌هایی در بین لاگ‌ها

با پذیرش امکان تکثیر و اعمال بدون‌ترتیب لاگ‌ها در ParallelRaft، این الگوریتم پذیرش دنباله‌ای از لاگ‌ها را که شامل حفره است ممکن می‌سازد. اما تضمین درستی چنین روشی یک چالش است.

ParallelRaft برای حل این مشکل داده‌ساختار جدیدی را به نام بافر پس‌نگر (59) مورد استفاده قرار می‌دهد. در این داده‌ساختار آدرس منطقی بلوکی n لاگ قبلی نگه‌داری می‌شود. بر اساس این اطلاعات، گره پیرو می‌تواند تشخیص دهد آیا یک لاگ با لاگ‌های قبلی که هنوز دریافت و اعمال نشده‌اند تداخل دارد یا خیر. در صورت عدم وجود تداخل، می‌توان لاگ را بی‌درنگ اعمال کرد. در صورت وجود تداخل، و فقط در این حالت، لاگ اعمال نمی‌شود و وارد لیست لاگ‌های در انتظار می‌گردد تا زمانی که لاگ‌های مفقودهٔ مورد نیاز نیز دریافت شوند. به این شکل می‌توان حفره‌هایی به طول حداکثر n را در زنجیرهٔ لاگ‌ها تحمل کرد.

طبق مشاهدات نگارندگان، n = ۲ برای استفاده از PolarFS با RDMA مناسب است.

رهبرگزینی

هنگام رهبرگزینی، ParallelRaft می‌تواند همانند Raft گرهی را به عنوان رهبر انتخاب کند که جدیدترین لاگ اعمال‌شده و طولانی‌ترین دنبالهٔ لاگ‌ها را دارد. اما بر خلاف Raft که در آن رهبر منتخب همهٔ لاگ‌های سابقاً اعمال‌شده را دارد، در ParallelRaft، به دلیل وجود حفره‌های احتمالی، ممکن است رهبر جدید همهٔ تغییرات را نداشته باشد و لازم است گره انتخاب‌شده برای رهبری در یک حالت ادغام (60) لاگ‌های اعمال‌شدهٔ سایر اعضای گروه اجماعی را ببیند تا از نامزد رهبری به رهبر واقعی بدل شود و بتواند لاگ‌های جدید را بپذیرد.

برخی حالات خاص در منبع [3] بررسی شده‌اند.

شکل 8: رهبرگزینی در ParallelRaft
شکل 8: رهبرگزینی در ParallelRaft

در شکل 8 یک نمونه با سه نسخه‌بدل بررسی شده است. ابتدا نامزد پیروی لاگ‌های خود را برای نامزد رهبری می‌فرستد (ادغام). سپس نامزد رهبری حالت خود را با نامزد پیروی هم‌گام می‌کند (هم‌گام‌سازی). در ادامه، نامزد رهبری می‌تواند همهٔ لاگ‌ها را اعمال کند و به نامزد پیروی نیز اطلاع دهد تا آن‌ها را اعمال کند (اعمال). در نهایت، نامزد رهبری به رهبر و نامزد پیروی به پیرو بدل می‌شوند.

چک‌پوینت

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

الگوریتم ParallelRaft در پیاده‌سازی واقعی گرهی با جدیدترین چک‌پوینت را به عنوان رهبر برمی‌گزیند تا بتواند مرحلهٔ رسیدن را انجام دهد.

رسیدن

زمانی که یک گره پیرو عقب‌مانده می‌خواهد به وضعیت فعلی رهبر برسد، از رسیدن سریع (61) یا رسیدن با جریان (62) استفاده می‌کند. انتخاب بین این دو روش به وضعیت فعلی گره پیرو بستگی دارد. روش رسیدن سریع برای هم‌گام‌سازی افزایشی رهبر و پیرو در زمانی که اختلاف آن‌ها زیاد نیست استفاده می‌شود. اگر شرایطی پیش بیاید که اختلاف رهبر و پیرو زیاد شود، مثلاً وقتی گره پیرو چند روز آفلاین بوده است، PolarFS از سازوکار رسیدن با جریان استفاده می‌کند. در عملیات رسیدن چک‌پوینت‌ها مؤثرند که در بخش چک‌پوینت توضیح داده شدند.

شکل 9: رسیدن در ParallelRaft
شکل 9: رسیدن در ParallelRaft

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

در توضیحاتی که خواهد آمد، همواره می‌توان فرض کرد آخرین چک‌پوینت رهبر از آخرین چک‌پوینت پیرو جدیدتر است. در غیر این صورت، رهبر می‌تواند بی‌درنگ یک چک‌پوینت بسازد و چنین شرایطی را تأمین کند.

رسیدن سریع

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

در حالت سوم، ممکن است گره پیرو لاگ‌های اعمال‌نشده‌ای داشته باشد. چنین لاگ‌هایی هرس می‌شوند و سپس مراحل مذکور صورت می‌گیرد.

رسیدن با جریان

در این روش تاریخچهٔ لاگ‌های پیرو بی‌فایده است. محتوای بلوک‌های داده و لاگ‌های بعد از چک‌پوینت گره رهبر برای هم‌گام‌سازی استفاده می‌شود. برای انتقال محتوای بلوک‌های داده، تکه‌های داده به بخش‌های ۲۱۸کیلوبایتی شکسته می‌شوند.

پیاده‌سازی لایهٔ فایل‌سیستم

در لایهٔ فایل‌سیستم PolarFS، مدیریت فراداده می‌تواند به دو بخش تقسیم شود:

  1. سازماندهی فراداده با هدف دسترسی و به‌روزرسانی فایل‌ها و دایرکتوری‌ها درون یک گره پایگاه‌داده
  2. هماهنگی و همگام‌سازی تغییرات فراداده میان گره‌های پایگاه‌داده

سازماندهی فراداده

سه نوع اطلاعات در فرادادهٔ فایل‌سیستم وجود دارد:

مدخل دایرکتوری (63)

نام (متشکل از آدرس فایل) و یک ارجاع به یک inode را در خود نگه‌داری می‌کند. مجموعه‌ای از مداخل دایرکتوری‌ها یک درخت دایرکتوری (64) می‌سازند.

‫inode

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

برچسب بلوک (65)

نگاشت یک شمارهٔ بلوک فایل به یک شمارهٔ بلوک والیوم را در خود دارد.

سه نوع مذکور فراداده در یک نوع‌داده (66) به نام فراشیء (67) مجرد شده‌اند.

هنگام ساختن یک فایل‌سیستم جدید، فرااشیا در قطاع‌های ۴هزارتایی مقداردهی اولیه می‌شوند. هنگام سوار کردن (68) فایل‌سیستم، فرااشیا در حافظه بارگیری می‌شوند و به تکه‌ها و انواع مختلف تقسیم می‌گردند.

یک فراشیء در حافظه با یک زوج‌مرتب شامل شناسهٔ فراشیء و نوع آن قابل دسترسی است. بیت‌های باارزش شناسه برای یافتن تکه‌ای که فراشیء به آن تعلق دارد استفاده می‌شود. سپس بر اساس نوع فراشیء گروه مناسب انتخاب می‌شود. در نهایت بیت‌های کم‌ارزش شناسه به عنوان شاخص (69) برای دسترسی به فراشیء مورد استفاده قرار می‌گیرند.

برای به‌روزرسانی یک یا چند فراشیء، یک تراکنش آماده می‌شود و هر به‌‌روزرسانی به عنوان یک عمل در تراکنش ثبت می‌شود. این عمل مقادیر قدیمی و جدید شیئی را که قرار است به‌روزرسانی شود در خود دارد. پس از انجام همهٔ به‌روزرسانی‌ها، تراکنش آمادهٔ اعمال است. فرایند اعمال نیازمند هماهنگی و هم‌گام‌سازی میان گره‌های پایگاه‌داده است که نحوهٔ اجرای آن در بخش هماهنگی و همگام‌سازی تغییرات فراداده توضیح داده می‌شود. اگر اعمال ناموفق باشد، به‌روزرسانی با مقادیر قدیمی که در تراکنش موجود است بازگردانی (70) می‌شود.

هماهنگی و همگام‌سازی تغییرات فراداده

برای پشتیبانی از هم‌گام‌سازی فرادادهٔ فایل‌سیستم، PolarFS تغییرات فراداده را به عنوان تراکنش در یک فایل وقایع‌نگاری (71) ثبت می‌کند. گره‌های پایگاه‌داده متناوباً برای دریافت تراکنش‌های جدید به این فایل سرکشی می‌کنند. هنگامی که تراکنش جدیدی یافته شد، گره‌ها آن را دریافت و بازپخش (72) می‌کنند.

به طور معمول، فقط یک گره روی این فایل می‌نویسد و چندین گره از روی آن می‌خوانند. در شرایطی مانند چند بخش شدن شبکه یا تغییرات مدیریتی، ممکن است چند گره سعی کنند روی این فایل بنویسند. در چنین شرایطی سازوکاری برای هماهنگی نوشتن روی فایل وقایع‌نگاری مورد نیاز است. PolarFS برای این کار از الگوریتم Paxos روی دیسک استفاده می‌کند. لازم به ذکر است که هدف الگوریتم Paxos در این‌جا با هدف الگوریتم ParallelRaft که برای اطمینان از سازگاری نسخه‌بدل‌های یک تکه از داده‌ها مورد استفاده قرار می‌گیرد متفاوت است.

الگوریتم Paxos روی دیسک روی یک فایل متشکل از صفحات ۴ هزارتایی که می‌توانند به طور خودکار خوانده یا نوشته شوند اجرا می‌شود. این صفحات به عنوان یک رکورد رهبر و بلوک‌های داده برای هر گره پایگاه‌داده تفسیر می‌شوند. هر گره پایگاه‌داده از این صفحات بلوک داده استفاده می‌کند تا پیشنهاد خودش را بنویسد و پیشنهاد گره‌های دیگر را بخواند. صفحهٔ رکورد رهبر شامل اطلاعات برندهٔ فعلی الگوریتم Paxos و لنگر (73) فایل وقایع‌نگاری است. الگوریتم Paxos روی دیسک را فقط گره‌های اصلی (نوشتنی) اجرا می‌کنند. گره‌های فقط‌خواندنی این کار را انجام نمی‌دهند؛ در عوض، با بررسی لنگر در صفحهٔ رکورد رهبر به آن سرکشی می‌کنند. اگر لنگر تغییر کند، گره‌های فقط‌خواندنی می‌فهمند که تراکنش‌های جدیدی در فایل وقایع‌نگاری وجود دارد و با دریافت آن‌ها، فرادادهٔ محلی خود را به‌روزرسانی می‌کنند.

شکل 10: لایهٔ فایل‌سیستم
شکل 10: لایهٔ فایل‌سیستم

فرایند اعمال شدن تراکنش‌ها را می‌توان با مثال شکل 10 توضیح داد:

  1. گره ۱ قفل Paxos را که در ابتدا آزاد است پس از نسبت دادن فایل ۳۱۶ به بلوک ۲۰۱ درخواست می‌کند.
  2. گره ۱ نوشتن تراکنش را در فایل وقایع‌نگاری آغاز می‌کند.محل آخرین مدخل نوشته‌شده با انتهای موقت (74) مشخص می‌شود. پس از ذخیره شدن همهٔ مدخل‌ها، انتهای موقت برابر انتهای معتبر فایل وقایع‌نگاری می‌شود.
  3. گره ۱ فرابلوک‌هایش را با فرادادهٔ تغییریافته به‌روزرسانی می‌کند.در این زمان، گره ۲ سعی می‌کند قفل انحصاری (75) را که در اختیار گره ۱ است به دست آورد. گره ۲ شکست می‌خورد و بعداً دوباره تلاش می‌کند.
  4. پس از آن که گره ۱ قفل را آزاد می‌کند، گره ۲ صاحب قانونی قفل می‌شود. اما مدخل‌های جدیدی که گره ۱ در فایل وقایع‌نگاری ثبت کرده است معین می‌کنند که کش محلی فرادادهٔ گره ۲ کهنه است.
  5. گره ۲ مدخل‌های جدید را می‌پوید و قفل را آزاد می‌کند. سپس گره ۲ تراکنش‌های ثبت‌نشده را بازگردانی می‌کند و فرادادهٔ محلی‌اش را به‌روز می‌کند.
  6. گره ۳ به طور خودکار به‌روزرسانی فراداده‌اش را آغاز می‌کند. برای این کار، فقط لازم است تا مدخل‌های افزایش را بارگیری کند و آن‌ها را در حافظهٔ محلی‌اش بازپخش نماید.

تصمیمات طراحی

علاوه بر موارد مطرح‌شده در بخش‌های قبل، چند مبحث طراحی دیگر نیز وجود داشته است که ارزش بحث دارند. برخی از این موارد به PolarFS و برخی دیگر به ویژگی‌های پایگاه‌داده مرتبطند.

متمرکز یا غیرمتمرکز

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

سیستم‌های توزیع‌شدهٔ متمرکز مانند GFS و HDFS یک گره بالادست (76) دارند که مسؤولیت نگه‌داری فراداده و مدیریت عضویت را بر عهده دارد. پیاده‌سازی این نوع سیستم‌ها ساده‌تر است، اما یک گره بالادست ممکن است چه در زمینهٔ مقیاس‌پذیری و چه از نظر دسترسی‌پذیری به گلوگاه کل سیستم بدل شود.

سیستم‌های توزیع‌شدهٔ غیرمتمرکز مانند Dynamo در سمت دیگر طیف قرار دارند. در این سیستم‌ها گره‌ها در یک رابطهٔ نظیر‌به‌نظیر (77) با یکدیگر قرار دارند و فراداده بین همهٔ گره‌ها مشترک و تکراری است. انتظار می‌رود یک سیستم غیرمتمرکز اتکاپذیرتر باشد اما پیاده‌سازی و بررسی آن دشوارتر خواهد بود.

PolarFS یک مصالحه (78) بین طراحی‌های متمرکز و غیرمترکز انجام داده است. در یک سمت، کنترل‌کنندهٔ قطبی یک گره بالادست متمرکز است که مسؤول کارهای مدیریتی مانند مدیریت منابع و پذیرش درخواست‌های کنترلی مانند ساخت یک والیوم جدید است. در طرف دیگر، سرورهای تکه با یکدیگر ارتباط برقرار می‌کنند و از یک پروتکل اجماع برای رسیدگی به خرابی و بازیابی خودگردان، بدون نیاز به درگیر شدن کنترل‌کنندهٔ قطبی استفاده می‌کنند.

اسنپ‌شات‌گیری پایین به بالا

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

در PolarFS، لایهٔ انباره امکان دسترسی قابل‌اتکا به داده‌ها را برای لایه‌های بالاتر فراهم می‌کند. POLARDB و libpfs سازوکار لاگ خودشان را برای اطمینان از تجزیه‌ناپذیری و پایایی تراکنش‌ها استفاده می‌کنند. لایهٔ انبارهٔ PolarFS یک اسنپ‌شات با سازگاری دیسک در زمان قطع برق (79) ارائه می‌دهد که POLARDB و libpfs بر اساس آن تصویر دادهٔ سازگار خودشان را بنا می‌کنند.

وقتی فاجعه‌ای پیش‌بینی‌نشده رخ می‌دهد یا یک حسابرسی فعال مورد نیاز است، کنترل‌کنندهٔ قطبی جدیدترین اسنپ‌شات داده را در اختیار نمونهٔ POLARDB قرار می‌دهد. سپس POLARDB و libpfs از لاگ‌های خود برای بازسازی یک حالت سازگار استفاده می‌کنند.

جزئیات بیشتر پیاده‌سازی اسنپ‌شات با سازگاری دیسک در زمان قطع برق در منابع [3, 7] ذکر شده است.

سرویس‌های خارجی یا اتکاپذیری داخلی

اتکاپذیری سیستم‌های صنعتی، خصوصاً برای سیستم‌هایی مانند PolarFS که سرویس‌دهی به محصولات ابری عمومی با خدمت‌رسانی ۲۴ × ۷ را بر عهده دارند، اهمیت فراوانی دارد. در چنین سیستم‌هایی همهٔ انواع وظایف نگه‌داری اتکاپذیری باید صورت گیرد تا جلوی از دست رفتن خدمات و درآمد حاصل از آن خدمات جلوگیری شود. اجرای کارآمد این وظایف در عین فراهم آوردن یک سرویس مناسب برای بار سنگین کاربران، چالشی بزرگی برای PolarFS بود. به عنوان یک نمونه، سازوکار رسیدن با جریان، که در بخش رسیدن توضیح داده شد، زیر فشار سنگین، ممکن است دسترسی‌پذیری سیستم را تحت تأثیر قرار دهد. برای غلبه بر این مشکل، هم‌گام‌سازی داده‌ها در قالب قطعات کوچک ۱۲۸کیلوبایتی صورت می‌گیرد. تفصیل بیشتر این مسأله در منبع [3] آمده است. موارد متعدد دیگری از وظایف زمان‌بر وجود داشته‌ است که نگارندگان در مورد آن‌ها تصمیم گرفته‌اند.

ارزیابی

برای ارزیابی سیستم پیشنهادی، PolarFS پیاده‌سازی و POLARDB نیز بر اساس آن به عنوان یک سرویس عمومی در ابر Alibaba عرضه شده است. سپس کارایی و مقیاس‌پذیری آن‌ها بررسی گردیده است. برای سنجش PolarFS، این فایل‌سیستم روی یک خوشه با ext۴ روی NVMe محلی و CephFS روی Ceph (به عنوان یک سیستم انبارهٔ توزیع‌شدهٔ متن‌باز پراستفاده) مقایسه شده است. برای سنجش POLARDB از مقایسهٔ آن با سرویس MySQL ابری Alibaba و POLARDB روی ext۴ محلی استفاده شده است.

برای سنجش فایل‌سیستم‌ها از کارایی ابتدا تا انتها تحت بارها و الگوهای دسترسی متفاوت استفاده شده است که تأخیر و گذردهی را نیز به شکل ضمنی درون خود دارد. نتایج آزمایش PolarFS و CephFS مربوط به یک خوشه با ۶ گره انباره‌ای و یک گره کلاینت است. گره‌ها از طریق کارت‌شبکه‌های مجهز به RDMA با یکدیگر ارتباط برقرار کرده‌اند.

از نسخهٔ ۲۱٫۲٫۳ Ceph با موتور انبارهٔ bluestore و پیام‌رسان ارتباطی async + POSIX استفاده شده است. با آن که موتور انبارهٔ Ceph می‌توانسته از RDMA استفاده کند، به علت عدم پشتیبانی فایل‌سیستم از آن، از پشتهٔ شبکهٔ TCP/IP روی فایل‌سیستم ext۴ استفاده شده است. یک درایو ext۴ جدید روی یک SSD پس از پاک کردن محتوای قبلی آن ایجاد شده است.

برای تولید انواع مختلف بار با اندازه‌های ورودی-خروجی مختلف و همراه با موازی‌سازی، از FIO استفاده شده است. این ابزار از فایل‌هایی که تا ۱۰ گیگابایت بزرگ شده‌اند استفاده کرده است.

در ارزیابی POLARDB، مقایسهٔ POLARDB روی ext۴ محلی با POLARDB روی PolarFS در محیطی سخت‌افزاری مانند آن‌چه برای ارزیابی PolarFS توصیف شد صورت گرفته است.

برای ارزیابی پایگاه‌داده‌ها، از محک (80) Sysbench با بارهای شبیه‌سازی‌شدهٔ OLTP فقط‌خواندن، فقط‌نوشتن (با نسبت update : delete : insert = ۲ : ۱ : ۱) و ترکیب خواندن و نوشتن (با نسبت read : write = ۷ : ۲) استفاده شده است. مجموعه‌دادهٔ مورد استفاده ۲۵۰ جدول ۸٬۵۰۰۰٬۰۰۰رکوردی داشته است.

تأخیر ورودی-خروجی

شکل 11: میانگین تأخیر ورودی-خروجی
شکل 11: میانگین تأخیر ورودی-خروجی

تأخیر PolarFS برای ۴ هزار نوشتن تصادفی حدود ۴۸ میکروثانیه بوده است. این عدد به مقدار ۱۰ میکروثانیهٔ SSD محلی نزدیک و از ۷۶۰ میکروثانیهٔ CephFS بسیار بهتر است.

میانگین تأخیر نوشتن PolarFS ۱٫۶ تا ۴٫۷ برابر کندتر از ext۴ محلی است؛ در حالی که معیار مشابه CephFS ۶٫۵ تا ۷۵ برابر کندتر از ext۴ محلی است. این بدان معنی است که PolarFS کارایی‌ای نزدیک به ext۴ محلی ارائه می‌کند. نسبت میانگین تأخیر نوشتن ترتیبی PolarFS و CephFS به ext۴ نیز به‌ترتیب ۱٫۶ تا ۴٫۸ و ۶٫۳ تا ۵۶ است. مقادیر متناظر برای خواندن تصادفی به‌ترتیب ۱٫۳ تا ۱٫۸ و ۲ تا ۴ و برای خواندن ترتیبی به‌ترتیب ۱٫۵ تا ۸٫۸ و ۳٫۴ تا ۱۴٫۹ است.

کاهش کارایی PolarFS و CephFS نسبت به ext۴ برای درخواست‌های بزرگ (۱ میلیون) با درخواست‌های کوچک (۴ هزار) متفاوت است؛ زیرا شبکه و انتقال دادهٔ دیسک بیشتر زمان اجرای درخواست‌های بزرگ را به خود اختصاص می‌دهند.

پردازش ورودی خروجی با یک ماشین حالت محدود تک‌ریسمانه و پرهیز از سربار تغییر زمینه و زمان‌بندی مجدد

بهینه‌سازی مصرف حافظه و استفاده از مخزن حافظه برای کاهش سربار ساختن و نابود کردن اشیا

نگه‌داری کل فراداده در حافظهٔ اصلی

استفاده از RDMA در فضای کاربر و SPDK

از عوامل کارایی بسیار بهتر PolarFS نسبت به CephFS هستند.

گذردهی ورودی-خروجی

شکل 12: میانگین گذردهی ورودی-خروجی
شکل 12: میانگین گذردهی ورودی-خروجی

در خواندن و نوشتن تصادفی، ext۴ محلی، PolarFS و CephFS همگی با تعداد کارهای (81) کلاینت مقیاس می‌شوند. گلوگاه گذردهی ext۴ گذردهی یک دیسک SSD محلی، گلوگاه گذردهی PolarFS پهنای باند شبکه، ولی گلوگاه گذردهی CephFS ظرفیت پردازش بسته‌های شبکه در آن است. گذردهی ۴ هزار نوشتن و خواندن در ext۴ محلی به‌ترتیب ۴٫۴ و ۵٫۱ و در PolarFS به‌ترتیب ۴ و ۷٫۷ برابر بیشتر از CephFS است.

برای خواندن و نوشتن ترتیبی، چه در فایل‌سیستم محلی و چه در فایل‌سیستم توزیع‌شده، یک دیسک به تقریباً تمام درخواست‌ها رسیدگی می‌کند. ext۴ و PolarFS به‌خوبی با تعداد کارهای کلاینت مقیاس می‌شوند تا به حدی برسند که گلوگاه ورودی-خروجی محدودشان می‌کند؛ حال آن که گلوگاه CephFS خود نرم‌افزار است و نمی‌تواند پهنای باند ورودی-خروجی را اشباع کند.

بدون ورودی-خروجی اضافهٔ تحت شبکه، گذردهی خواندن ترتیبی ext۴ محلی با یک کلاینت بسیار بیشتر از PolarFS و CephFS است. اما با افزایش تعداد کلاینت‌ها به دو کلاینت گذردهی خواندن ترتیبی آن به‌شدت افت می‌کند و به مقدار گذردهی‌اش برای خواندن تصادفی با دو کلاینت نزدیک می‌شود. نگارندگان این مشاهده را به خصیصه‌های NVMe SSD مورد استفاده نسبت داده‌اند. این NVMe SSD یک بافر DRAM داخلی داشته است. زمانی که سفت‌افزار (82) الگوی بار ورودی را خواندن ترتیبی حدس می‌زده است، بلوک دادهٔ بعدی را در این بافر پیش‌واکشی (83) می‌کرده است. نگارندگان حدس زده‌اند که سازوکار پیش‌واکشی با الگوی ورودی-خروجی غیردرهم‌آمیخته (84) بهتر کار می‌کند.

کارایی POLARDB

شکل 13: ارزیابی کارایی POLARDB
شکل 13: ارزیابی کارایی POLARDB

گذردهی POLARDB روی PolarFS به‌شدت به POLARDB روی ext۴ محلی نزدیک بوده است، حال آن که PolarFS دسترسی‌پذیری بالا با ۳ نسخه‌بدل را فراهم می‌کرده است. POLARDB روی PolarFS به گذردهی ۶۵۳ هزار خواندن در ثانیه، ۱۶۰ هزار نوشتن در ثانیه و ۱۷۳ هزار خواندن/نوشتن در ثانیه دست پیدا کرده است.

علاوه بر این مسأله، POLARDB از بهینه‌سازی‌های سطح پایگاه‌داده نیز استفاده کرده است تا از MySQL پیشی گیرد. این بهینه‌سازی‌ها خارج از حوزهٔ منبع [3] و گزارش حاضر است.

منابع

[1] Alibaba Tech 2018. Alibaba unveils PolarFS distributed file system for cloud computing. https://hackernoon.com/alibaba-unveils-new-distributed-file-system-6bade3ad0413.

‪[2] Cao, W. et al. 2020. POLARDB meets computational storage: Efficiently support analytical workloads in cloud-native relational database. 18th USENIX conference on file and storage technologies (FAST 20) (Santa Clara, CA, Feb. 2020), 29–41.

‪[3] Cao, W. et al. 2018. PolarFS: An ultra-low latency and failure resilient distributed file system for shared storage cloud database. Proc. VLDB Endow. 11, 12 (Aug. 2018), 1849–1862. DOI:https://doi.org/10.14778/3229863.3229872.

[4] Comfort, P. 2018. What is thin provisioning and should you use it? https://chicorporation.com/what-is-thin-provisioning-and-should-you-use-it/.

[5] Grøvlen, Ø. 2019. POLARDB: A database architecture for the cloud. https://www.slideshare.net/oysteing/polardb-a-database-architecture-for-the-cloud-151270517.

[6] Gulutzan, P. and Pelzer, T. 2003. SQL performance tuning. Addison-Wesley.

[7] Humborstad, T. 2019. Database and storage layer integration for cloud platforms. NTNU.

[8] Jun, H. 2018. PolarDB: Alibaba cloud’s relational database services architecture. https://www.alibabacloud.com/blog/579134.

[9] Amazon EC2 instance store. https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html.


  1. storage
  2. compute
  3. node
  4. cluster
  5. storage pool
  6. fragmentation
  7. throughput
  8. stateless
  9. replication
  10. availablity
  11. reliability
  12. file system
  13. bottleneck
  14. Strong Performance Development Kit (SPDK)
  15. user space
  16. kernel space
  17. interrupts
  18. context switch
  19. instance store
  20. message passing
  21. shared-everything
  22. critical path
  23. Direct Memmory Access
  24. replicas
  25. acknowledge
  26. serialized
  27. metadata
  28. volume
  29. mutual exclusion
  30. microservice
  31. agent
  32. chunk
  33. alignment
  34. rack
  35. hotspot
    یک صفحهٔ فایل شاخص یا داده که همهٔ کارها همزمان می‌خواهند به آن مراجعه کنند [6].
  36. cache
  37. block
  38. thin provisioning
    روشی برای اختصاص حافظه در انباره‌های تحت شبکه بر اسا حافظهٔ مصرف‌شده - در مقابل حافظهٔ پیش‌بینی‌شده - و اختصاص حافظهٔ بیشتر از یک مخزن حافظه در زمان نیاز. [ر.ک. [4]]
  39. Logical block addressing (LBA)
  40. bitmap
  41. daemon process
  42. ring buffer
  43. round robin
  44. thread
  45. poll
  46. time out
  47. exponential back off
  48. event-driven finite state machine
  49. Write Ahead Log (WAL)
  50. atomicity
  51. durability
  52. liveness probe
  53. monitoring
  54. trace
  55. Cyclic Redundancy Check (CRC)
  56. ack-commit-apply
  57. strong consistency
  58. weak consistency
  59. look-behind buffer
  60. merge state
  61. fast catch up
  62. streaming catch up
  63. dircetory entry
  64. directory tree
  65. block tag
  66. data type
  67. metaobject
  68. mount
  69. index
  70. roll back
  71. journal
  72. replay
  73. anchor
  74. pending tail
  75. mutex
  76. master
  77. peer-to-peer
  78. trade off
  79. disk outage consistency
    نوع خاصی از سازگاری ضعیف، به این معنی که از اسنپ‌شات در زمان T آغاز شود، زمانی مانند T۰ وجود دارد که تمام عملیات پیش از T۰ در اسنپ‌شات ذخیره شده‌اند و هیچ یک از عملیات بعد از T در اسنپ‌شات ذخیره نشده‌اند. اما دربارهٔ وضعیت عملیات فاصلهٔ زمانی کوتاه [T۰, T] محدودیتی وجود ندارد.این مدل سازگاری اتفاقی را که در زمان قطع برق هنگامی که دیسکی در حال نوشتن است رخ می‌دهد شبیه‌سازی می‌کند. [ر.ک. [3, 7]]
  80. benchmark
  81. job
  82. firmware
  83. prefetch
  84. non-interleaved
  85. visualize
پایگاه دادهpolardbpolarfsفایل سیستممحاسبات ابری
تحلیل‌گر شبکه‌های اجتماعی | کارشناسی ارشد مهندسی نرم‌افزار دانشگاه تهران | دانشجوی دکتری سیاست‌گذاری علم و فناوری دانشگاه تربیت مدرس | hadisafari.ir
شاید از این پست‌ها خوشتان بیاید