به نام خدا
در این نوشته به بررسی فصل Monitoring Distributed Systems میپردازیم.
کلا این فصل درمورد تعاریف و best practiceهای مانیتورینگ بحث میکنه و کمک میکنه که رصد بهتری از سیستممون داشته باشیم و نهایتا باعث بشه که سرویسمون قابل اعتماد بشود.
اول از همه یک سری تعاریف مطرح میشود:
پ-ن: قبلا در نوشتهای این که چگونه یک داشبورد گرافانا برای خودمان راه بندازیم را توضیح دادهام.
حالا یک سوال اساسی مطرح میشود.
دلایل بسیاری بر ضرورت وجود مانیتورینگ وجود دارد که به برخی اشاره میکنیم:
نباید انتظار داشته باشیم که یک سیستم مانیتورینگ تمام مشکلات ما را حل خواهد کرد.
هر چه قدر که میتوانیم، مانیتورینگ را باید ساده نگه داریم. از ابزارهای پیچیده و به قول کتاب، جادویی، استفاده نکنیم و سعی کنیم مفاهیم پایهای که برای سیستم تعریف شده است را پوشش دهیم.
همچنین در قانونهای هشدار (این که چه زمانی برایمان هشدار ارسال شود.) باز هم نباید پیچیده باشند و دقیقا مسائلی که با آنها میشود فهمید که حال سیستم بد است و کاربر دچار مشکل شده است، کافی میباشد.
تعداد این هشدارها هم نباید زیاد باشد، چرا که دیگر آن اثربخشی خود را از دست میدهند و حالت عادی شدن به خودشان میگیرند.
یک سیستم مانیتورینگ باید به دو سوال جوابی داشته باشد: چه چیزی خراب شده است و چرا؟
جواب این که چه چیزی خراب شده است به علامت مربوط شده و جواب چرا به دلیل مربوط است.
در زیر چند نمونه از علامتها و دلیلها برای یک خرابی داریم:
علامت: تعداد درخواستهای با جوابهای 500 یا 404 زیاد شده است.
دلیل: دیتابیس درخواستها را رد میکند.
علامت: پاسخها کند شدهاند.
دلیل: لود cpu بالا رفته است.
- تفاوت دلیل و علامت در نوشتن یک سیستم مانیتورینگ خوب خیلی ماثر است.
تفاوت عمده این دو مورد، در علامتگرا بودن black-box و در حالی که white-box هم میتواند علامتگرا و هم علتگرا باشد. از این جهت که در یک سیستم چندلایه، علامت مشکل یک سرویس ممکن است دلیل مشکل یک سرویس وابسته به آن باشد.
نهایتا white-box وابسته به قدرت پایش اطلاعات داخل سیستم، مثلا لاگها و ... است. و باعث فهمیدن مشکلات قریبالوقوع و حتی مشکلاتی که با ریترای کردن پنهان شدهاند، میشود.
میزان مراجعه white-box بیشتر است. و این جواب را معمولا به ما میدهد که چرا مشکل داریم و از این سمت black-box جواب چه چیزی خراب است را به ما میدهد.
این چهار سیگنال، اصلیترین سیگنالهای مانیتورینگ هستند و یک مانیتورینگ خوب همه این چهار مورد را پوشش میدهد.
مدت زمانی که طول میکشد که سرویس یک درخواست را پردازش کرده و به آن جواب بدهد. یک نکته مهم در این جا وجود دارد و آن جدا کردن latency درخواستها موفق و ناموفق است. چرا؟ چون که درخواستهای ناموفق مانند 404 طولی نمیکشند و سریع هستند و باعث تاثیر در سایر دادهها شده و منجر به برداشت اشتباه از این قسمت میشوند.
این که در لحظه چقدر درخواست برای یک سرویس وجود دارد و مقدار هر کدام از درخواستها در صورت وجود، چقدر است؟
برای سرویسهای استریمینگ این تعداد ممکن است حجم داده منتقل شده در لحظه باشد.
سرعت درخواستهایی که با خطا مواجه میشوند. توجه داشته باشید که این خطاها لزوما شامل مثلا خطاهای 500 نمیشوند و بلکه یک پاسخ 200 هم ممکن است خطا تلقی شود. وقتی که دارای محتوای اشتباهی باشد و وقتی مثلا یک قانونی (این که باید یک ثانیه طول بکشد و یک و نیم ثانیه طول کشیده است.) را بشکند.
حتی در مواقعی که کدهای کلیتر مانند 500 برای توضیح شرایط پیشآمده آنچنان کافی نیستند، لازم است کدهای خروجی داخلی یک سرویس نیز پوشش داده شوند.
حالا مانیتور کردن همه این موارد شاید یکسان نباشد. مثلا فهمیدن پاسخهای 500 میتواند در مثلا load balancer به راحتی انجام شود. اما فهمیدن درخواستهای با محتوای اشتباه به این سادگی نیست و در تستهای end-to-end به دست میآیند.
این که سرویس شما چقدر پر است و تا چقدر میتواند دوام بیاورد؟ مثلا ما بدانیم که اگر همین الان مصرف رم دوبرابر شود، سرویس دچار مشکل میشود. و دقیقا بدانیم که سرویس ما توانایی پاسخدادن به چند ریکوئست در ثانیه را دارد؟ و چقدر از آن الان پر است؟و ...
واقعا لازم نیست کار عجیب و غریبی انجام دهیم! اگر سرویس ما همه این چهار سیگنال را پوشش میدهد و در صورت وقوع اتفاقی درآنها هشدار میدهد، ما یک مانیتورینگ خوب داریم.
وقتی میخواهیم یک سیگنالی مانند latency را اندازه بگیریم، احتمالا اولین سوال این باشد که چه مقداری از آن برای ما مهم باشد؟ و شاید اولین جواب میانگین آن باشد.
فرض کنید ما یک وبسرویسی داشته باشیم که در هر ثانیه ۱۰۰۰ درخواست را جواب میدهد و میانگین latency برابر ۱۰۰ میلیثانیه است. ظاهرا همه چیز خوب است ولی اگر کمی دقت کنیم متوجه میشویم که در همین سناریو ممکن است ۱ درصد درخواستهایمان بالای ۵ ثانیه طول کشیده باشند!!!
مواردی از قبیل مصرف CPU، میزان مشغول بودن Database و ... مقدار مصرفشان به صورت نرمال توزیع نشده است و کاملا ممکن است غیرمتعادل باشند.
برای این که اینگونه به اشتباه نیوفتیم، میتوانیم برای مثال همین latency را بر اساس مقدارهای مناسب تقسیم بندی کنیم. مثلا اینگونه اندازهگیری کنیم که چه مقدار از درخواستهای ما زیر ۱۰ میلیثانیه و چه مقدار بین ۱۰ تا ۳۰ و چقدر بین ۳۰ تا ۱۰۰ و نهایتا چقدر بالای صد داریم. در این حالت نمود واقعیتری را از وضعیت سیستم موجود میبینیم.
این که ما متریکهای مختلف را با چه وضوح و دقتی اندازهگیری کنیم، مهم است.
در مشاهده بار پردازنده در بازه زمانی یک دقیقه، احتمالا spikeهایی که باعث افزایش latency میشوند برایمان نمایان نشوند. و برعکس برای سیستمی که SLO آن ۹۹٫۹ درصد دردسترس بودن در یک سال است، چک کردن میزان پر بودن هارد هر یک دقیقه یک بار، فرکانسی نیست که لازم باشد.
اگر بخواهیم بار پردازنده را در هر ثانیه مشاهده کنیم، ممکن است هزینه این کار زیاد باشد. در این موارد برای کاهش این هزینهها اگر سیستم ما نیازمند مشاهده لحظهای نباشد، میتوانیم دادهها را داخل سیستم جمعآوری کنیم و یک سرویس خارجی آنها را جمع آوری کرده و نشان دهد.
این قسمت تا اینجا کافی است و در ادامه به بررسی سیستم هشدار و استانداردهای آن میپردازیم.
اگر نظری هم دارید مانند همیشه مشتاق به شنیدنش هستم. :دی