Kafka-backup: دعم النسخ الاحتياطية في الوقت المناسب

تم إنشاؤها على ٨ أبريل ٢٠٢٠  ·  13تعليقات  ·  مصدر: itadventurer/kafka-backup

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

enhancement help wanted

ال 13 كومينتر

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

56: اذا:

تضمين التغريدة

النسخ الاحتياطي هو نشاط يعمل باستمرار.

يفترض هذا الدفق المستمر للبيانات 24 × 7 × 365 ، وهذا لا ينطبق على جميع الحالات. في حالتنا ، يتم تشغيل البث لمدة X ساعة في اليوم فقط ، ولا يحدث النسخ الاحتياطي إلا بعد ذلك ويقصد به في الواقع أن يكون نسخة احتياطية يومية / لقطة من البيانات.

أعتقد أنه يجب أن تكون هناك طريقة (داخليًا) لاكتشاف أنه لم تكن هناك أي رسائل جديدة لمدة X من الوقت (ربما يكون الفاصل الزمني القابل للتكوين) وبعد ذلك سيتم إنهاء عملية النسخ الاحتياطي بأمان وبالتالي إنهاء العملية.

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

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

ما يمكنك فعله في حالتك:

  • دع كافكا النسخ الاحتياطي يعمل في الخلفية
  • يقوم كافكا باك أب بكتابة البيانات بشكل مستمر في الخلفية لنظام الملفات
  • kill -9 كافكا النسخ الاحتياطي بمجرد "الانتهاء" ، أي أنه انتهى من كتابة بياناتك. يجب أن يتم ذلك على الفور بعد الانتهاء من إنتاج البيانات
  • نقل بيانات كافكا النسخ الاحتياطي إلى وجهتك الجديدة.

أفهم أن هذه حالة استخدام شائعة تمامًا وسأقدم المزيد من الوثائق لذلك مع # 2. بالنسبة لـ v0.1 ، التوثيق هو آخر مشكلة كبيرة ، لذا نأمل أن يحدث هذا قريبًا ؛)


أرى اتباع النهج

  • # 54 يقدم أداة CLI مستقلة جديدة. يجب أن تدعم أداة CLI هذا.
  • نضيف علامة جديدة --snapshot إلى أداة CLI (أو أضف أداة جديدة تسمى backup-snapshot.sh )

كيفية اكتشاف "انتهاء" النسخ الاحتياطي (ينطبق فقط إذا تم تعيين العلم --snapshot ):

  • نتذكر الوقت الذي بدأ فيه النسخ الاحتياطي. يتم تجاهل كافة السجلات التي تحتوي على طابع زمني أحدث أثناء النسخ الاحتياطي
  • عندما لا ينتج القسم أي بيانات جديدة لبعض الوقت (على سبيل المثال 20 ثانية) ، نفترض أنه لا توجد بيانات جديدة

ماذا تعتقد؟

دع كافكا النسخ الاحتياطي يعمل في الخلفية

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

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

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

عندما لا ينتج القسم أي بيانات جديدة لبعض الوقت (على سبيل المثال 20 ثانية) ، نفترض أنه لا توجد بيانات جديدة

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

في الواقع أردت أن أكتب أن هذا شبه مستحيل مع كافكا ، لكن أثناء الكتابة خطرت لي فكرة عن حل:

يُرجع kafka-consumer-groups الموقع الحالي للمستهلك في القسم ، ولكن الأكثر إثارة للاهتمام أنه يُرجع الإزاحة النهائية الحالية لكل قسم معين. هذا يعني أن هناك طريقة للحصول على أحدث إزاحة لقسم في وقت معين. ليس لدي أي فكرة حاليًا عن كيفية تحقيق ذلك (أحتاج إلى التحقق من الكود).

