شاردینگ یکی از روشهای بهینهسازی و مقیاسپذیری پایگاههای داده است که در بسیاری از سیستمهای اطلاعاتی و سرویسهای بزرگمقیاس، نقشی کلیدی ایفا میکند. معمولا sharding در شرایطی مطرح میشود که دادهها گسترده شدهاند و دیگر مدیریت آنها به شیوههای سنتی، کارایی لازم را ندارد. این مفهوم با تفکیک دادهها به بخشهای کوچکتر و مستقل، امکان پردازش موازی و بهرهوری بیشتر از منابع سختافزاری را فراهم میکند.
با اینکه احتمالا در نگاه اول اجرای این فرایند ساده به نظر میرسد، اما پیادهسازی آن نیازمند درک عمیقتری از معماری سیستم و چالشهای مربوط به یکپارچگی دادهها است. برای درک بهتر شاردینگ، در ادامه این مطلب با ما همراه باشید تا بهطور کامل مفاهیم پایه، نحوه عملکرد، انواع مدلها، کاربرد، مزایا، معایب و سایر موضوعات مهم آن را پوشش بدهیم.
شاردینگ چیست؟

شاردینگ (sharding) یکی از الگوهای معماری پایگاه داده است که بر پایه تقسیمبندی افقی دادهها عمل میکند. در این روش، دادههای موجود در یک جدول بزرگ، به بخشهای کوچکتر و جداگانهای به اسم شارد (Shard) تقسیم میشوند. هر شارد شامل بخشی از کل پایگاه داده است، اما با کنار هم قرار گرفتن تمام آنها، مجموعهای کامل از دادهها تشکیل میشود.
معمولا این شاردها روی سرورهای مختلف یا نودهای جداگانه ذخیره میشوند. این ساختار باعث توزیع بار پردازشی میان چندین سرور میشود و عملکرد سیستم را در مواجهه با دادههای وسیع، به شکل چشمگیری بهبود میبخشد. البته در برخی موارد احتمالا جدولهای مرجعی در تمام شاردها تکرار میشوند تا دسترسی به اطلاعات مشترک، سادهتر و سریعتر صورت بگیرد.
شاردینگ، در بسیاری از موارد، بهطور مستقیم در سطح نرمافزار پیادهسازی میشود. در اینجا منطق برنامه مشخص میکند هر عملیات خواندن یا نوشتن باید به کدام شارد ارجاع داده شود. هرچند برخی سیستمهای مدیریت پایگاه داده، امکان شاردینگ را بهصورت درونی هم فراهم کردهاند.
شاردینگ چگونه کار میکند؟

