من الحياة مع Kubernetes: كيف أزلنا DBMS (وليس فقط) من بيئات المراجعة إلى الثابتة



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

يمكن أن يكون استخدام بيئات المراجعة في CI / CD مفيدًا للغاية ، لكل من المطورين ومهندسي النظام. لنقم أولاً بمزامنة الأفكار العامة عنها:

  1. يمكن إنشاء بيئات المراجعة من فروع منفصلة في مستودعات Git المحددة من قبل المطورين (ما يسمى بفروع الميزات).
  2. يمكن أن يكون لديهم مثيلات DBMS منفصلة ومعالجات الطابور وخدمات التخزين المؤقت وما إلى ذلك. - بشكل عام ، كل شيء للاستنساخ الكامل لبيئة الإنتاج.
  3. إنها تسمح بالتطوير الموازي ، مما يسرع بشكل كبير في إصدار الميزات الجديدة في التطبيق. في الوقت نفسه ، قد تكون هناك حاجة لعشرات من هذه البيئات كل يوم ، وهذا هو السبب في أن سرعة إنشائها أمر بالغ الأهمية.

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

* بالمناسبة ، على وجه التحديد حول مقالب قاعدة البيانات الكبيرة في هذا السياق ، كتبنا بالفعل في المادة حول تسريع قاعدة بيانات bootstrap .)

المشكلة وطريقة حلها


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

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

من وجهة نظر التنفيذ ، تتلخص المشكلة الرئيسية في ضمان idempotency عند إنشاء وحذف بيئات المراجعة. لتحقيق ذلك ، قمنا بتغيير آلية إنشاء بيئات المراجعة من خلال ترحيل خدمات PostgreSQL و MongoDB و RabbitMQ أولاً إلى بيئة ثابتة. يشير "ثابت" إلى بيئة "دائمة" لن يتم إنشاؤها بناءً على طلب المستخدم (كما هو الحال مع بيئات المراجعة).

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

إذن ، تسلسل الإجراءات في التنفيذ:

  • عند إنشاء بيئة مراجعة ، يجب أن يحدث ما يلي مرة واحدة: إنشاء قواعد بيانات في قاعدتي DBMS (MongoDB و PostgreSQL) ، واستعادة قواعد البيانات من نسخة احتياطية / قالب ، وإنشاء vhost في RabbitMQ. سيتطلب ذلك طريقة مناسبة لتحميل مقالب التيار. (إذا كانت لديك بيئات مراجعة من قبل ، فمن المرجح أن لديك بالفعل حل جاهز لهذا.)
  • بعد الانتهاء من بيئة المراجعة ، يجب حذف قاعدة البيانات والمضيف الظاهري في RabbitMQ.

في حالتنا ، تعمل البنية التحتية في إطار Kubernetes (باستخدام Helm). لذلك ، لتنفيذ المهام المذكورة أعلاه ، كانت خطافات هيلم ممتازة . يمكن إجراؤها قبل إنشاء جميع المكونات الأخرى في إصدار Helm و / أو بعد إزالتها. وبالتالي:

  • لمهمة التهيئة ، سنستخدم ربطًا pre-installلتشغيله قبل إنشاء جميع الموارد في الإصدار ؛
  • لمهمة الحذف ، ربط post-delete.

دعنا ننتقل إلى تفاصيل التنفيذ.

التنفيذ العملي


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

فيما يلي قائمة بـ PostgreSQL ، والاثنان الآخران (MongoDB و RabbitMQ) متطابقان في البنية الظاهرة:

{{- if .Values.global.review }}
---
apiVersion: batch/v1
kind: Job
metadata:
  name: db-create-postgres-database
  annotations:
    "helm.sh/hook": "pre-install"
    "helm.sh/hook-weight": "5"
spec:
  template:
    metadata:
      name: init-db-postgres
    spec:
      volumes:
      - name: postgres-scripts
        configMap:
          defaultMode: 0755
          name: postgresql-configmap
      containers:
      - name: init-postgres-database
        image: private-registry/postgres 
        command: ["/docker-entrypoint-initdb.d/01-review-load-dump.sh"]
        volumeMounts:
        - name: postgres-scripts
          mountPath: /docker-entrypoint-initdb.d/01-review-load-dump.sh
          subPath: review-load-dump.sh
        env:
{{- include "postgres_env" . | indent 8 }}
      restartPolicy: Never
{{- end }}

