ARE الحياة اليومية: CART النزيف

كما تعلم ، نحن ندير Hostinger. إنه عنصر مهم لأنه يشبه بطاقة التهنئة لشركتنا. علاوة على ذلك ، فهي البوابة الرئيسية لتهيئة عملاء جدد وتحقيق أرباح من خلال / عربة التسوق.

في البداية ، كان لدينا مثيل واحد فقط من موقع الويب الرئيسي الخاص بنا والذي تم توفيره في مركز بيانات واحد يقع في المملكة المتحدة ، والذي تم تجهيزه ببنية تحتية قديمة للشبكة. كنا نشهد الكثير من هجمات DDoS.

كان الحل السريع هو وضع موقع الويب تحت Cloudflare للتخفيف من هجمات DDoS. عملت بشكل جيد ، ولكن ليس لفترة طويلة. بينما كنا نعالج الأعراض ، استمرت المشكلة الفعلية حتى عانينا من تعطل كبير عندما كان مركز البيانات المذكور أعلاه معطلاً لأكثر من 4 ساعات.

قضايا التحجيم

قررنا توسيع نطاق تطبيقنا في جميع أنحاء العالم. تم إطلاق مثيلين من التطبيقات لكل موقع. نستخدم Anycast العالمي في الوقت الحالي في ثلاثة مواقع: سنغافورة والولايات المتحدة وهولندا. في المجموع ، أطلقنا ست حالات.

حسنًا ، تم نشر الكود ، لكن لدينا الآن مشكلة في قاعدة البيانات. كيف تجعلها متاحة بسهولة ويسهل الوصول إليها؟

قرر مطورونا أنهم كانوا جميعًا تقريبًا طلبات قراءة كانت في طريقهم إلى قاعدة البيانات ، لذلك قررنا البدء في استخدام Geo Percona XtraDB Cluster. بدأ مثيلًا واحدًا لكل موقع ، بشكل عام ثلاثة.

في وقت لاحق ، اتضح أن نقطة نهاية / cart تكتب في الغالب إلى قاعدة البيانات. لم يكن عبء العمل كما هو متوقع ومخطط له. قررنا نقل منطق / cart إلى Redis. أثار هذا السؤال مرة أخرى ، كيف يمكن توسيع نطاق Redis لتجنب انهيار الخوادم مرة أخرى؟ يتم استخدامه في الغالب للتخزين المؤقت / سلة التسوق لمدة شهر واحد ولجلسات PHP المشتركة. وبالطبع ، فهي ليست مهمة مثل قاعدة البيانات. سيعوض عن بعض أحمال الكتابة إلى قاعدة البيانات.

تم تمهيد مثيل Redis واحد لكل موقع دون أي حالة مشتركة بينهما. إذا وصل طلب إلى أوروبا ، فسيستخدم نموذج Redis في أوروبا. إذا كانت الولايات المتحدة ، ثم الولايات المتحدة ، وهكذا.

جولة الهيمنة على العالم

حسنًا ، لذا لم يكن الحل دليلًا مستقبليًا كما أردناه. الآن لدينا Cloudflare في المقدمة ، تطبيق موسع لكل مواقع متعددة. لكننا وجدنا مشكلة أخرى. لقد لاحظنا الكثير من أخطاء “SQLSTATE MySQL” التي اختفت من تطبيقنا. لقد بدأت في البحث ولاحظت أن مجموعة XtraDB أطلقت أخطاء مهلة تشكل النصاب القانوني. كالعادة ، لم يكن هناك وقت لمزيد من التحقيق في الأمر ، وبالتالي قمنا بتطبيق بعض الإصلاحات السريعة مثل زيادة المهلة لمجموعة ، وإعادة المحاولة وأحجام النوافذ للمخازن المؤقتة للنسخ المتماثل. لقد عملت بشكل أفضل بنسبة 5٪ تقريبًا ، ولكن لا يزال لدينا انقطاعات في المهلات وانقطاع في الاتصال ووقت تعطل. ثم راجعت زمن الوصول بين نقاط نهاية XtraDB. تحياتي من آسيا ، كانت هناك خسارة كبيرة في الحزمة بين آسيا وأوروبا.

لقد اتصلت بموظفي مركز البيانات لإعادة توجيه البادئات الخاصة بنا من خلال المنبع الآخر وعادت الخدمة مرة أخرى. أكثر من ذلك ، يبلغ زمن الانتقال بين آسيا وأوروبا حوالي 250 مللي ثانية ، ومن ثم يتم إجراء العمليات الحسابية ولدينا 4 طلبات في الثانية للكتابات لأن مجموعة XtraDB تعترف بالكتابة فقط إذا أكدت جميع العقد في المجموعة.