اطلاعات پایگاههای داده در قالب ردیفها و ستونهای خاصی در یک جدول ذخیره میشود. شارد بخشهای کوچکتر این جدول هستند و تمامی آنها ساختار یا همان طرح کلی (schema) یکسانی دارند، اما محتوای آنها متفاوت است. برای مثال، اگر یک جدول شامل اطلاعات مشتریان باشد، در حالت شارد نشده، همه دادهها در یکجا قرار دارند، اما در حالت شارد شده، اطلاعات برخی مشتریان روی یک سرور و اطلاعات برخی دیگر روی سروری دیگر قرار میگیرد.
به این بخشهای جداشده از جدول که دادهها را در خود نگه میدارند، شارد منطقی گفته میشود. همچنین سروری که این دادهها را ذخیره میکند، بهعنوان شارد فیزیکی یا نود پایگاه داده شناخته میشود. علاوهبر این، یک شارد فیزیکی میتواند شامل چند شارد منطقی باشد.
برای اینکه مشخص شود هر ردیف از داده باید در کدام شارد قرار بگیرد، از چیزی به نام کلید شارد استفاده میشود. معمولا این کلید یکی از ستونهای جدول است که براساس آن، ردیفها دستهبندی و در شاردهای مختلف ذخیره میشوند.
شاردینگ بر پایه معماری بدون اشتراک (shared-nothing) عمل میکند. یعنی هر شارد بهطور مستقل از بقیه کار میکند و منابع پردازشی یا دادهای با دیگر شاردها به اشتراک نمیگذارد. این استقلال باعث میشود که فقط همان شاردهایی که داده مورد نظر را در خود دارند، درگیر پردازش شوند.
در آخر، لایهای از نرمافزار بین پایگاه داده و برنامه اصلی قرار میگیرد که وظیفه مشخص کردن مسیر ذخیرهسازی یا دریافت داده را بر عهده دارد. برخی سیستمهای پایگاه داده این هماهنگی را بهصورت خودکار انجام میدهند، اما گاهی اوقات لازم است که شما بهعنوان یک توسعهدهنده، این منطق را در کد برنامه پیادهسازی کنید.
انواع شاردینگ
هنگام بررسی سوال «شاردینگ چیست»، با انواع مختلفی از آن مواجه میشوید. در واقع، sharding به دو دسته عمودی و افقی تقسیم میشود که در ادامه هریک از آنها را معرفی میکنیم:
۱. شاردینگ عمودی
شاردینگ عمودی (vertical sharding) ستونهای یک جدول بزرگ را به بخشهای مختلف تقسیم میکند تا در شاردهای جداگانه ذخیره شوند. هدف اصلی از این روش، افزایش عملکرد و مقیاسپذیری سیستم براساس الگوهای دسترسی به دادهها است.
برای مثال، فرض کنید جدولی شامل اطلاعات محصولات یک فروشگاه اینترنتی است. برخی ستونها مانند قیمت و موجودی احتمالا بسیار بیشتر از ستونهایی مانند توضیحات یا تصاویر، کاربرد دارند. در این حالت، میتوانید ستونهای پرکاربرد را روی یک شارد سریع و بهینه ذخیره کنید و ستونهای کمکاربرد را به شارد دیگری انتقال دهید.
vertical sharding میتواند جداسازی اطلاعات حساس را هم انجام دهد. برای مثال، اطلاعات هویتی یک مشتری (مانند نام و شماره شناسایی) را میتواند در شاردی جداگانه با سطح امنیت بالاتر نگهداری کند، در حالی که سایر اطلاعات کمتر حساس در شارد دیگری ذخیره میشوند.
با اینکه vertical sharding میتواند پیچیدگیهایی را هنگام اجرای پرسوجوها ایجاد کند (زیرا احتمالا برای بازیابی اطلاعات کامل نیاز به ترکیب دادهها از چند شارد باشد)، اما در بسیاری از موارد این پیچیدگی در برابر مزایای عملکردی آن توجیهپذیر است.
۲. شاردینگ افقی

شاردینگ افقی (horizontal sharding) یا تقسیمبندی افقی به معنای تقسیم ردیفهای یک جدول بین چند سرور مختلف است. در این روش، هر شارد شامل گروهی از ردیفها میشود و تمام ستونهای جدول در هر شارد حفظ میشوند.
برای مثال، اگر جدول شما شامل اطلاعات کاربران باشد، میتوانید کاربران با نام خانوادگی A تا M را در یک شارد و کاربران N تا Z را در شارد دیگری نگهداری کنید. در اینجا هر شارد تمام ستونها را دارد، اما فقط بخشی از ردیفها را در بر میگیرد.
این روش باعث توزیع بار سیستم بین چندین سرور میشود و حتی میتواند با افزایش میزان عملکرد، امکان پردازش موازی پرسوجوها را فراهم کند. همچنین با رشد حجم دادهها، میتوانید بهسادگی سرورهای جدید به سیستم اضافه کنید.
البته باید بدانید که این روش چالشهای خاص خود را دارد. یکی از چالشهای horizontal sharding، هماهنگی میان شاردها برای پرسوجوهایی است که به دادههایی از چند شارد نیاز دارند. همچنین، فاصله فیزیکی بین سرورها میتواند در برخی از درخواستها باعث افزایش تاخیر شود.
تفاوت شاردینگ عمودی و افقی
شاید تصور کنید که تفاوت بین این دو روش فقط به نحوه تقسیم دادهها محدود میشود، اما باید بدانید که این تصور کاملا اشتباه است. این دو روش تفاوتهایی باهم دارند که در جدول زیر میتوانید مهمترین و اصلیترین آنها را مشاهده کنید:
| ویژگی | شاردینگ عمودی | شاردینگ افقی |
| مبنای تقسیم | ستونها | ردیفها |
| ساختار هر شارد | برخی ستونها از تمام ردیفها | تمام ستونها از برخی ردیفها |
| کاربرد اصلی | بهینهسازی عملکرد براساس الگوی دسترسی به ستونها | توزیع بار پردازشی و افزایش مقیاسپذیری |
| چالش اصلی | پیچیدگی در ترکیب نتایج از چند شارد | نیاز به هماهنگی و یکپارچگی داده در چند شارد |
| مزیت امنیتی | امکان جدا کردن اطلاعات حساس | عدم استفاده زیاد برای جداسازی اطلاعات حساس |
| مقیاسپذیری | بهصورت تخصصی و براساس نوع داده | افقی و قابل گسترش با افزودن سرورهای جدید |
انواع شاردینگ براساس نوع معماری
حال که بهخوبی میدانید شاردینگ چیست و چگونه کار میکند، بهتر است با معماری آن هم آشنا شوید. در واقع sharding براساس نوع معماری به چند دسته مختلف تقسیم میشود که در ادامه آنها را معرفی میکنیم:
شاردینگ مبتنی بر کلید (Key Based Sharding)
در شاردینگ مبتنی بر کلید (مبتنی بر هش)، دادههای جدید با استفاده از یک مقدار مشخص (مانند شناسه مشتری، آدرس IP یا کد پستی) وارد یک تابع هش میشوند. این تابع با تولید یک مقدار عددی بهنام مقدار هش، مشخص میکند که داده باید در کدام شارد ذخیره شود.
ستونی که این مقدار از آن گرفته میشود، کلید شارد نام دارد و برای اینکه از جابهجایی مکرر دادهها جلوگیری شود، باید مقدار ثابتی داشته باشد. این مدل کمک میکند دادهها بهطور یکنواخت بین شاردها توزیع شوند و از تمرکز بار روی یک شارد خاص جلوگیری شود. در تصویر زیر میتوانید روند انجام کار را ببینید:

البته باید بدانید که این روش چالشهای خاص خود را دارد. یکی از چالشها زمانی ظاهر میشود که نیاز به اضافه یا حذف کردن سرور دارید. در این حالت، باید دادههای قبلی را براساس تابع هش جدید دوباره توزیع کنید که این کار ممکن است باعث وقفه در نوشتن دادههای جدید و ایجاد اختلال موقت در عملکرد سیستم شود.
البته در طرف مقابل، بزرگترین مزیت این معماری، نبود نیاز به نگهداری جدولهای مکانیابی دادهها است؛ زیرا مکان دادهها بهجای نقشه ازپیشتعریفشده، با استفاده از الگوریتم تعیین میشود.
شاردینگ مبتنی بر بازه (Range Based Sharding)
شاردینگ مبتنی بر بازه، دادهها را براساس محدوده مشخصی از یک مقدار ( مانند قیمت، تاریخ یا شناسه) به شاردهای مختلف تقسیم میکند. برای مثال، اگر یک فروشگاه آنلاین محصولات خود را براساس قیمت دستهبندی کند، روش مبتنی بر بازه میتواند دادهها را بین شاردهایی تقسیم کند که هر کدام مسئول بازه قیمتی خاصی هستند. این مدل ساده و قابل فهم است و شما میتوانید بهراحتی آن را پیادهسازی کنید. در واقع ساختار تمام شاردها با هم یکسان است و فقط بازههای داده با هم فرق دارند. در تصویر زیر میتوانید تقسیم دادهها براساس بازه قیمتی محصولات را مشاهده کنید:

البته یکی از نقاط ضعف این روش، احتمال توزیع نامتعادل دادههاست. برای مثال، اگر یک بازه بیشتر از بقیه مورد توجه قرار گیرد (مثلا محصولات با قیمت متوسط)، شارد مربوط به آن بازه بهصورت نامتناسب بار بیشتری را تحمل میکند. این اتفاق احتمالا باعث ایجاد گلوگاه عملکردی یا همان hotspot شود.
شاردینگ مبتنی بر دایرکتوری (Directory Based Sharding)
در شاردینگ مبتنی بر دایرکتوری، یک جدول جستوجو (lookup table) ایجاد میشود که در آن برای هر مقدار از کلید شارد، مشخص شده است که دادههای مربوط به آن باید در کدام شارد قرار گیرند. در اینجا برخلاف روش مبتنی بر هش یا بازه، هیچ تابع ریاضی یا الگوریتم خاصی اجرا نمیشود. در واقع فقط مقدار کلید با جدول مقایسه میشود تا موقعیت دقیق شارد آن پیدا شود. این مدل برای مواقعی مناسب است که کلید شارد تنوع کمی دارد یا نمیتوانید آن را در بازه یا هش قرار دهید.