التعليقات على محتويات البيان:

  1. Job review-. review CI/CD Helm- (. if .Values.global.review ).
  2. Job — , ConfigMap. , , . , hook-weight.
  3. cURL , PostgreSQL, .
  4. PostgreSQL : , shell- .

PostgreSQL


الأكثر إثارة للاهتمام هو في البرنامج النصي shell ( review-load-dump.sh) المذكور بالفعل في القائمة . ما هي الخيارات العامة لاستعادة قاعدة بيانات في PostgreSQL؟

  1. استرداد "قياسي" من النسخ الاحتياطي ؛
  2. الانتعاش باستخدام القوالب .

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

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

---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: update-postgres-template
spec:
  schedule: "50 4 * * *"
  concurrencyPolicy: Forbid
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 3
  startingDeadlineSeconds: 600
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: Never
          imagePullSecrets:
          - name: registrysecret
          volumes:
          - name: postgres-scripts
            configMap:
              defaultMode: 0755
              name: postgresql-configmap-update-cron
          containers:
          - name: cron
            command: ["/docker-entrypoint-initdb.d/update-postgres-template.sh"]
          image: private-registry/postgres 
            volumeMounts:
            - name: postgres-scripts
              mountPath: /docker-entrypoint-initdb.d/update-postgres-template.sh
              subPath: update-postgres-template.sh
            env:
{{- include "postgres_env" . | indent 8 }}

من المحتمل ألا يكون بيان ConfigMap الكامل الذي يحتوي على البرنامج النصي منطقيًا (قم بالإبلاغ في التعليقات إذا لم يكن الأمر كذلك). بدلاً من ذلك ، سأقدم أهم شيء - نص باش:

#!/bin/bash -x

CREDENTIALS="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}/postgres"

psql -d "${CREDENTIALS}" -w -c "REVOKE CONNECT ON DATABASE ${POSTGRES_DB_TEMPLATE} FROM public"
psql -d "${CREDENTIALS}" -w -c "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '${POSTGRES_DB_TEMPLATE}'"

curl --fail -vsL ${HOST_FORDEV}/latest_${POSTGRES_DB_STAGE}.psql -o /tmp/${POSTGRES_DB}.psql

psql -d "${CREDENTIALS}" -w -c "ALTER DATABASE ${POSTGRES_DB_TEMPLATE} WITH is_template false allow_connections true;"
psql -d "${CREDENTIALS}" -w -c "DROP DATABASE ${POSTGRES_DB_TEMPLATE};" || true
psql -d "${CREDENTIALS}" -w -c "CREATE DATABASE ${POSTGRES_DB_TEMPLATE};" || true
pg_restore -U ${POSTGRES_USER} -h ${POSTGRES_HOST} -w -j 4 -d ${POSTGRES_DB_TEMPLATE} /tmp/${POSTGRES_DB}.psql

psql -d "${CREDENTIALS}" -w -c "ALTER DATABASE ${POSTGRES_DB_TEMPLATE} WITH is_template true allow_connections false;"

rm -v /tmp/${POSTGRES_DB}.psql

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

تحول البيان الذي يحتوي على نص برمجي لاستعادة قاعدة البيانات على النحو التالي:

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: postgresql-configmap
  annotations:
    "helm.sh/hook": "pre-install"
    "helm.sh/hook-weight": "1"
    "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
data:
  review-load-dump.sh: |
    #!/bin/bash -x
    
 
 
    CREDENTIALS="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}/postgres"

    if [ "$( psql -d "${CREDENTIALS}" -tAc "SELECT CASE WHEN EXISTS (SELECT * FROM pg_stat_activity WHERE datname = '${POSTGRES_DB}' LIMIT 1) THEN 1 ELSE 0 END;" )" = '1' ]
      then
          echo "Open connections has been found in ${POSTGRES_DB} database, will drop them"
          psql -d "${CREDENTIALS}" -c "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '${POSTGRES_DB}' -- AND pid <> pg_backend_pid();"
      else
          echo "No open connections has been found ${POSTGRES_DB} database, skipping this stage"
    fi

    psql -d "${CREDENTIALS}" -c "DROP DATABASE ${POSTGRES_DB}"

    if [ "$( psql -d "${CREDENTIALS}" -tAc "SELECT 1 FROM pg_database WHERE datname='${POSTGRES_DB}'" )" = '1' ]
      then
          echo "Database ${POSTGRES_DB} still exists, delete review job failed"
          exit 1
      else
          echo "Database ${POSTGRES_DB} does not exist, skipping"
    fi


    psql ${CREDENTIALS} -d postgres -c 'CREATE DATABASE ${POSTGRES_DB} TEMPLATE "loot-stage-copy"'

