تکهتکه، اما قوی:Sharding، Partitioning و Replication(قسمت آخر از مفاهیم دیتابیس)
به قسمت آخر از سری مجموعه مفاهیم دیتابیس خوش اومدی، توی این قسمت میخواییم هرچی جلو دستمون میاد رو تیکه تیکه کنیم تا قدرت واقعی دیتابیس هارو بهتر درک کنیم. دقت کنید که توی این سری مجموعه ما با انواع مفاهیم دیتابیس آشنا میشیم و کاری با کد زدن و نوع خاصی از دیتابیسا ها نداریم
اگه بخواییم یه تعریف کتابی راجع بهش بگیم میشه این: فرآیندی است که طی آن دادهها از یک پایگاه داده به یک یا چند نسخه دیگر کپی و توزیع میشوند. این روش برای افزایش دسترسپذیری(availability)، تحمل خطا(fault tolerance) و اطمینان از بازیابی دادهها(recovery) در صورت خرابی به کار میرود.
فرض کنیم یک فروشگاه آنلاین داریم و اطلاعات محصولاتمون توی یک دیتابیس ذخیره شده. حالا اگه سرور اصلیمون به هر دلیلی بره به فنا، فروشگاهمون از کار میافته.حالا اگه این فروشگاه اونقدری بزرگ باشه مثل دیجی کالا خب هر یک دقیقه اشم میلیون ها ضرره. با Replication میتونیم این مشکل رو به راحتی مدیریت کنیم، بدین شکل که یک یا چند نسخه از دیتابیسمون رو توی سرورهای دیگه ذخیره کنیم. حالا اگه سرور اصلی خراب بشه، کاربران همچنان میتونن از نسخههای کپی استفاده کنن.
توی ریپلیکیشن به سرور اصلی میگیم master و به فرعی ها میگیم slave
حالا مزیت هاش چیه:
در صورت خرابی سرور اصلی، سرورهای دیگه میتونن جایگزین بشن.
توزیع بار خواندن(Read) و نوشتن(Write) بین سرورها.
نسخههای کپی دادهها امکان بازیابی سریعتر رو فراهم میکنن.
کاربران میتونن به نزدیکترین سرور جغرافیایی متصل بشن.
دو نوع اصلی Replication داریم :
ریپلیکیشن همزمان(Synchronous) 👈 در ریپلیکیشن همزمان، ایجاد کپی های دیتا به صورت بلادرنگ انجام میشه یعنی چی؟ یعنی بلافاصله که داده ها روی سرور اصلی(master) نشست همون لحظه عملیات Replica توی سرور های فرعی(slave) انجام میشه و در نتیجه روش گرونی هستش و پهنای باند زیادی لازم داره اما یه خوبی که داره اینه که هنگام Disaster Recovery بسیار قابل اعتماد است چون بلافاصله داده ها دارن نوشته میشن مثلا برای داده های بانکی که حساسیت کار بالاس میتونه این نوع ریپلیکیشن مناسب باشه.
ریپلیکیشن غیرهمزمان(Asynchronous) 👈 کپی دیتا در ریپلیکیشن غیرهمزمان، برخلاف همزمان، در زمان های معین شده انجام میشه یعنی داده ابتدا روی سرور اصلی میشینه و بعد طبق زمان معینی توی سرور های فرعی کپی میشه. مثلا میتونیم تعیین کنیم که چون از 12 شب تا 6 صبح فشار رو دیتابیس و سرورامون کمتره اون موقع عملیات ریپلیکیشن انجام بشه. خب طبیعتا برای برنامه هایی خوبه که Read کردن دیتا مهمتر از Write کردن دیتا هستش(چون بلادرنگ نیست) و برای پشتیبان گیری مناسب تره.
انواع دیگه هم هست که اگه بخوام توضیح بدم مقاله زیاد میشه اما اسماشونو میگم که سرچشون کنید: single-master Replication و multi-master Replication و chain Replication و geo Replication
✅ خرد کردن(Sharding) و پارتیشن(Partition) چیه ؟؟؟
این دوتارو کنار هم توضیح بدم بهتر جا میوفته اما قبلش باید با دو مفهوم مقیاس پذیری عمودی و افقی آشنا بشنید:
توی مقیاس پذیری عمودی(Vertical) یعنی با افزایش بار روی اپلیکیشنمون ما سرور هامون رو قوی تر کنیم مثلا رم بیشتر بخریم یا سی پی یو رو قوی تر کنیم اما توی توی مقیاس پذیری افقی(Horizontal) به جای اینکه سرور رو قوی تر کنیم بیایم تعداد سرور ها رو بیشتر کنیم عکس توی این مقاله هم ببینید بد نیست
شاردینگ یا Sharding 👈 یک روش برای تقسیمبندی دادهها توی دیتابیس هست، بهطوریکه هر بخش از دادهها (یا شارد) در یک سرور مجزا ذخیره بشه. این تکنیک برای مقیاسپذیری افقی به کار میره یعنی برای scale کردن بیاییم هی سرور دیتابیسی اضاف کنیم. همچنین به پایگاه دادمون امکان مدیریت بهتر حجم زیاد دادهها و درخواستها رو میده.
شاردینگ انواع مختلفی داره مثلا میتونه بر اساس جغرافیا باشه یعنی کاربرای توی آمریکا به اون شاردی متصل بشن که نزدیک اوناس و کاربرای آسیا به شارد نزدیک آسیا متصل بشن یا مثلا اگه از نوع range باشه، تعیین میکنیم که کاربرا هایی که ID شون از 1 تا 90000 هست توی شارد یک ذخیره بشن و از 90000 تا 200000 توی شارد دو
پارتیشن یا Partition👈 فرآیندی که طی آن دادههای یک جدول به چندین بخش یا پارتیشن تقسیم میشن. این پارتیشنها معمولاً در یک پایگاه داده و روی یک سرور قرار دارند(برعکس شاردینگ که روی چند سرور بود) و برای مدیریت بهتر دادهها و بهبود عملکرد دیتابیسمون استفاده میشن. در واقع پارتیشن بندی مقیاس پذیری عمودی رو توی دیتابیس برامون به همراه میاره
✅ چه موقع از کدوم استفاده کنیم ؟؟؟
معمولا زمانی از پارتیشن استفاده میکنیم که:
حجم زیادی داده در یک جدول دارید، اما ترافیک پایگاه داده بهطور کلی قابل مدیریت است.
نیاز به کاهش زمان اجرای کوئریها روی جداول بزرگ دارید.
پایگاه داده شما در یک سرور قرار دارد و نیازی به توزیع بین چند سرور ندارید.
معمولا زمانی از شاردینگ استفاده میکنیم که:
حجم دادهها یا ترافیک پایگاه داده به حدی است که یک سرور نمیتواند آن را مدیریت کند.
کاربران در مناطق جغرافیایی مختلف هستند و میخواهید تأخیر (Latency) را کاهش دهید.
نیاز به مقیاسپذیری افقی دارید تا با افزایش تعداد کاربران یا دادهها، سرورهای جدید اضافه کنید.
چرا میگم معمولا؟؟؟ چون تو دنیایی نرم افزار همه چیز همه جا درست نیست و قطعا وابسته به نوع کار شما و پروژتون بستگی داره یا به قول خارجکیا trade off
امیدوارم مورد استفاده اتون قرار گرفته باشه
اگه دوست داشتید توی کانال تلگرامیمون هم عضو بشید LearnByLearn@