بزرگترین مزیت این معماری، انعطافپذیری آن است. میتوانید از هر الگوریتم یا منطق دلخواهی برای تخصیص دادهها به شاردها استفاده کنید و اضافه کردن شاردهای جدید هم بسیار راحتتر از مدلهای دیگر است.
البته در این روش باید تمام خواندن و نوشتنها ابتدا از طریق جدول lookup انجام شود، به همین دلیل احتمالا سرعت کاهش پیدا میکند. همچنین اگر این جدول دچار مشکل شود، به احتمال زیاد کل سیستم در دسترسی به دادهها دچار اختلال میشود.
مهمترین کاربردهای شاردینگ
برای اینکه بهتر بدانید شاردینگ چیست و درک بهتری از آن پیدا کنید، بهتر است با مهمترین کاربردهای آن آشنا شوید. Sharding در دیتابیسها توزیعشده نقشی کلیدی دارد و در انواع مختلفی از سیستمها استفاده میشود. در ادامه مهمترین کاربردها را معرفی میکنیم:
- پلتفرمهای تجارت الکترونیک: این نوع از پلتفرمها از شاردینگ استفاده میکنند تا دادههای مربوط به محصولات و مشتریان را بین چند سرور تقسیم کنند. این کار باعث میشود در زمانهای اوج خرید (مانند جمعه سیاه) سیستم دچار فشار بیش از حد نشود و پاسخگویی سریعتری داشته باشد.
- بازیهای آنلاین: در بازیهای آنلاین که دادههای لحظهای زیادی از تعاملات بازیکنان تولید میشود، شاردینگ کمک میکند تا این دادهها بین سرورها تقسیم شوند و تجربه بازی روانتری ارائه شود.
- شبکههای اجتماعی: حجم زیاد دادههای تولیدشده توسط کاربران مانند پستها، لایکها و کامنتها باید بهصورت سریع و دقیق ذخیره و بازیابی شوند. Sharding این امکان را فراهم میکند تا این فرایند بدون کندی و با کارایی بالا انجام شود.
- سیستمهای مالی: این نوع از سیستمها هم بهدلیل حجم بالای تراکنشهای همزمان، از شاردینگ برای پردازش همزمان و افزایش پایداری و دسترسپذیری استفاده میکنند.
- اپلیکیشنهای اینترنت اشیا (IoT): در این اپلیکیشنها، دستگاههای متعدد دادههای لحظهای تولید میکنند و Sharding بدون آنکه سیستم تحت فشار قرار بگیرد، آنها را بهصورت موازی پردازش و تحلیل میکند.
مزایای شاردینگ چیست؟

بعد از آشنایی با کاربردها، احتمالا با این سوال مواجه میشوید که مهمترین مزایای شاردینگ چیست؟ استفاده از این الگوی معماری دیتابیس مزایای مختلفی دارد که در ادامه مهمترین آنها را معرفی میکنیم:
افزایش سرعت پاسخگویی
در پایگاههای داده بسیار بزرگ، باید برای بازیابی اطلاعات حجم زیادی از دادهها بررسی شود. ازآنجاییکه این کار باعث کندی عملکرد میشود، از Sharding استفاده میکنند. در واقع به کمک این روش، هر شارد تنها بخشی از کل دادهها را نگه میدارد. در نتیجه، اجرای کوئریها در دیتابیسهای شاردشده بسیار سریعتر و موثرتر خواهد بود.
جلوگیری از قطعی کامل سرویس
در معماریهای سنتی، خرابی یک سرور احتمالا باعث از کار افتادن کل برنامه شود. شاردینگ این مشکل را با توزیع دادهها بین چند سرور حل میکند. در واقع اگر یک شارد دچار اختلال شود، سایر شاردها همچنان فعال میمانند. علاوهبر این، Sharding معمولا با تکرار داده (replication) همراه است تا در صورت خرابی یک شارد، دادهها از شارد دیگری بازیابی شوند.
مقیاسپذیری بدون توقف سرویس
با افزایش حجم دادهها، منابع سختافزاری باید توسعه پیدا کنند. Sharding این امکان را فراهم میکند که بدون نیاز به توقف سرویس یا خاموش کردن برنامه، شاردهای جدید به سیستم افزوده شوند. این مزیت برای سازمانهایی که با رشد سریع دادهها مواجه هستند، بسیار مهم است.
استفاده بهینه از منابع محاسباتی
یک دیتابیس بزرگ میتواند منابع زیادی از یک سرور را مصرف کند و در زمان کوتاهی به محدودیت برسد. با استفاده از شاردینگ، بار پردازشی و ذخیرهسازی بین چند سرور توزیع میشود و از همه منابع به شکل بهینهتری استفاده خواهد شد. با انجام این کار، فشار روی یک سرور کاهش پیدا میکند و عملکرد کلی سیستم بهتر میشود.
معایب شاردینگ چیست؟