يبدو أنهم متورطون هنا hook-delete-policy. تفاصيل تطبيق هذه السياسات مكتوبة هنا . نستخدم في البيان المعين before-hook-creation,hook-succeededالذي يسمح بالوفاء بالمتطلبات التالية: حذف الكائن السابق قبل إنشاء خطاف جديد وحذفه فقط عند نجاح الخطاف.

سنحذف قاعدة البيانات في ConfigMap:

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: postgresql-configmap-on-delete
  annotations:
    "helm.sh/hook": "post-delete, pre-delete"
    "helm.sh/hook-weight": "1"
    "helm.sh/hook-delete-policy": before-hook-creation
data:
  review-delete-db.sh: |
    #!/bin/bash -e

    CREDENTIALS="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}/postgres"

    psql -d "${CREDENTIALS}" -w postgres -c "DROP DATABASE ${POSTGRES_DB}"

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

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

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

في هذه الحالة ، سيصبح البرنامج النصي للاسترداد كالتالي:

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: postgresql-configmap
  annotations:
    "helm.sh/hook": "pre-install"
    "helm.sh/hook-weight": "1"
    "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
data:
  review-load-dump.sh: |
    #!/bin/bash -x

    CREDENTIALS="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}/postgres"
    psql -d "${CREDENTIALS}" -w -c "DROP DATABASE ${POSTGRES_DB}" || true
    psql -d "${CREDENTIALS}" -w -c "CREATE DATABASE ${POSTGRES_DB}"

    curl --fail -vsL ${HOST_FORDEV}/latest_${POSTGRES_DB_STAGE}.psql -o /tmp/${POSTGRES_DB}.psql

    psql psql -d "${CREDENTIALS}" -w -c "CREATE EXTENSION ip4r;"
    pg_restore -U ${POSTGRES_USER} -h ${POSTGRES_HOST} -w -j 4 -d ${POSTGRES_DB} /tmp/${POSTGRES_DB}.psql
    rm -v /tmp/${POSTGRES_DB}.psql

يتوافق الإجراء مع ما سبق وصفه أعلاه. التغيير الوحيد هو إزالة ملف psql بعد إضافة كل العمل.

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

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

مونغودب


المكون التالي هو MongoDB. تتمثل الصعوبة الرئيسية في أنه بالنسبة لنظام DBMS هذا ، فإن خيار نسخ قاعدة البيانات (كما هو الحال في PostgreSQL) موجود نسبيًا ، لأنه:

  1. هو في حالة موقوفة .
  2. وفقًا لنتائج اختباراتنا ، لم نجد فرقًا كبيرًا في وقت استرداد قاعدة البيانات مقارنة بالعادة المعتادة mongo_restore. ومع ذلك ، ألاحظ أنه تم إجراء الاختبار كجزء من مشروع واحد - في حالتك ، يمكن أن تكون النتائج مختلفة تمامًا.

اتضح أنه في حالة وجود قاعدة بيانات كبيرة ، يمكن أن تنشأ مشكلة خطيرة: نحن نوفر الوقت لاستعادة قاعدة البيانات في PgSQL ، ولكن في نفس الوقت ، نستعيد التفريغ في مونغو لفترة طويلة جدًا. في وقت كتابة هذا التقرير ، وفي إطار البنية التحتية الحالية ، رأينا ثلاث طرق (بالمناسبة ، يمكن دمجها):

  1. يمكن أن يستغرق الاسترداد وقتًا طويلاً ، على سبيل المثال ، إذا كان نظام إدارة قواعد البيانات (DBMS) الخاص بك موجودًا على نظام ملفات الشبكة (للحالات التي لا توجد بها بيئة إنتاج). ثم يمكنك ببساطة نقل DBMS من المرحلة إلى عقدة منفصلة واستخدام التخزين المحلي. نظرًا لأن هذا ليس إنتاجًا ، فإن سرعة إنشاء مراجعة أكثر أهمية بالنسبة لنا.
  2. يمكنك نقل كل مهمة استرداد إلى لوحة منفصلة ، مما يسمح لك بتنفيذ عمليات الترحيل والعمليات الأخرى التي تعتمد على تشغيل نظام إدارة قواعد البيانات (DBMS) مسبقًا. لذا فإننا نوفر الوقت من خلال إكمالها مسبقًا.
  3. في بعض الأحيان يمكنك تقليل حجم التفريغ عن طريق حذف البيانات القديمة / غير ذات الصلة - إلى الحد الذي يكفي لترك بنية قاعدة البيانات فقط. بالطبع ، هذا ليس للحالات التي تتطلب تفريغ كامل (على سبيل المثال ، لمهام اختبار ضمان الجودة).

