تخطيط السعة والتوسع التلقائي

التوسع التلقائي في السحابة خارج Kubernetes

18 دقيقة الدرس 7 من 27

التوسع التلقائي في السحابة خارج Kubernetes

تُعدّ أدوات HPA وCluster Autoscaler في Kubernetes قوية للغاية، غير أن جزءاً كبيراً من أعباء الإنتاج — من دوال بلا خادم، وقواعد بيانات مُدارة، وأسطول EC2 قديمة، وخدمات App Engine وAzure App Service — تتوسع بالكامل خارج مستوى Kubernetes. فهم آليات التوسع التلقائي الأصيلة في السحابة على مستوى البنية التحتية أمرٌ لا غنى عنه للمهندسين الكبار الذين يصمّمون أنظمة مرنة وفعّالة التكلفة تمتد عبر الخدمات المُدارة والأجهزة الافتراضية المجرّدة وتنسيق الحاويات في آنٍ واحد.

يتناول هذا الدرس الركائز الثلاث للتوسع التلقائي السحابي المستقل عن Kubernetes: سياسات التوسع الديناميكي (تفاعلية تعتمد على المقاييس)، والتوسع المُجدوَل (زمني لأعباء العمل المتوقعة)، والتوسع التنبؤي (يعتمد على التعلم الآلي واستباق الحمل). نستخدم مجموعات التوسع التلقائي AWS (ASG) كمرجعٍ أساسي — إذ تتبع مجموعات الجهاز المُدار في GCP ومجموعات توسع الأجهزة الافتراضية في Azure النموذج ذاته مع صياغة مختلفة لكل مزوّد.

مجموعات التوسع التلقائي: التشريح الداخلي

تُغلّف مجموعة ASG أسطولاً من أجهزة EC2 ضمن مظروف من القدرة الدنيا والمرغوبة والقصوى، مع مجموعة من سياسات التوسع. كل إجراء توسع — سواء صدر من تنبيه CloudWatch أو جدولة زمنية أو نموذج تنبؤي — يكتب في نهاية المطاف إلى حقل DesiredCapacity ذاته. يقوم متحكم ASG بعد ذلك بمزامنة الأجهزة العاملة الفعلية نحو هذا الهدف، بإطلاق الأجهزة أو إنهائها عبر مناطق التوفر المُعرَّفة.

على نطاق الشركات الكبرى، تجلس مجموعات ASG عادةً خلف موازن تحميل شبكي (NLB) أو موازن تحميل تطبيقي (ALB). عند اجتياز جهازٍ جديد لفحوصات الصحة، تُسجّله المجموعة في مجموعة الهدف. ووقت الاحماء — النافذة الزمنية بين "بدء تشغيل الجهاز" و"قبول الجهاز للحركة المرورية" — معامل حرج تُخطئ في ضبطه معظم الفرق في المرة الأولى.

ASG Scaling Architecture with ALB and CloudWatch ASG Scaling Architecture Application Load Balancer (ALB) Auto Scaling Group min=2 desired=4 max=20 EC2 i-aa11 Healthy Warm ✓ EC2 i-bb22 Healthy Warm ✓ EC2 i-cc33 Healthy Warm ✓ EC2 i-dd44 Warming… 120s left EC2 i-ee55 Launching Pending CloudWatch Alarms / Metrics Predictive Scaling Routes traffic ScaleOut action Scaling Policies Target Tracking / Step / Schedule
مجموعة ASG بخمسة أجهزة: ثلاثة دافئة وفي الخدمة، واحد في مرحلة الاحماء، وآخر لا يزال في طور الإطلاق — جميعها تُدار عبر سياسات توسع مستمدة من CloudWatch.

سياسات التوسع الديناميكي

تقدم AWS ثلاثة أنواع من السياسات التفاعلية؛ وتتكامل الأنظمة الإنتاجية عادةً بين الأنواع الثلاثة معاً للحصول على طبقات دفاعية متعددة.

التوسع بتتبع الهدف (Target Tracking)