في اليوم التالي ، بدأ فقدان الحزم بين المواقع يحدث مرة أخرى. تم الاتصال بشباب مركز البيانات ، وحل المشكلة مؤقتًا مرة أخرى. في النهاية اتخذ قرارًا للتخلص من مجموعة XtraDB. كان السؤال التالي هو كيفية الحفاظ على الإتاحة العالية لاتصالات قاعدة البيانات في حالة تعطل مثيل واحد؟ أطلقنا حل مجموعة MySQL مخصصًا يعتمد على ExaZK. تغير الوضع كثيرا.

الجهوزية الشيكات الرسم البياني

بعد حوالي أسبوع من مراقبة كيفية عمل التطبيق مع التغييرات الجديدة ، ما زلنا نلاحظ ارتفاعات كبيرة في أوقات الاستجابة. إنشاء حساب NewRelic والبدء في مراقبة التطبيق بأكمله.

يتضح وقت معاملة بقايا جديدة

لقد حصلنا على بعض المقاييس المفيدة حقًا المتعلقة باستعلامات MySQL البطيئة والموارد الخارجية. كانت المشكلة واضحة جدًا – لقد أطلقنا على مثيلات MySQL طلبات قراءة غير ضرورية من خلال تلقي ترجمات للغة معينة. قررنا إنشاء ملفات الترجمة إلى تنسيق JSON وتحميلها بسرعة بدلاً من الاستعلام عن قاعدة البيانات مع كل طلب.

مثال على JSON بدلاً من الاستعلامات

دمج GitHub الالتزام في الفرع الرئيسي

مع هذا التغيير ، قمنا بقطع زمن الوصول بشكل ملحوظ عندما تم اعتماد ملفات JSON لطلبات قاعدة البيانات.

الآن لدينا مشكلة أخرى (ليست حرجة مثل قاعدة البيانات) ، وهي أن ملفات JSON يبلغ حجمها حوالي 500 كيلو بايت. تتم قراءتها مع كل طلب وتولد ما يقرب من 3k “ قراءة () `syscalls في الثانية. 500 كيلو بايت / 8 كيلو بايت ~ = 62 قراءة () لقراءة ملف اللغة بالكامل. بالنسبة لأولئك المهتمين ، حصلت على هذه الأرقام باستخدام الأمر Sysdig:

# sysdig evt.args يحتوي على “json”

ما هو يوم بدون مفاجآت؟ ما زلنا نلاحظ نسبة عالية جدًا من المهلات في أدوات المراقبة الخاصة بنا. مررنا سريعًا بأدوات المراقبة التي لدينا: Grafana و Prometheus و Graylog للتحقق مرة أخرى مما يحدث والرجوع الترافقي مع StatusCake و Pingdom stats.

حسنا حسنا حسنا. كان السبب هو أن مفتاح الحامل العلوي كان معيبًا وأعيد تشغيل ملف

عدة مرات في اليوم. يجب أن تلاحظ الفجوات في الرسم البياني أدناه.

مقارنة الرسم البياني لاستخدام وحدة المعالجة المركزية قبل وبعد

عندما حدث هذا ، بدأت ExaZK في الإشارة إلى مثيل MySQL مباشر وعمل بطريقة HA. في النهاية ، استبدلنا مفتاح الشبكة المعيب بمفتاح جديد وبدأنا في الحصول على وقت تشغيل بنسبة 100٪

في الوقت الحالي ، يعمل موقعنا على الويب كما هو موضح في لقطة الشاشة أدناه.

تحقق لقطة شاشة من وقت التشغيل تظهر قرب وقت تشغيل 100٪

تحسينات في خارطة الطريق:

قم بتخزين ملفات JSON للترجمة المؤقتة مباشرة في المتصفح لتحويل التحميل إلى جانب العميل.

قم بتنفيذ GeoDNS لاختيار أقرب موقع من خلال عنوان IP المصدر للعميل. تم اختبار هذا بالفعل في بيئة التطوير الخاصة بنا ، ولكن في انتظار إصدار مستقر من PowerDNS 4.2.

في المستقبل ، نود تنفيذ Anycast الإقليمي مع GeoDNS لتجاوز الفشل على مركز بيانات مباشر في حالة الفشل. واحدة عالمية Anycast plus بادئة مخصصة. كلاهما عبارة عن بادئات متداخلة تسمح بتجاوز فشل سلس إذا تعطلت منطقة واحدة تمامًا. على سبيل المثال ، يستجيب خادم GeoDNS الخاص بك لسجل CNAME بعنوان IP 2A02: 4780: C3 :: 1 لمحلل CDN وفي تلك اللحظة تكون هذه المنطقة معطلة. سيتم إعادة توجيه الاتصالات الجديدة إلى أقصر AS-PATH PoP بسبب شبكة Anycast العالمية المتداخلة.

Leave a comment

Your email address will not be published. Required fields are marked *