Skip to main content
تستخدم النسخة المتماثلة الواحدة وحدة المعالجة المركزية لعقدة واحدة في كل عملية ترجمة: على عقد الاختبار لدينا ذات 2 vCPU، استغرقت ست عمليات ترجمة متزامنة ثلاثة أضعاف الوقت الذي تستغرقه عملية واحدة، بينما بقيت العقد الأخرى خاملة. أما النسخ المتماثلة المتعددة فتوزّع المستخدمين، وعمليات الترجمة الخاصة بهم، على العقد. يتبع هذا تصميم التوسع الأفقي الخاص بـ Overleaf، بعد نقله إلى Kubernetes:
خطّط لـ S3 منذ البداية. تحتاج النسخة التي تحتفظ بالفعل بالملفات على وحدة التخزين الخاصة بها إلى الترحيل إلى S3 أولًا. يحلّ هذا الإعداد محل الـ Deployment من الخطوة 5: احذفه (kubectl delete -f 40-overleaf.yaml) قبل تطبيق الـ StatefulSet.
1

تخزين S3

أعدّ الحاويات (buckets) الثلاث والمستخدمَين الاثنين كما هو موضح في S3، باستخدام خدمة S3 لديك أو باستخدام Garage داخل الكتلة، وضع المفاتيح الأربعة في الـ Secret ‏overleaf-s3. يستخدم الإعداد أدناه مثال Garage من تلك الصفحة.
2

الإعداد

يحلّ هذا الـ ConfigMap محل 30-config.yaml. وهو يضيف S3 وgit-bridge ويوجّه OVERLEAF_SITE_URL إلى موازن الأحمال:
60-config.yaml
3

النسخ المتماثلة

70-overleaf.yaml
  • StatefulSet، وليس Deployment. تحصل كل نسخة متماثلة على اسم ثابت (overleaf-0، overleaf-1، …) يشير إليه ملف تعريف الارتباط الخاص بموازن الأحمال وgit-bridge، ويبدأ OrderedReady تشغيل overleaf-0 وحده أولًا، بحيث لا تشغّل عمليات ترحيل قاعدة البيانات إلا نسخة متماثلة واحدة.
  • نسخة متماثلة واحدة لكل عقدة. تبدأ كل نسخة متماثلة عمليات الترجمة الخاصة بها عبر Docker الخاص بعقدتها وتحتفظ بها في /srv/overleaf-ha الخاص بعقدتها.
  • V1_HISTORY_URL لكل نسخة متماثلة. تقدّم كل نسخة متماثلة روابط السجل باسمها الخاص، حتى يتمكن git-bridge من الوصول إليها.
4

git-bridge

75-git-bridge.yaml
راجع التكامل مع Git لمعرفة سبب كون GIT_BRIDGE_HOST عنوان IP ثابتًا.
5

موازن الأحمال

إعداد HAProxy هو نموذج Overleaf مع خمسة تغييرات: توجيه /project/<id>/mcp إلى overleaf-0 مثل /git/ (راجع خادم MCP)، وHTTP عادي على المنفذ 8080 (تعمل الصورة بمستخدم غير الجذر، ولا يمكنه الارتباط بالمنفذ 80 في ظل containerd)، والعثور على الخوادم عبر DNS الخاص بالكتلة (تتغير عناوين IP الخاصة بالـ Pods عند كل إعادة تشغيل)، وDaemonSet بحيث تستجيب كل عقدة، وbalance leastconn بدلًا من roundrobin الافتراضي (راجع قسم الأسئلة والأجوبة أدناه).
80-haproxy.yaml
يحافظ externalTrafficPolicy: Local على عناوين IP الخاصة بالمستخدمين في X-Forwarded-For.
6

TLS

أنهِ HTTPS في HAProxy كما هو موضح في وكيل TLS، ثم اضبط OVERLEAF_SITE_URL على عنوان https:// وOVERLEAF_SECURE_COOKIE: "true" في 60-config.yaml.

ما الذي يمكن توقّعه

اختبرنا ثلاث نسخ متماثلة على ثلاث عقد لكل منها 2 vCPU و4 GB، مع MongoDB وRedis وGarage وgit-bridge وHAProxy على العقد نفسها:
  • 12 مستخدمًا يترجمون مستندًا من 600 صفحة في الوقت نفسه: ترجم الـ 12 جميعهم مستنداتهم وجلبوا ملفات PDF الخاصة بهم، بواقع 4 مستخدمين لكل نسخة متماثلة؛ واستغرقت الجولة الواحدة من 8 إلى 18 ثانية. احتفظت كل عقدة بما لا يقل عن 1.3 GB من الذاكرة المتاحة.
  • يبقى كل مستخدم على نسخة متماثلة واحدة (ملف تعريف الارتباط server-pro-ha)، بما في ذلك تنزيل ملف PDF الذي يجب أن يأتي من النسخة المتماثلة التي ترجمته. وينطبق الأمر نفسه عبر HTTPS، بما في ذلك WebSocket الخاص بالمحرر.
  • عندما تتوقف نسخة متماثلة، يتلقى مستخدموها أخطاء لمدة 15 إلى 20 ثانية تقريبًا، إلى أن يعلّمها HAProxy على أنها متوقفة؛ ثم ينتقلون إلى نسخة متماثلة أخرى ويبقون مسجلين دخولهم، لأن الجلسات موجودة في Redis.

أسئلة وأجوبة

الإجابة: مع نموذج Overleaf (‏roundrobin، وHAProxy واحد لكل عقدة)، توزّع 12 مستخدمًا جديدًا بواقع 8 و3 و1 على النسخ المتماثلة الثلاث في اختبارنا، وجعلت النسخة المتماثلة الأكثر انشغالًا أبطأ المستخدمين ينتظرون 29 ثانية. ومع leastconn، الذي يفضّل النسخة المتماثلة ذات أقل عدد من الاتصالات المفتوحة (يبقي كل محرر WebSocket مفتوحًا)، أعطى الاختبار نفسه 4 و4 و4 و18 ثانية. لم يتغير الالتصاق (stickiness): فهو يأتي من ملف تعريف الارتباط.
الإجابة: نعم، إذا كان يوجّه حسب ملف تعريف ارتباط إلى نسخة متماثلة ثابتة، ويدعم WebSockets، ويسمح بأزمنة طلبات تصل إلى 10 دقائق ورفع ملفات حتى 50 MB، ويُبقي مهلة keep-alive لديه أقل من 65 ثانية، ويرسل X-Forwarded-For وX-Forwarded-Proto، ويرسل /git/ و/project/<id>/mcp إلى overleaf-0. وجّه إلى الأسماء الخاصة بالنسخ المتماثلة (overleaf-N.overleaf-hl)، وليس إلى Service يوازن كل طلب.
الإجابة: أضف عقدة تحتوي على Docker وصور TeX Live، واضبط replicas: 4 في 70-overleaf.yaml، وأضف سطر server overleaf-3 ... إلى إعداد HAProxy (وزِد قيمة config-hash حتى يُعاد تشغيل HAProxy).
آخر تعديل في ٢ نوفمبر ٢٠٢٦