أبسط السياسات وأكثرها توصية. تحدد قيمة مستهدفة لمقياس معين — مثل نسبة CPU عند 60%، أو عدد الطلبات لكل هدف بمعدل 1000 طلب/ثانية، أو عمق قائمة انتظار SQS لكل جهاز — وتضبط المجموعة سعتها باستمرار للحفاظ على هذا الهدف. تشغّل AWS داخلياً حلقة تحكم مشابهة لنظام PID.

# إرفاق سياسة تتبع هدف لمتوسط CPU عند 60% aws autoscaling put-scaling-policy \ --auto-scaling-group-name my-api-asg \ --policy-name cpu-target-60 \ --policy-type TargetTrackingScaling \ --target-tracking-configuration '{ "PredefinedMetricSpecification": { "PredefinedMetricType": "ASGAverageCPUUtilization" }, "TargetValue": 60.0, "ScaleInCooldown": 300, "ScaleOutCooldown": 60, "DisableScaleIn": false }' # مقياس مخصص: ALBRequestCountPerTarget aws autoscaling put-scaling-policy \ --auto-scaling-group-name my-api-asg \ --policy-name rps-target-1000 \ --policy-type TargetTrackingScaling \ --target-tracking-configuration '{ "CustomizedMetricSpecification": { "MetricName": "RequestCountPerTarget", "Namespace": "AWS/ApplicationELB", "Dimensions": [ {"Name":"TargetGroup","Value":"targetgroup/my-tg/abc123"} ], "Statistic": "Sum", "Unit": "None" }, "TargetValue": 1000.0, "ScaleInCooldown": 300, "ScaleOutCooldown": 30 }'
فترة تبريد التوسع للخارج مقابل الداخل: حافظ على فترة تبريد التوسع للخارج قصيرة (30–60 ثانية) للتفاعل السريع مع طفرات الحركة. احرص على إبقاء فترة تبريد التوسع للداخل طويلة (300–600 ثانية) حتى لا تُنهي أجهزة فتية بدأت للتو في تسخين ذاكرة التخزين المؤقت. هذا التباين متعمد — تكلفة توسع بضعة أجهزة إضافية أقل بكثير من تكلفة الانهيار في الاستجابة جراء توسع داخلي متسرع.

التوسع بالخطوات (Step Scaling)

يتيح لك التوسع بالخطوات تعريف دالة مجزّأة: إذا تخطى CPU 70%، أضف جهازَين؛ إذا تخطى 85%، أضف خمسة؛ إذا تخطى 95%، أضف عشرة. هذه هي السياسة المناسبة عندما يكون نمط حمولتك متقطعاً وتعلم من التجربة أن تعديلات تتبع الهدف التدريجية أبطأ مما ينبغي. تُطلَق من تنبيه CloudWatch لا من المقياس مباشرة.

# 1. إنشاء تنبيه CloudWatch aws cloudwatch put-metric-alarm \ --alarm-name asg-cpu-high \ --metric-name CPUUtilization \ --namespace AWS/EC2 \ --dimensions Name=AutoScalingGroupName,Value=my-api-asg \ --statistic Average \ --period 60 \ --evaluation-periods 2 \ --threshold 70 \ --comparison-operator GreaterThanOrEqualToThreshold \ --alarm-actions arn:aws:autoscaling:us-east-1:123456789:scalingPolicy:abc:autoScalingGroupName/my-api-asg:policyName/step-scale-out # 2. إرفاق سياسة التوسع بالخطوات aws autoscaling put-scaling-policy \ --auto-scaling-group-name my-api-asg \ --policy-name step-scale-out \ --policy-type StepScaling \ --adjustment-type ChangeInCapacity \ --step-adjustments \ '[{"MetricIntervalLowerBound":0,"MetricIntervalUpperBound":15,"ScalingAdjustment":2}, {"MetricIntervalLowerBound":15,"MetricIntervalUpperBound":25,"ScalingAdjustment":5}, {"MetricIntervalLowerBound":25,"ScalingAdjustment":10}]' \ --cooldown 90
فخ فترات تقييم التنبيه: تنبيه بفترة واحدة على مقياس 60 ثانية بنافذة تقييم دقيقة واحدة يعني احتمال تفعيل التوسع على نقطة بيانات واحدة صاخبة. استخدم فترتَي تقييم على الأقل (دقيقتان من الخرق المستمر) لتنبيهات CPU. للأعباء الحساسة للاستجابة حيث تريد رد فعل أسرع، قلص فترة المقياس إلى 10 ثوانٍ مع الإبقاء على 3–5 فترات تقييم للتفريق بين الطفرات والحمل المستدام.

