برای یک اپلیکیشن خرید موبایلی، زمان پاسخدهی نباید بیشتر از یکی دو ثانیه باشد و برای یک کارمند صفحه HR، پاسخدهی ممکن است بتواند چند ثانیه طولانیتر باشد. تحقيقات زیادی روی نحوه تأثیر میزان عملکرد بر رفتار کاربران صورت گرفته است، از جمله اینکه 79 درصد مشتريان دیگر تمایلی به بازگشت به یک وبسایت کند را ندارند و یا 40 درصد از بازدیدکنندگان اگر بارگذاری یک وبسایت بیشتر از سه ثانیه طول بکشد، آن را ترک میکنند. استاندارد هرچه باشد، حفظ عملکرد خوب برای هر کاربردی ضروری است، در غیر این صورت کاربران ناراضی خواهند بود و بدتر از آن ممکن است خدمات شما را رها کنند. یکی از عواملی که تأثیر زیادی روی عملکرد یک اپلیکیشن دارد عملکرد پایگاه داده آن است. تعامل بین اپلیکیشنها، وبسایتها و پایگاههای داده در تعیین سطح عملکرد کلی خدمات ما نقش بزرگی دارد. هرچه اندازه و زمان بارگذاری یک پایگاه داده افزایش پیدا میکند، عملکرد نیز کاهش مییابد. هسته مرکزی چنین تعاملی نحوه پرسوجوی اپلیکیشنها با پایگاه داده و چگونگی پاسخ پایگاه داده به این درخواستها است. با هر نوع معیار سنجشی که مد نظر شما باشد، MySQL یکی از معروفترین سیستمهای مدیریت پایگاه داده است و سازمانهای بیشتری به MySQL بهعنوان راهکار پایگاه داده در محیط کاری خود نقل مکان میکنند. روشهای زیادی برای پیکربندی MySQL برای کمک به اطمینان از اینکه پایگاه داده شما بتواند در کمترین زمان ممکن بهسرعت به درخواستها پاسخ دهد وجود دارد.
نکته کلیدی 1: روش استفاده از MySQL را یاد بگیرید
دو تصمیم مهم درباره هر پایگاه دادهای که باید به آن توجه کنید، طراحی چگونگی ارتباط بین اجزای اپلیکیشن با ساختار جداول موجود در پایگاه داده و طراحی نحوه دریافت دادههای مورد نیاز اپلیکیشن به فرم مورد نظر آن (کوئریها) است.
در اپلیکیشنهای پیچیده ساختار جداول و کوئریها نیز پیچیده هستند. اگر میخواهید به عملکرد و گسترشپذیری مورد نیاز اپلیکیشن خود دست پيدا كنيد، نمیتوانید تنها به دانش نحوه کوئریگیری بسنده کنید. بهجای آزمون و خطا، باید نحوه استفاده از فرمان EXPLAIN را یاد بگیرید. این فرمان به شما نشان میدهد چگونه یک کوئری اجرا میشود و این بینش را به شما میدهد که چه عملکردی را میتوانید انتظار داشته باشید و این کوئری با تغییر اندازه داده چگونه بسط پیدا میکند. ابزارهای مختلفی (مثل MySQL Workbench) وجود دارد که میتواند خروجی EXPLAIN را بهصورت بصری و قابل درک به شما نشان دهند، اما شما برای درک بهتر آن همچنان باید اصول پایه را یاد بگیرید. خروجی فرمان EXPLAIN با دو فرمت مختلف ارائه میشود: فرمت قدیمی جدول و فرمت پیشرفتهتر با ساختار اسناد JSON که جزئیات بسیار بیشتری را ارائه میکند. (فهرست 1)
mysql> explain format=json select avg(k) from sbtest1 where id between 1000 and 2000 \G
*************************** 1. row ***************************
EXPLAIN: {
“query_block”: {
“select_id”: 1,
“cost_info”: {
“query_cost”: “762.40”
},
“table”: {
“table_name”: “sbtest1”,
“access_type”: “range”,
“possible_keys”: [
“PRIMARY”
],
“key”: “PRIMARY”,
“used_key_parts”: [
“id”
],
“key_length”: “4”,
“rows_examined_per_scan”: 1874,
“rows_produced_per_join”: 1874,
“filtered”: “100.00”,
“cost_info”: {
“read_cost”: “387.60”,
“eval_cost”: “374.80”,
“prefix_cost”: “762.40”,
“data_read_per_join”: “351K”
},
“used_columns”: [
“id”,
“k”
],
“attached_condition”: “(`sbtest`.`sbtest1`.`id` between 1000 and 2000)”
}
}
}
فهرست 1
یکی از اجزایی که باید به آن توجه داشته باشید هزینه محاوره (query cost) است. این مفهوم نشان میدهد یک محاوره خاص از لحاظ صرف منابع کلی برای اجرا شدن چقدر برای MySQL هزینهبر است. به طور مثال، اگر میگوییم یک محاوره ساده هزینهای کمتر از 1000 رکورد دارد، به مجموع فرآیندهایی اشاره میکنیم که هزینهای را به MySQL وارد میکنند تا چرخه درخواست و پاسخگویی را کامل کند. اگر میگوییم محاورههایی با بهای بین 1000 تا 100000 به محاوره با بهای متوسطی اشاره داریم که اگر شما در هر ثانیه تنها صدها نمونه (نه هزاران یا میلیونها) از آن را اجرا کنید، معمولاً مشکلی در عملکرد نداشته و سریع محسوب اجرا میشوند. محاورههایی با بهای بیشتر از 100000 پرهزینه محسوب میشوند. اغلب این محاورهها مادامی که تنها کاربر سیستم باشید همچنان سریع هستند، اما باید با دقت به این موضوع فکر کنید که قرار است چند بار از چنین محاورههایی در تعاملات اپلیکیشن خود استفاده کنید (بهویژه در مواردی که تعداد کاربران رو به رشد است). مسلماً این ارقام سنجش عملکرد همگی تقریبی هستند، اما یک اصل کلی را نشان میدهند. سیستم شما بر اساس معماری و پیکربندی که دارد ممکن است چرخه کاری این کوئریها را بهتر یا بدتر اداره کند. یکی دیگر از عوامل تعیینکننده بهای کوئری این است که آیا این کوئری بهدرستی از ایندکسها استفاده میکند. فرمان EXPLAIN میتواند به شما بگوید آیا یک کوئری توانسته از ایندکسها استفاده کند یا خیر. به همین دلیل است که یادگیری استفاده از EXPLAIN بسیار پراهمیت است.
نکته کلیدی 2: ایندکسها را درست ایجاد کنید
یک ایندکس با کاهش مقدار داده موجود در پایگاه داده که کوئریها باید اسکن کنند، عملکرد کوئری را بهبود میبخشد. ایندکسها در MySQL برای افزایش سرعت دسترسی در پایگاه داده و کمک به اجرای قید و بندهای پایگاه داده (مثل UNIQUE و FOREIGN KEY) استفاده میشوند. ایندکس در پایگاه داده شبیه به ایندکس (فهرستبندی) کتاب عمل میکند. آنها در مکان مخصوص خود نگهداری میشوند و شامل اطلاعاتی هستند که قبلاً در پایگاه داده اصلی موجود بوده است. آنها یک روش مرجع یا نقشه به مکان قرارگیری داده هستند. ایندکسها هیچ دادهای را در پایگاه داده تغییر نمیدهند و تنها به مکان داده اشاره میکنند. هیچ ایندکسی وجود ندارد که در همه حالت برای همه کارها مناسب باشد. شما همیشه باید ایندکسها را بر اساس وضعیت کوئریهایی که سیستم اجرا میکند مشخص کنید. پایگاههای دادهای که بهخوبی ایندکس میشوند نهتنها سریعتر اجرا میشوند، بلکه حتی یک کمبود کوچک ایندکس میتواند یک پایگاه داده را بهمیزان زیادی با کاهش سرعت مواجه کند. از فرمان EXPLAIN (توصیه شده در بخش قبل) برای پیدا کردن ایندکسهای گمشده و اضافه کردن آنها استفاده کنید. اما مراقب باشید بیجهت ایندکسهایی که احتیاج ندارید را اضافه نکنید. ایندکسهای غیرضروری نتیجه معکوس دارند و سرعت پایگاه داده را کم میکنند.
نکته کلیدی 3: از گزينههای پیشفرض اجتناب کنید
مثل هر نرمافزار دیگری MySQL نیز تنظیمات زیادی برای پیکربندی دارد و خیلی از این تنظیمات توسط مدیران سرور نادیده گرفته میشود و در حالت پیشفرض خود باقی میماند. برای دریافت بهترین عملکرد در MySQL مهم است که تنظیمات پیکربندی آن را بهدرستی یاد بگیرید و از آن مهمتر اینکه آنها را برای دریافت بهترین نتیجه در محیط پایگاه داده خود تنظیم کنید.
در حالت پیشفرض MySQL برای محیطهای توسعه در مقیاس کوچک تنظیم شده است نه مقیاسهای بزرگ کاری. شما معمولاً باید MySQL را بهگونهای تنظیم کنید تا از تمام منابع حافظه موجود استفاده و هر تعداد اتصال مورد نیاز اپلیکیشن را فراهم کند. در ادامه با سه تنظیم مورد نیاز برای افزایش عملکرد MySQL آشنا خواهیم شد.
innodb_buffer_pool_size: buffer pool جایی است که دادهها و ایندکسها در حافظه موقت (کش) نگهداری میشوند. دلیل اصلی توصیه به استفاده از مقدار زیاد RAM روی سرور پایگاه داده شما نیز همین است. اگر تنها از موتور ذخیرهسازی InnoDB استفاده میکنید، معمولاً 80 درصد از حافظه موجود خود را به buffer pool اختصاص میدهید. همچنین اگر کوئریهای خیلی پیچیده را اجرا میکنید یا تعداد اتصالات همزمان به پایگاه داده شما بسیار زیاد است یا تعداد بسیار زیادی جدول دارید، باید این مقدار را کاهش دهید تا حافظه بیشتری برای مصارف دیگر باقی بماند.
بعد از اینکه مقدار InnoDB buffer pool را تنظیم کردید، باید مطمئن شوید این مقدار را بیش از اندازه تعیین نکرده باشید تا باعث swapping نشود. چنین اتفاقی بهشدت به عملکرد پایگاه داده شما لطمه میزند. راهی ساده برای بررسی این موضوع نگاه کردن به Swapping Activity در نمودار System Overview در ابزار مانیتورینگ و مدیریت Percona است. (شکل 1) اگر شما بار اول مقدار innodb_buffer_pool_size را درست انتخاب نکردید، جای نگرانی نیست. در نسخه MySQL 5.7 میتوانید بدون نیاز به ریاستارت کردن سرور MySQL اندازه InnoDB buffer pool را بهصورت پویا تغییر دهید.
شکل 1
innodb_log_file_size: این گزینه نشاندهنده اندازه یک فایل گزارش InnoDB است. در حالت پیشفرض InnoDB از دو مقدار استفاده میکند، به همین دلیل میتوانید این رقم را دو برابر کنید تا اندازه فضای چرخه بازگشت لاگ مورد استفاده InnoDB برای تبادلات بادوام افزایش پیدا کند. این کار اعمال تغییرات در پایگاه داده را نیز بهینهسازی میکند. هرچه فضای بازگشتی که شما انتخاب میکنید بزرگتر باشد، عملکردی که برای نوشتن در فضای کاری خود به دست میآورید نیز بهتر خواهد شد، اما در زمان قطع برق سیستم یا سایر مشکلات دیگر زمان بیشتری برای بازیابی خسارت نیاز خواهد بود. اما از کجا باید بدانیم که آیا عملکرد MySQL توسط اندازه فایل لاگ InnoDB محدود شده است؟ سادهترين راه مشاهده میزان مصرف فضای لاگ از طریق داشبورد InnoDB Metrics ابزار Percona است. در نمودار شکل 2 اندازه فایل لاگ InnoDB بهاندازه کافی بزرگ نیست، زیرا فضای استفاده شده بسیار نزدیک بهمیزان فضای لاگ بازگشتی است (نشان داده شده توسط خط قرمز). اندازه فایل لاگ شما باید حداقل 20 درصد بزرگتر از مقدار فضای مورد استفاده برای حفظ عملکرد سیستم شما در حالت بهینه باشد. (شکل 2)
max_connections: اپلیکیشنهای مقیاس بزرگ اغلب به تعداد خیلی بیشتری کانکشن از مقدار پیشفرض احتیاج دارند. برخلاف سایر متغیرها، اگر شما این مقدار را درست انتخاب نکنید، مشکلی در رابطه با عملکرد نخواهید داشت. در عوض اگر تعداد کانکشنها بهاندازه مورد نیاز اپلیکیشن شما نباشد، اپلیکیشن قادر به اتصال به پایگاه داده نخواهد بود و کاربران نمیتوانند از خدمات شما استفاده کنند (شبیه به از کار افتادن وبسایت). به همین دلیل است که انتخاب درست این متغیر پراهمیت است. درباره کاربردهای پیچیده با چندین اجزای در حال اجرا روی چندین سرور، تشخیص تعداد کانکشن مورد نیاز کار چندان راحتی نیست. خوشبختانه MySQL امکان مشاهده تعداد کانکشنهای مورد استفاده در اوج عملیات را ساده کرده است. معمولاً شما باید اطمینان حاصل کنید بین حداکثر تعداد کانکشنهایی که اپلیکیشن شما استفاده میکند با حداکثر تعداد کانکشنهای موجود حداقل 30 درصد فاصله وجود داشته باشد. یک راه ساده برای مشاهده این ارقام استفاده از MySQL Connections Graph در داشبورد MySQL Overview ابزار مدیریت و مانیتورینگ Percona است. شکل 3 یک سیستم سالم را نشان میدهد که تعداد کانکشنهای موجود در آن به اندازه کافی است. (شکل 3)
موضوعی که نباید فراموش کرد این است که اگر پایگاه داده شما کند اجرا شود، اپلیکیشنها اغلب تعداد زیادی کانکشن ایجاد میکنند. در چنین شرایطی باید بهجای اختصاص دادن تعداد کانکشنهای بیشتر مشکل عملکرد پایگاه داده را برطرف کنید. کانکشن بیشتر میتواند مشکل اصولی عملکرد را بیشتر کند. توجه داشته باشید وقتی شما متغیر max_connections را خیلی بیشتر از مقدار پیشفرض تعیین میکنید، باید به افزایش سایر پارامترها مثل اندازه کش جدول و تعداد فایلهایی که MySQL اجازه باز کردن آن را میدهد نیز توجه کنید.
نکته کلیدی 4: پایگاه داده را در حافظه نگه دارید
طی سالهای گذشته با حضور درایوهای حالت جامد (SSD) شاهد تحول بزرگی در افزایش سرعت انتقال داده بودهایم. حتی با وجود اینکه انواع SSD بسیار سریعتر از هارد درایوهای چرخان هستند، اما همچنان با سرعت انتقال داده در RAM قابل مقايسه نیستند. این اختلاف نهتنها در میزان عملکرد ذخیرهسازی قابل مشاهده است، بلکه برای کارهای اضافه دیگری که پایگاه داده در زمان بازیابی داده از فضای ذخيرهسازی دیسک باید انجام دهد نیز اثرگذار است. با پیشرفتهای سختافزاری اخیر، امکان قرار گرفتن پایگاه داده روی حافظه نیز افزایش پیدا کرده است. خبر بهتر این است که برای به دست آوردن حداکثر مزایای عملکرد درون حافظه لازم نیست تمام پایگاه داده خود را روی حافظه پیادهسازی کنید. شما تنها باید مجموعه دادههای کاری خود را به حافظه منتقل کنید.
احتمالاً با مقالاتی برخورد کردهاید که ارقام مشخصی را (از 10 تا 33 درصد) برای اختصاص دادن سهم پایگاه داده به حافظه اعلام میکنند. در واقع، هیچ رقم ثابت و مشخصی برای همه کاربردها وجود ندارد. بهجای اینکه بهدنبال یک عدد جادویی مشخص باشید، باید بررسی کنید پایگاه داده شما چه میزان ورودی خروجی را در حالت پایدار خود (معمولاً چند ساعت پس از راهاندازی) اجرا میکند. به وضعیت خواندن داده توجه کنید، زیرا زمان مورد نیاز برای خواندن اگر پایگاه داده شما روی حافظه باشد، میتواند کاملاً از بین برود. زمان مورد نیاز برای نوشتن هر چقدر هم که حافظه در اختیار داشته باشید، باز هم اتفاق خواهد افتاد. در شکل 4 میزان ورودی خروجی در InnoDB I/O Graph داشبورد InnoDB Metrics ابزار مانیتورینگ و مدیریت Percona را مشاهده میکنید.
نکته کلیدی 5: از فضای ذخيرهسازی SSD استفاده کنید
اگر پایگاه داده شما در حافظه جا نمیشود (یا حتی میشود)، برای نوشتن دادههای خود و جلوگیری از مشکلات عملکرد در زمان راهاندازی پایگاه داده همچنان به یک فضای ذخيرهسازی پرسرعت نیاز دارید. این روزها فضای ذخيرهسازی سریعتر را تنها روی SSD میتوان پیدا کرد. برخی از متخصصان بهواسطه قیمت پایینتر و قابلیت اطمینان بیشتر همچنان طرفدار دیسکهای گردان هستند، اما این روزها انواع SSD با قیمتهایی معقولانهتر عملکرد و قابلیت اطمینان فوقالعادهای را ارائه میکنند.
اما نباید فراموش کرد تمام انواع SSD یکسان ساخته نمیشوند. برای سرورهای داده شما باید از یک SSD که مخصوص حجم کاری سرورها طراحی شده است استفاده کنید تا محافظت از دادههای شما بهخوبی انجام شود. از SSD مصرفی طراحی شده برای کامپیوتر دسكتاپ و لپتاپ پرهیز کنید. یک SSD متصل شده از طریق فناوری Intel Optane یا NVMe بهترین عملکرد را ارائه میکند. حتی اگر از طریق SAN, NAS یا کلاود از فضای ذخيرهسازی استفاده میکنید، باز هم SSD عملکرد بسیار بهتری نسبت به دیسکهای گردان ارائه میکند.
نکته کلیدی 6: گسترشپذیری
حتی قدرتمندترين سرورها هم محدودیتهای خود را دارند. شما برای گسترش قابلیت سرور خود دو راه پیش رو دارید: خرید سختافزار بیشتر که هزینهبر است و سختافزار بهسرعت منسوخ میشود. یا گسترش ظرفیت کاری که مزایای خاص خود را دارد. در این روش از مزایای چند سیستم کوچکتر و ارزانتر همزمان بهرهمند میشوید و از آنجا که پایگاه داده در بین بیش از یک ماشين فیزیکی گسترش پیدا کرده است، در مقابل خرابیهای سختافزاری روی یک سیستم واحد مصون باقی میماند.
هرچند گسترش سیستم پایگاه داده دارای مزیت است، اما محدودیتهای خاص خود را نیز دارد. گسترش پایگاه داده مثل MySQL Replication یا Percona XtraDB Cluster برای همگامسازی دادهها نیاز به تکرار و رونوشت دارد. اما در عوض شما عملکرد بیشتر و قابلیت دسترسی بالاتری را به دست خواهید آورد. همچنین باید اطمینان حاصل کنید اپلیکیشنهای متصل به معماری کلاستری میتوانند به دادههای مورد نیاز خود دسترسی داشته باشند که معمولاً از طریق پراکسی سرورها و لود بالانسرهایی مثل ProxySQL و HAProxy انجام میشود.
نکته کلیدی 7: علاج واقعه قبل از وقوع
همیشه بهترین طراحی سیستم آنهایی هستند که آینده را هم در نظر دارند و MySQL نیز از این قاعده مستثنا نیست. بعد از اینکه محیط MySQL خود را راهاندازی، اجرا و بهینهسازی کردید، نباید دیگر آن را به حال خود رها کنید. محیطهای پایگاه داده معمولاً تحت تأثیر تغییرات سیستم یا حجم کار قرار میگیرند. باید خود را برای غافلگيریهایی پیشبینی نشده مثل ترافیک انبوه، اشکالات برنامه و مشکلات خروجی MySQL آماده کنید. اینها مسائلی هستند که دیر یا زود اتفاق میافتد.
بعد از بروز چنین اتفاقاتی، باید بتوانيد بهسرعت آنها را برطرف کنید. تنها روش انجام این کار در اختیار داشتن راهکارهای نظارتی و ابزار مناسب آن است. با این روش میتوانید اتفاقات در حال انجام در زمان اجرای محیط پایگاه داده خود را مشاهده و وضعیت سرور داده خود را تجربه و تحلیل کنید. در حالت ایدهآل چنین راهکاری به شما امکان میدهد قبل از رخ دادن مشکلات از آن جلوگیری كنيد. نمونههایی از ابزارهای مانیتورینگ شامل (Monyog، MySQL Enterprise Monitor و Percona Monitoring and Management PMM) هستند که یک دیدگاه عملی عالی برای نظارت و عیبیابی ارائه میکنند.
هرچه شرکتهای بیشتری به پایگاههای داده منبع باز (بهویژه MySQL) برای مديريت و خدمترسانی دادههای تجاری خود در مقیاس بزرگ روی میآورند، باید روی نگهداری و اجرای بهینه این پایگاههای داده نیز تمرکز کنند. همان طور که برای رونق کسب و کار شما رعایت تمام اصول تجارت حیاتی است، عملکرد پایگاه داده شما نیز میتواند نقشی مهم در کسب و کارتان داشته باشد. MySQL یک راهکار پایگاه داده عالی برای قدرت بخشیدن به برنامهها و وبسایتهای شما است، اما باید آن را با نیاز شما سازگار کرد و برای پیدا کردن و جلوگیری از تنگناها و مسائل مربوط به عملکرد آن را تحت نظر قرار داد.
ماهنامه شبکه را از کجا تهیه کنیم؟
ماهنامه شبکه را میتوانید از کتابخانههای عمومی سراسر کشور و نیز از دکههای روزنامهفروشی تهیه نمائید.
ثبت اشتراک نسخه کاغذی ماهنامه شبکه
ثبت اشتراک نسخه آنلاین
کتاب الکترونیک +Network راهنمای شبکهها
- برای دانلود تنها کتاب کامل ترجمه فارسی +Network اینجا کلیک کنید.
کتاب الکترونیک دوره مقدماتی آموزش پایتون
- اگر قصد یادگیری برنامهنویسی را دارید ولی هیچ پیشزمینهای ندارید اینجا کلیک کنید.
نظر شما چیست؟