مسئله: سامانهای بساز که میلیونها متریک در ثانیه از هزاران سرور جمع کند، نگه دارد، کوئری کند و رویش هشدار بگذارد — Datadog/Prometheus خودت. (حالا که درس ۵۰ مصرفش را میدانی، بسازش.)
۱-۲) نیازمندی و تخمین
- FR: دریافت متریک (push/pull)، ذخیره سری زمانی، کوئری و داشبورد، هشدار.
- NFR: نوشتن سنگینِ دائمی، خواندن نوسانی (هنگام حادثه همه داشبورد باز میکنند!)، retention ماهها با granularity نزولی.
- تخمین: 10K میزبان × 100 متریک × هر 10s ≈ 100K نقطه/s فقط برای یک مشتری — ضربدر cardinality (درس ۵۰) یعنی طراحی برای انفجار.
۳) طراحی — دیتابیس سری زمانی
چرا نه Postgres؟ الگوی نوشتن: الحاقی، حجیم، تقریباً بدون آپدیت؛ الگوی خواندن: بازهای روی یک سری. پاسخ: TSDB با LSM (درس ۱۲ — نوشتن سنگین را میبلعد)، داده هر سری بهترتیب زمان کنار هم روی دیسک (خواندن بازهای = sequential)، و فشردهسازی دلتا: زمانها و مقدارهای متوالی شبیهاند؛ XOR/دلتا هر نقطه را به چند بیت میرساند (همین ترفند Gorilla فیسبوک — ۱۲ برابر فشردگی).
- بافر اجباری: موج حادثه = موج متریک؛ Kafka بین agent و ingest نباید بگذارد همینجا سیستم مانیتورینگ هم بمیرد — سیستمی که برای دیدن حادثه ساختهای نباید اولین قربانی حادثه باشد.
- Shard بر اساس نام متریک + برچسبها (هش سری)؛ یک سری همیشه به یک گره میرود تا بازهخوانی محلی بماند.
- Downsampling: داده خام ۱۰ ثانیهای یک هفته، بعد تجمیع دقیقهای یک ماه، بعد ساعتی یک سال — نگهداشتن همیشگیِ دقت کامل، پول سوزاندن است.
- Push یا Pull؟ Prometheus کشش (pull) میکشد (ساده، کشف سرویسمحور)؛ Datadog/agent push میکند (بهتر برای ephemeral و فایروال). هیبرید هم رایج است.
۴) عمق و گلوگاه
- خواندن نوسانی: داشبوردها را query cache و pre-aggregation کن؛ تجمیعهای رایج (avg per node per min) از قبل محاسبه شود.
- هشدار نباید کوئری سنگین همزمان بزند: ارزیابی قوانین روی جریان (streaming eval) یا کوئری سبک دورهای با کش.
- خودِ سیستم مانیتورینگ هم SLO میخواهد — و باید با حداقل وابستگی به همان زیرساختی که رصدش میکند زنده بماند (monitoring the monitoring).
به زبان ساده
سیستم مانیتورینگ یعنی دیتابیس سریزمانی: نوشتن سیلابی با LSM میبلعد، داده هر متریک کنار هم روی دیسک است و دقت داده قدیمی بهتدریج کم میشود (downsampling).
مثال واقعی
مثل دفتر ثبت دمای بیمار: هفته اخیر هر ۱۰ دقیقه، ماه قبل هر ساعت، سال قبل فقط روزانه — چون کسی دمای دقیقهبهدقیقه سال پیش را نمیخواهد.