التوسع المُجدوَل

للأعباء ذات الدورات المتوقعة — حركة API في ساعات العمل، ووظائف الدُفعات اليومية، وإرسال البريد التسويقي الأسبوعي، وطفرات فتح السوق اليومية — يُعدّ التوسع المُجدوَل أكثر موثوقية وأوفر تكلفة من التوسع التفاعلي. تضبط السعة المرغوبة والدنيا والقصوى في وقت محدد باستخدام تعبيرات cron؛ دون حاجة لمقياس أو تنبيه أو تأخير.

# التوسع المسبق قبل حركة الصباح (UTC 07:45 = ~2:45 صباحاً EST) aws autoscaling put-scheduled-update-group-action \ --auto-scaling-group-name my-api-asg \ --scheduled-action-name morning-scale-up \ --recurrence "45 7 * * MON-FRI" \ --min-size 10 \ --max-size 50 \ --desired-capacity 15 # التقليص بعد هدوء حركة المساء aws autoscaling put-scheduled-update-group-action \ --auto-scaling-group-name my-api-asg \ --scheduled-action-name evening-scale-down \ --recurrence "0 23 * * MON-FRI" \ --min-size 2 \ --max-size 50 \ --desired-capacity 5 # توسع لمرة واحدة قبيل إطلاق منتج (توقيت ISO 8601) aws autoscaling put-scheduled-update-group-action \ --auto-scaling-group-name my-api-asg \ --scheduled-action-name launch-day-boost \ --start-time "2025-09-15T12:00:00Z" \ --min-size 30 \ --max-size 100 \ --desired-capacity 50

تفصيل جوهري: الإجراء المُجدوَل يغيّر DesiredCapacity فحسب عند لحظة الجدولة. إذا وسّعت سياساتك التفاعلية أسطولك بالفعل فوق القيمة المرغوبة الجديدة، سيُقلّص الإجراء المُجدوَل أسطولك في تلك اللحظة. تأمّل دائماً في التفاعل بين الإجراءات المُجدوَلة وحالة السياسة الحية — خصوصاً في شقّ التقليص.

الوعي بالمنطقة الزمنية: تُفسّر AWS تعبيرات cron في الإجراءات المُجدوَلة دائماً بتوقيت UTC. وثّق هذا صراحةً في كتيبات التشغيل — فالتوسع المُجدوَل للساعة 08:00 قد يحتاج إلى 13:00 UTC لخدمة رئيسية في لندن، لكن 14:00 UTC خلال التوقيت الصيفي BST. استخدم أدوات مدركة للمناطق الزمنية (Terraform مع إزاحات UTC صريحة) وأضف تنبيهاً على انجراف الساعة في خط أنابيب CI/CD.

التوسع التنبؤي

يستخدم AWS Predictive Scaling، الذي أصبح متاحاً بشكل عام عام 2021، تعلماً آلياً مدرَّباً على ما يصل إلى 14 يوماً من المقاييس التاريخية لمجموعة ASG في CloudWatch للتنبؤ بالحمل المستقبلي وضبط السعة استباقياً قبل وصول الحمل. الفارق الجوهري عن التوسع المُجدوَل أنه يتعلم ويتكيف — لا حاجة لصيانة جدول حين يتغير نمط حمولتك.

يعمل التوسع التنبؤي في وضعَين. في وضع التنبؤ فقط، يولّد تنبؤات ويعرضها في لوحة التحكم دون اتخاذ أي إجراء — مفيد لبناء الثقة قبل تفعيل الأتمتة. في وضع التنبؤ والتوسع، ينشئ إجراءات مُجدوَلة آلياً، عادةً قبل ساعة من الزيادة المتوقعة في الحمل.