إذا لم تكن بحاجة إلى إنشاء بيئات مراجعة بسرعة ، فيمكن تجاهل جميع الصعوبات الموصوفة.

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

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: mongodb-scripts-on-delete
  annotations:
    "helm.sh/hook": "post-delete, pre-delete"
    "helm.sh/hook-weight": "1"
    "helm.sh/hook-delete-policy": before-hook-creation
data:
  review-delete-db.sh: |
    #!/bin/bash -x

    mongo ${MONGODB_NAME} --eval "db.dropDatabase()" --host ${MONGODB_REPLICASET}/${MONGODB_HOST}
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: mongodb-scripts
  annotations:
    "helm.sh/hook": "pre-install"
    "helm.sh/hook-weight": "1"
    "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
data:
  review-load-dump.sh: |
    #!/bin/bash -x

    curl --fail -vsL ${HOST_FORDEV}/latest_${MONGODB_NAME_STAGE}.gz -o /tmp/${MONGODB_NAME}.gz

    mongo ${MONGODB_NAME} --eval "db.dropDatabase()" --host ${MONGODB_REPLICASET}/${MONGODB_HOST}
    mongorestore --gzip --nsFrom "${MONGODB_NAME_STAGE}.*" --nsTo "${MONGODB_NAME}.*" --archive=/tmp/${MONGODB_NAME}.gz --host ${MONGODB_REPLICASET}/${MONGODB_HOST}

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

بالنسبة إلى MongoDB ، نحذف أيضًا قاعدة البيانات قبل إنشاء المراجعة - يتم ذلك لنفس الأسباب كما في PostgreSQL.

فارق بسيط آخر: نظرًا لأن قاعدة البيانات للمراجعة موجودة في نفس بيئة المرحلة ، يلزم وجود اسم منفصل لقاعدة البيانات المستنسخة. إذا لم يكن ملف التفريغ ملف BSON ، فسيحدث الخطأ التالي:

the --db and --collection args should only be used when restoring from a BSON file. Other uses are deprecated and will not exist in the future; use --nsInclude instead

ولذلك، في المثال أعلاه، --nsFromو تستخدم --nsTo.

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

Rabbitmq


كان التطبيق الأخير في قائمة متطلباتنا هو RabbitMQ. الأمر سهل للغاية: تحتاج إلى إنشاء vhost جديد نيابة عن المستخدم الذي سيتصل به التطبيق. ثم قم بحذفه.

بيان لإنشاء وإزالة vhosts:

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: rabbitmq-configmap
  annotations:
    "helm.sh/hook": "pre-install"
    "helm.sh/hook-weight": "1"
    "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
data:
  rabbitmq-setup-vhost.sh: |
    #!/bin/bash -x

    /usr/local/bin/rabbitmqadmin -H ${RABBITMQ_HOST} -u ${RABBITMQ_USER} -p ${RABBITMQ_PASSWORD} declare vhost name=${RABBITMQ_VHOST}
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: rabbitmq-configmap-on-delete
  annotations:
    "helm.sh/hook": "post-delete, pre-delete"
    "helm.sh/hook-weight": "1"
    "helm.sh/hook-delete-policy": before-hook-creation
data:
  rabbitmq-delete-vhost.sh: |
    #!/bin/bash -x

    /usr/local/bin/rabbitmqadmin -H ${RABBITMQ_HOST} -u ${RABBITMQ_USER} -p ${RABBITMQ_PASSWORD} delete vhost name=${RABBITMQ_VHOST}

مع صعوبات كبيرة في RabbitMQ نحن (حتى الآن؟) لم نواجه. بشكل عام ، يمكن تطبيق نفس النهج على أي خدمات أخرى ليس لها ارتباط حاسم للبيانات.

سلبيات


لماذا لا يدعي هذا القرار أنه "أفضل الممارسات"؟

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

لم يكن من الممكن حل هاتين المشكلتين بشكل كامل ، مع الأخذ في الاعتبار قدرات البنية التحتية لمشروع معين ، ومع ذلك ، يمكن تقليل الضرر المحتمل عن طريق التجميع (إضافة عقد جديدة) والتحجيم الرأسي.

استنتاج


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

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

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

ملاحظة


اقرأ أيضا في مدونتنا:


All Articles