در کنار بررسی مزایا، باید معایب را هم مورد بررسی قرار دهید تا اطلاعات خود را بیشتر و کاملتر کنید. در واقع آشنایی با معایب میتواند بهمانند یک پازل، درک شما را از شاردینگ کامل کند. در ادامه مهمترین معایب این الگوهای معماری پایگاه داده را معرفی میکنیم:
پیچیدگی در پیادهسازی و نگهداری
Sharding یک معماری پیچیده است و اجرای نادرست آن میتواند باعث از بین رفتن دادهها یا خراب شدن جدولها شود. در واقع حتی اگر آن را بهدرستی پیادهسازی کنید، ممکن است روندهای کاری تیمها دچار اختلال شوند؛ زیرا بهجای کار با یک پایگاه داده مرکزی، باید دادهها را از چند شارد مختلف مدیریت و بررسی کنند.
عدم توازن بین شاردها (Hotspot شدن)
یکی از مشکلات رایجی که احتمالا پس از شاردینگ با آن مواجه میشوید، توزیع نامتعادل دادهها است. برای مثال، اگر شاردها براساس حروف نام خانوادگی تقسیم شده باشند و بیشتر کاربران نامهایی با حرف «G» داشته باشند، فشار زیادی به یک شارد خاص وارد میشود. این شارد به «hotspot» تبدیل میشود و کندی یا حتی از کار افتادن بخشهایی از اپلیکیشن را به همراه دارد.
دشواری بازگشت به حالت قبل از شاردینگ
اگر بخواهید یک دیتابیس شاردشده را به حالت اولیه (غیر شارد) برگردانید، کار بسیار سختی در پیش دارید. نسخههای پشتیبان قبل از شاردینگ، شامل دادههای جدید نیستند و ادغام آنها با دادههای فعلی یا تبدیل کل ساختار به حالت اولیه، فرایندی زمانبر و پرهزینه خواهد بود.
نبود پشتیبانی بومی در همه دیتابیسها
همه موتورهای پایگاه داده بهصورت خودکار از شاردینگ پشتیبانی نمیکنند. بهعنوان مثال، PostgreSQL بهصورت پیشفرض Sharding خودکار ندارد و برای این کار باید بهصورت دستی وارد عمل شد یا از نسخههای فورکشده آن استفاده کرد. معمولا این نسخهها بهروز نیستند یا امکانات کاملی ندارند، بنابراین بسیاری از تیمها مجبور هستند عملیات را به روش «دستی و سفارشی» پیادهسازی کنند.
کلام آخر
هنگام ورود به حوزه دیتابیس و پایگاه داده، احتمالا با این سوال مواجه میشوید که شاردینگ چیست و چه کاربردهایی دارد؟ Sharding یکی از روشهای قدرتمند برای مدیریت پایگاه دادههای بزرگ است که با تقسیم دادهها به بخشهای کوچکتر (شاردها) باعث بهبود عملکرد، مقیاسپذیری و پایداری سیستم میشود.
البته اجرای آن پیچیده است و در صورت پیادهسازی نادرست، میتواند منجر به مشکلاتی مانند ناهماهنگی داده، نقاط داغ، دشواری در بازگشت به ساختار قبلی و چالشهای امنیتی شود.
منابع
www.techtarget.com | www.aws.amazon.com | www.digitalocean.com | www.pubnub.com | www.geeksforgeeks.org
سوالات متداول
در سیستمهای با دادههای بزرگ (Big Data)
در اپلیکیشنهایی که تعداد زیادی درخواست همزمان دارند
در شبکههای بلاکچین برای توزیع بار محاسباتی
شاردینگ: دادهها به صورت افقی بین سرورها توزیع میشوند. هر سرور به عنوان یک شارد عمل میکند.
پارتیشنبندی: دادهها به بخشهای جداگانه در یک سرور تقسیم میشوند. همه دادهها روی یک سرور ذخیره میشوند.
پایگاه دادههای توزیعشده
افزایش سختافزار (Scaling Up)
پارتیشنبندی داخلی دیتابیس
MongoDB
Cassandra
MySQL
Ethereum 2.0 (در بلاکچین)





دیدگاهتان را بنویسید