# تفعيل التوسع التنبؤي عبر Terraform (الموصى به لـ IaC) resource "aws_autoscaling_policy" "predictive" { name = "predictive-cpu" autoscaling_group_name = aws_autoscaling_group.api.name policy_type = "PredictiveScaling" predictive_scaling_configuration { mode = "ForecastAndScale" scheduling_buffer_time = 300 # احتياط 5 دقائق قبل التنبؤ max_capacity_breach_behavior = "IncreaseMaxCapacity" max_capacity_buffer = 10 # السماح بتجاوز 10% فوق الحد الأقصى metric_specification { target_utilization = "60" predefined_load_metric_specification { predefined_metric_type = "ASGTotalCPUUtilization" resource_label = "" } predefined_scaling_metric_specification { predefined_metric_type = "ASGAverageCPUUtilization" resource_label = "" } } } }

قيمة scheduling_buffer_time البالغة 300 ثانية تخبر النظام بجدولة التوسع للخارج قبل 5 دقائق من الذروة المتوقعة — وهو أمر حيوي عندما يستغرق إطلاق الجهاز والإحماء من 3 إلى 4 دقائق. أما ضبط max_capacity_breach_behavior على IncreaseMaxCapacity فيتيح للتوسع التنبؤي تجاوز حدك الأقصى المُعرَّف مؤقتاً خلال الطفرات غير المتوقعة، متجنباً سقفاً صلباً قد يحجب التوسع في أسوأ اللحظات.

الجمع بين الأنواع الثلاثة: النمط الإنتاجي

في الشركات التي تعالج حركة مرور ضخمة، تعمل الآليات الثلاثة في آنٍ واحد ضمن تسلسل هرمي. يتولى التوسع التنبؤي إدارة الخط الأساسي للتنبؤ، مبقياً أسطولك مُسخَّناً مسبقاً. يغطي التوسع المُجدوَل الأحداث الجسيمة المعروفة — إطلاق منتجات، وحملات تسويقية، ونوافذ فتح السوق — التي تكون أكثر حدةً وتخصصاً مما يستطيع نموذج التعلم الآلي استيعابه. يستوعب التوسع الديناميكي بتتبع الهدف التباين المتبقي الذي لم يتوقعه التوسع المُجدوَل ولا التنبؤي. ويعمل التوسع بالخطوات كقاطع دائرة للطفرات المفاجئة الشديدة.

الإحماء هو الاختناق الخفي: على نطاق Google وAmazon وMeta، غالباً ما تمتد فترة إحماء الجهاز — الزمن بين "بدء تشغيل الجهاز" و"قبوله الكامل للحركة الإنتاجية بدون ارتفاع معدل الأخطاء مع تسخين ذاكرة التخزين المؤقت وتجميع JIT" — من 3 إلى 8 دقائق لخدمات JVM، ومن 1 إلى 2 دقيقة لخدمات Go/Node. يجب ضبط DefaultInstanceWarmup على هذه القيمة المقاسة الفعلية، لا القيمة الافتراضية 300 ثانية. أخطأ في ذلك، وستتضمن مقاييس CloudWatch أجهزة لم تُسخَّن بعد، مما يُضوّش إشارات التوسع ويتسبب في تقليص مبكر متسرع.

الخدمات المكافئة على السحابات الأخرى

تستخدم مجموعات الجهاز المُدار في GCP موارد Autoscaler مع كتل autoscalingPolicy — الثلاثية المفاهيمية ذاتها من هدف cpuUtilization وloadBalancingUtilization وschedules. تستخدم مجموعات توسع الأجهزة الافتراضية في Azure إعدادات Autoscale مع rules (قائمة على المقاييس) وملفات fixedDate أو recurrence للتوسع المُجدوَل. لا تمتلك Azure حتى الآن مكافئاً أصيلاً لـ AWS Predictive Scaling؛ إذ لا يزال Azure Monitor Predictive Autoscale في مرحلة المعاينة اعتباراً من 2025. لأساطيل متعددة السحاب، يجرّد Terraform الفوارق بين المزودين في سير عمل IaC ذاته، رغم اختلاف دلالات فترات التبريد ونوافذ التقييم بما يكفي لتبرير الضبط الدقيق لكل سحابة على حدة.