لذلك يوجد الآن مسار واضح لكيفية عمل نسخة احتياطية (أكثر أو أقل) في الوقت المناسب:

  1. احصل على إزاحة نهاية القسم لكل قسم يتم نسخه احتياطيًا (في مكان ما هنا: https://github.com/itadventurer/kafka-backup/blob/master/src/main/java/de/azapps/kafkabackup/sink /BackupSinkTask.java#L81)
  2. تستهلك كل قسم
  3. بمجرد أن يحتوي السجل المستهلك على تعويض >= ، تذكر ذلك المحفوظ لهذا القسم. تجاهل كافة السجلات في النسخة الاحتياطية. (انظر https://github.com/itadventurer/kafka-backup/blob/master/src/main/java/de/azapps/kafkabackup/sink/BackupSinkTask.java#L63)
  4. بمجرد تحديث جميع الأقسام ، اطبع رسالة إلى STDOUT
  5. استخدم البرنامج النصي المجمع لاكتشاف هذه الرسالة وقتل kafka connect بأمان. على غرار كيفية حلها أثناء الاستعادة: https://github.com/itadventurer/kafka-backup/blob/master/bin/restore-standalone.sh#L232 -L252

ترى أن هذا ليس تافهًا حقًا.

ينصب تركيزي الحالي على تحسين مجموعة الاختبار واستقرار برنامج Kafka Backup للإصدار الأول (انظر https://github.com/itadventurer/kafka-backup/milestone/1). لا يمكنني إعطائك الوقت المقدر للوصول لهذه الميزة. سأكون أكثر من سعيد لمراجعة العلاقات العامة لذلك (وأنا أيضًا أبحث عن مشرفين إضافيين ؛)) يسعدني تقديم المساعدة إذا كانت هناك أي أسئلة

ترى أن هذا ليس تافهًا حقًا.

أنا أكثر في جانب العمليات من الأشياء (مثل الإعداد ، ومراقبة مجموعات كافكا ، إلخ). لذلك أنا أثق بك في هذا الجزء. وجهة نظري هي أنه من جانبي عملي ، هذا شيء أحتاجه (ومن المؤكد أن كثيرين آخرين).

سأكون أكثر من سعيد لمراجعة العلاقات العامة لذلك (وأنا أيضًا أبحث عن مشرفين إضافيين ؛))

أنا لست رائعًا مع Java / Scala لأكون عونًا كثيرًا هنا. إذا كانت لغة Python أو C / C ++ أو على الأقل Go يمكنني المساعدة: P

أهلا!
في البداية - أنا سعيد لأنني وجدت الحل الخاص بك ، لأنه لا بد لي من الاحتفاظ بنسخة احتياطية من بيانات موضوع الكافكة
في الثانية - لسوء الحظ لم أتمكن من كتابة أي شيء في Java / Scala ، لذلك أعددت "المجمع" من أجلك "backup-standalone.sh" باستخدام python للحصول على حل النسخ الاحتياطي الكامل
https://gist.github.com/FloMko/7adf2e00cd80fe7cc88bb587cde999ce
سيكون من الجيد رؤية أي تحديثات حول أي دعم مضمن للنسخ الاحتياطي في وقت واحد

مهلا،
شكرا لك على عملك! كحل مؤقت ، يمكنني أن أتخيل إضافة هذا كبرنامج نصي إضافي إلى هذا الريبو واستبداله لاحقًا بحل مدمج. لا تتردد في إضافة هذا كطلب سحب :) (إلى ./bin/kafka-backup-point-in-time.py أو أي شيء آخر ؛))

أنا على وشك نشر تطبيق منفصل تمامًا مكتوب في Go لا يعتمد على Connect API. لمعلوماتك فقط. نحن نستخدمه بالفعل في بيئة الإنتاج لدينا.

akamensky هل يمكنك مشاركة الحل الخاص بك؟ بقدر ما اختبرت الحل الخاص بك ، فسيكون ذلك جيدًا

FloMko نشرناه للتو. يمكنك العثور عليه (بالإضافة إلى ثنائي معاد بناؤه) هنا

شكرًا لك WesselVS على PR # 99! لقد دمجتها للتو لإتقانها. سيتم إصدار هذا التحسين وبعض الإصلاحات الأخرى قريبًا.

تضمين التغريدة من الرائع رؤية المزيد من الأعمال المتعلقة بنسخ كافكا الاحتياطية ؛)

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

huyngopt1994 picture huyngopt1994  ·  5تعليقات

jay7x picture jay7x  ·  16تعليقات

ipochi picture ipochi  ·  3تعليقات

jay7x picture jay7x  ·  15تعليقات

itadventurer picture itadventurer  ·  5تعليقات