موازنة تحميل قاعدة البيانات

الأمر الأكثر أهمية لضمان سير العمليات بسلاسة في التجارة الإلكترونية

تأكد الفريق من تحقيق المرونة، التكرار، القابلية للتوسّع، تكامل البيانات، 99.9٪ وقت تشغيل، 0.01٪ وقت توقف، سرعة في حل المشكلات وتحكم ممتاز في تدفق عبء العمل.

مع الأخذ في الاعتبار إعدادات قواعد البيانات الكبيرة، استخدم فريق Spurtcommerce في حل التجارة الإلكترونية استراتيجية "النسخ" لضمان تمرير البيانات إلى خادم آخر. هذا الخادم عادةً ما يكون جهازًا فعليًا ثانويًا يستورد البيانات من الخادم الرئيسي (الناشر). التكوين هو إعداد "رئيسي-ثانوي" حيث قاعدة البيانات الرئيسية هي جهاز التخزين الأصلي والثانوي يستقبل البيانات المكررة. تتطلب تكوينات النسخ أن يكون لديك خادمان مختلفان لقواعد البيانات. يشرح هذا المقال فوائد النسخ وكيف تم إعداده في بيئة قاعدة بيانات Spurtcommerce.

لماذا استخدمنا النسخ في Spurtcommerce؟

في Spurtcommerce، وهو حل مفتوح المصدر مبني على NodeJS وAngular، استخدمنا أفضل المنهجيات لتحسين ميزة تحميل الصور. لقد قمنا بتحسين العملية بالكامل حتى تكون سريعة وتمنع تأخر عرض المنتج على الزوار.

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

ثانيًا، الأداء يتحسن فعليًا بالرغم من أن التعقيد قد يوحي بأنه سيتدهور. عندما يتم توزيع البيانات عبر خوادم متعددة، يمكنك ربط تطبيقات مختلفة بكل خادم لتحسين الأداء. هذا هو الأسلوب المتبع غالبًا في مراكز البيانات – حيث يتم ربط المستخدم بأقرب خادم لتقليل زمن الاستجابة.

تستخدم معظم الشركات جداول قواعد بيانات معاملاتية، مما يعني أن محرك التخزين المفضل هو InnoDB. باستخدام النسخ، يتم تسجيل عمليات الالتزام (commit) أولًا عبر الشبكة بدلًا من الكتابة إلى القرص الصلب كما في الخوادم الفردية، مما يُحسّن الأداء بشكل كبير.

النسخ أيضًا يُعد نوعًا من النسخ الاحتياطي لقواعد البيانات عند الكوارث، وهو أكثر كفاءة من حفظ البيانات على الأقراص. باستخدام النسخ، يمكنك استعادة الخادم الرئيسي بالبيانات المنسوخة بدلًا من البحث في ملفات النسخ الاحتياطي.

الإعداد الأساسي هو رئيسي-ثانوي، حيث يتولى الخادم الرئيسي عمليات الكتابة، بينما الخادم الثانوي يقرأ البيانات إلى قاعدة بيانات معكوسة. يمكن أيضًا إعداد تكوين رئيسي-رئيسي، لكنه مخصص للمنصات المؤسسية المتقدمة. في هذا التكوين، تتم موازنة الحمل بين المعاملات المختلفة، حيث يوزع موازن التحميل الطلبات على قاعدة البيانات القادرة على تنفيذ المعاملة بأفضل أداء.

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

بهذه الطريقة، خطط فريق Spurtcommerce لموازنة تحميل قاعدة البيانات بشكل مثالي في حل التجارة الإلكترونية مفتوح المصدر الخاص بهم، لدعم ثلاث قواعد بيانات -MySQL, PostgresSQL and SQL Server.

تكوين عميق


{
  replication: {
    master: {
      host: "server1",
      port: 3306,
      username: "test",
      password: "test",
      database: "test"
    },
    slaves: [{
      host: "server2",
      port: 3306,
      username: "test",
      password: "test",
      database: "test"
    }, {
      host: "server3",
      port: 3306,
      username: "test",
      password: "test",
      database: "test"
    }],

    /**
    * If true, PoolCluster will attempt to reconnect when connection fails. (Default: true)
    */
    canRetry: true,

    /**
     * If connection fails, node's errorCount increases.
     * When errorCount is greater than removeNodeErrorCount, remove a node in the PoolCluster. (Default: 5)
     */
    removeNodeErrorCount: 5,

    /**
     * If connection fails, specifies the number of milliseconds before another connection attempt will be made.
     * If set to 0, then node will be removed instead and never re-used. (Default: 0)
     */
     restoreNodeTimeout: 0,

    /**
     * Determines how slaves are selected:
     * RR: Select one alternately (Round-Robin).
     * RANDOM: Select the node by random function.
     * ORDER: Select the first node available unconditionally.
     */
    selector: "RR"
  }
}