در مقیاس عملیاتی Cloudflare، حتی بهبودهای کوچک ۱ درصدی میتوانند تأثیرات گستردهای داشته باشند. اخیراً این شرکت موفق شد با بازنگری در یک الگوریتم خاص، بیش از ۱۰۰ ترابایت حافظه RAM را در سطح جهانی آزاد کند. این دستاورد از طریق بهینهسازی سرویس Pingora Backend Router (PBR) و کتابخانه متنباز pingora-ketama حاصل شد.
چالش توزیع بار و Consistent Hashing
برای توزیع درخواستها بین سرورها بهگونهای که با اضافه یا حذف یک سرور، تغییرات گستردهای در نگاشتها رخ ندهد، از روش Consistent Hashing استفاده میشود. در این روش، سرورها و درخواستها بر روی یک فضای عددی (به شکل یک حلقه یا خط عدد) نگاشت میشوند. هر درخواست به اولین سروری که در مسیر خود قرار دارد ارجاع داده میشود.
مشکل اصلی در این روش، توزیع نامتوازن بار است. از آنجایی که هشها بهصورت تصادفی توزیع میشوند، برخی سرورها ممکن است محدوده بزرگتری از فضای هش را پوشش دهند و ترافیک بیشتری دریافت کنند. برای حل این مشکل، از «نقاط مجازی» یا هشهای متعدد برای هر سرور استفاده میشود تا توزیع بار یکنواختتر شود.
بهینهسازی ساختار داده در Rust
یکی از اولین بهبودها در سطح مدیریت حافظه (Memory Footprint) رخ داد. در زبان Rust، به دلیل قوانین Alignment، اندازه یک ساختار (Struct) باید مضربی از بزرگترین فیلد آن باشد. در ساختار ذخیرهسازی هشها، این موضوع باعث ایجاد فضای خالی (Padding) در حافظه میشد.
- راهکار: با جایگزینی ساختار استاندارد و استفاده از آرایههای بایت خام (Raw Byte Array) و متدهای Getter، حجم حافظه مصرفی برای ذخیرهسازی هشها ۲۵٪ کاهش یافت.
کاهش تعداد هشها با تحلیل آماری
تیم مهندسی با تحلیل ریاضیاتی متوجه شد که تعداد پیشفرض هشها برای هر سرور (۱۶۰ نقطه) بسیار بیشتر از حد نیاز است. با بررسی Coefficient of Variation (ضریب تغییرات) و احتمال برخورد هشها (Collision) در فضای ۳۲ بیتی، مشخص شد که میتوان تعداد هشها را تا ۹۰٪ کاهش داد بدون اینکه خطای قابلتوجهی در توزیع بار ایجاد شود.
استراتژی مهاجرت بدون اختلال (Zero-Downtime Migration)
تغییر در حلقه هش (Hash Ring) باعث تغییر مسیر درخواستهای Cacheable میشود و اگر بهصورت یکباره اعمال شود، منجر به پاک شدن گسترده کشها و افزایش شدید ترافیک به سمت سرورهای مبدأ (Origin Traffic) میگردد. برای جلوگیری از این اتفاق، استراتژی زیر اجرا شد:
- اجرای موازی: هر دو نسخه حلقه قدیمی (v1) و جدید (v2) بهطور همزمان در حافظه نگه داشته شدند.
- Rollout لایهای: مهاجرت ابتدا در مراکز داده کوچک و سپس بهصورت تدریجی در سطح جهانی اعمال شد.
- کنترل دقیق: تصمیمگیری برای استفاده از کدام حلقه، بر اساس هش هر درخواست صورت گرفت تا پایداری سیستم حفظ شود.
در نهایت، این تغییرات منجر به کاهش چشمگیر مصرف RAM در سرویس PBR شد که در نمودارهای عملیاتی، بازگشت ۱۰۰ ترابایت حافظه را نشان میدهد.