سؤال

تثبيت واحد لمخازن منتجاتنا هو التكوين في مجموعة من جداول قاعدة البيانات.

لا شيء من المنشآت "تعرف" عن أي تثبيت آخر.

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

نحصل الآن على طلبات للحصول على استراتيجية أكثر سلسة لتقاسم البيانات العالمية، ولكن لا تزال تسمح بالتعديلات المحلية.

إذا لم يكن الكثير من التعديلات المحلية، فيمكننا استخدام ميزات النسخ المتماثل للبيانات Oracle.

نظرا لمتطلبات HA التي لها كل التكوين في قاعدة البيانات الواحدة ليست خيارا.

هل واجه أي شخص آخر هذه المشكلة وأحبك من أي وقت مضى حل برمجي جيد لهذا؟ تعرف من أي أوراق جيدة قد تصف حلا جزئيا أو كامل؟

نحن * NIX القائم على Oracle. يجب نسخ التغييرات إلى جميع العقد بسرعة كبيرة (ثانية أو 2).

هل كانت مفيدة؟

المحلول

لست متأكدا من مدى قدر الإمكان لتغيير الطريقة التي تتعامل بها مع تكوينك، لكننا نفذنا شيئا مشابها بهذا باستخدام فكرة التجاوزات المحلية. على وجه التحديد، لديك طاولان التكوين متطابقين (اتصل بهم Centralconfig و LocalConfig). يتم الاحتفاظ CentralConfig في الموقع المركزي، وتكررت إلى مواقع الأقمار الصناعية الخاصة بك، حيث يتم قراءته فقط. يمكن إعداد LocalConfig في الموقع المحلي. الإجراء الخاص بك الذي استفسار بيانات التكوين يبحث أولا عن البيانات في جدول LocalConfig، وإذا لم يتم العثور عليه، يسترجعه من جدول CentralConfig.

على سبيل المثال، إذا كنت تحاول القيام بذلك مع القيم في جدول المعلمة V $، فيمكنك الاستعلام عن التكوين الخاص بك باستخدام وظيفة First_Value في Analytics SQL:

  SELECT DISTINCT
         NAME
       , FIRST_VALUE(VALUE) OVER(PARTITION BY NAME 
                                     ORDER BY localsort
                                ) VALUE
    FROM (SELECT t.*
               , 0 localsort
            FROM local_parameter t
           UNION
          SELECT t.*
               , 1 localsort
            FROM v$parameter t
         )
ORDER BY NAME;

يعد عمود LocalSort في النقابات فقط للتأكد من أن قيم Local_Parameter تأخذ الأسبقية على قيم المعلمة V $.

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

CONTEXT       NAME    VALUE
------------- ------- -----
Comp Engine A timeout    15
Comp Engine B timeout    10
Comp Engine % timeout     5
%             timeout    30

يقول التكوين أعلاه، بالنسبة لجميع المكونات، استخدم مهلة 30، ولكن بالنسبة لمحركات شركات من أي نوع، استخدم مهلة 5، ولكن لمحركات شركات A & B، استخدم 15 و 10 على التوالي. قد يتم الحفاظ على آخر التكوينات في CentralConfig، ولكن قد يتم الحفاظ على اثنين آخرين في LocalConfig، وستحل الإعدادات بهذه الطريقة:

  SELECT DISTINCT
         NAME
       , FIRST_VALUE(VALUE) OVER(PARTITION BY NAME 
                                     ORDER BY (TRANSLATE(Context
                                                        , '%_'
                                                        , CHR(1) || CHR(2)
                                              ) DESC
                                            , localsort
                                ) VALUE
    FROM (SELECT t.*
               , 0 localsort
            FROM LocalConfig t
           WHERE 'Comp Engine A' LIKE Context
           UNION
          SELECT t.*
               , 1 localsort
            FROM CentralConfig t
           WHERE 'Comp Engine A' LIKE Context
         )
ORDER BY NAME;

إنه في الأساس نفس الاستعلام، إلا أنني أدرج أن يترجم التعبير قبل بلدي Localsort وأنا أقيد على السياق. ما تفعله هو تحويل الأحرف٪ و _ إلى Chr (1) و CHR (2)، والذي سيجعلها فرز بعد أحرف أبجدية رقمية في الترتيب التنازلي. وبهذه الطريقة، سيأتي "EXC Engine A" بشكل صريح قبل "Comp Engine٪"، والتي بدورها ستأتي قبل "٪". في الحالات التي يتم فيها تحديد السياقات بشكل ملحى، فإن التكوين المحلي يأخذ الأسبقية على المركزي؛ إذا كنت ترغب في ترامب المحلي دائما المركزية، حتى في الحالات عندما تم استبدال المركزية بإحكام، فستظهر فقط مناصب شروط الفرز.

نصائح أخرى

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top