Kafka-backup: Mendukung pencadangan tepat waktu

Dibuat pada 8 Apr 2020  ·  13Komentar  ·  Sumber: itadventurer/kafka-backup

Ini adalah alat satu kali (artinya tidak perlu berjalan di latar belakang setelah pencadangan selesai), jadi ketergantungan pada proses daemon latar belakang lucu. Tidak perlu menjalankan kafka-connect sebagai daemon sama sekali.

enhancement help wanted

Semua 13 komentar

Anda benar mengenai prosedur pemulihan. Memulihkan adalah kegiatan satu kali.
Pencadangan adalah aktivitas yang terus berjalan. Tidak ada "Saya selesai melakukan pencadangan" di Kafka karena data Kafka adalah aliran dan tidak ada akhirnya. Tentu, Anda dapat berasumsi bahwa jika Anda tidak mendapatkan data baru selama x detik, Anda "selesai" tetapi Anda tidak dapat menggeneralisasinya.
Lihat #46 dan #54 untuk lebih lanjut

56: maka:

@itapetualang

Pencadangan adalah aktivitas yang terus berjalan.

Ini mengasumsikan aliran data berkelanjutan 24x7x365, yang tidak berlaku untuk semua kasus. Dalam kasus kami, streaming hanya berjalan selama X jam per hari, pencadangan hanya terjadi setelah itu dan sebenarnya dimaksudkan sebagai pencadangan/snapshot data harian.

Saya pikir harus ada cara untuk (secara internal) mendeteksi bahwa belum ada pesan baru untuk jumlah waktu X (mungkin interval yang dapat dikonfigurasi) setelah itu proses pencadangan akan keluar dengan anggun dan dengan demikian menghentikan proses.

Alternatif lain (mungkin lebih sederhana) untuk ini adalah hanya mencadangkan pesan hingga stempel waktu saat pencadangan dimulai. Tidak yakin bagaimana ini akan bermain bersama dengan mencadangkan offset. Mungkin offset cadangan pertama, lalu kita tahu stempel waktu di mana kita mencadangkan offset dan kita bisa mencadangkan pesan hingga stempel waktu itu.

Saya mengerti maksud Anda. Ya, mungkin akan menyenangkan memiliki cara untuk melakukan pencadangan tepat waktu :berpikir:
Padahal, ini tidak sepele karena tidak ada cara mudah untuk memutuskan apakah aliran "selesai".

Apa yang dapat Anda lakukan dalam kasus Anda:

  • Biarkan Cafka Backup berjalan di latar belakang
  • Kafka Backup menulis data secara terus menerus di latar belakang ke sistem file
  • kill -9 Kafka Backup segera setelah "selesai", yaitu selesai menulis data Anda. Ini harus segera setelah Anda selesai menghasilkan data
  • pindahkan data Kafka Backup ke tujuan baru Anda.

Saya mengerti bahwa ini adalah kasus penggunaan yang cukup umum dan saya akan memberikan lebih banyak dokumentasi untuk itu dengan #2. Untuk Dokumentasi v0.1 adalah masalah besar terakhir jadi semoga ini segera terjadi ;)


Saya melihat pendekatan berikut

  • #54 memperkenalkan alat CLI mandiri baru. Alat CLI harus mendukung ini.
  • Kami menambahkan flag baru --snapshot ke alat CLI (atau menambahkan alat baru bernama backup-snapshot.sh )

Cara mendeteksi saat pencadangan "selesai" (hanya berlaku jika flag --snapshot disetel):

  • Kami ingat saat pencadangan dimulai. Semua catatan yang memiliki stempel waktu yang lebih baru diabaikan selama pencadangan
  • Ketika sebuah partisi tidak menghasilkan data baru untuk beberapa waktu (misalnya 20-an) kami berasumsi bahwa tidak ada data baru

Bagaimana menurutmu?

Biarkan Cafka Backup berjalan di latar belakang

Masalahnya persis dengan langkah ini. Kami tidak dapat membuatnya tetap berjalan di latar belakang. Kami hanya memiliki jendela tertentu ketika kami dapat melakukan snapshot. Tidak tergantung pada kami untuk memutuskan kapan kami dapat melakukan pencadangan, itu adalah persyaratan peraturan eksternal.

Kami ingat saat pencadangan dimulai. Semua catatan yang memiliki stempel waktu yang lebih baru diabaikan selama pencadangan

Ya, itulah yang saya maksud dan saya pikir ini akan menghapus persyaratan untuk menjalankannya di latar belakang (dan mencoba menangkap momen ketika semua produsen selesai).

Ketika sebuah partisi tidak menghasilkan data baru untuk beberapa waktu (misalnya 20-an) kami berasumsi bahwa tidak ada data baru

Saya pikir opsi ini saling eksklusif dengan yang lain. Dan saya pikir yang pertama lebih baik karena memberikan titik referensi tertentu dan tidak bergantung pada menemukan jendela ketika tidak ada pesan.

Sebenarnya saya ingin menulis bahwa ini hampir tidak mungkin dengan Kafka, tetapi saat menulis saya mendapat ide untuk solusinya:

kafka-consumer-groups mengembalikan posisi konsumen saat ini di partisi, tetapi yang lebih menarik, ia mengembalikan offset akhir saat ini dari setiap partisi tertentu. Ini berarti ada cara untuk mendapatkan offset terbaru untuk partisi pada titik waktu tertentu. Saat ini saya tidak tahu bagaimana ini dicapai (perlu memeriksa kode).

Jadi sekarang ada jalur yang jelas bagaimana melakukan pencadangan point-in-time (kurang lebih):

  1. Dapatkan offset akhir partisi untuk setiap partisi yang akan dicadangkan (Di suatu tempat di sini: https://github.com/itadventurer/kafka-backup/blob/master/src/main/Java/de/azapps/kafkabackup/sink /BackupSinkTask.java#L81 )
  2. Konsumsi setiap partisi
  3. Segera setelah catatan yang dikonsumsi memiliki offset >= yang disimpan untuk partisi itu ingat ini. Abaikan semua catatan dalam cadangan. (Lihat https://github.com/itadventurer/kafka-backup/blob/master/src/main/java/de/azapps/kafkabackup/sink/BackupSinkTask.java#L63 )
  4. Segera setelah semua partisi diperbarui, cetak pesan ke STDOUT
  5. Gunakan skrip pembungkus untuk mendeteksi pesan ini dan matikan kafka connect dengan anggun. Mirip dengan bagaimana diselesaikan selama pemulihan: https://github.com/itadventurer/kafka-backup/blob/master/bin/restore-standalone.sh#L232 -L252

Anda melihat bahwa ini benar-benar tidak sepele.

Fokus saya saat ini adalah untuk meningkatkan test suite dan menstabilkan Kafka Backup untuk rilis pertama (Lihat https://github.com/itadventurer/kafka-backup/milestone/1). Saya tidak bisa memberi Anda ETA untuk fitur itu. Saya akan dengan senang hati meninjau PR untuk itu (dan saya juga mencari pengelola tambahan;)) Saya senang membantu jika ada pertanyaan

Anda melihat bahwa ini benar-benar tidak sepele.

Saya lebih pada sisi operasi (seperti pengaturan, pemantauan klaster Kafka, dll). Jadi saya percaya Anda pada bagian ini. Maksud saya adalah bahwa dari sisi pekerjaan saya, ini adalah sesuatu yang saya (dan cukup yakin banyak orang lain) memang butuhkan.

Saya akan dengan senang hati meninjau PR untuk itu (dan saya juga mencari pengelola tambahan;))

Saya tidak begitu hebat dengan Java/Scala untuk banyak membantu di sini. Jika itu Python, C/C++ atau setidaknya Go saya bisa membantu :P

Halo!
pada awalnya - Saya senang menemukan solusi Anda, karena saya harus membuat cadangan data topik kafka
di detik - sayangnya saya tidak bisa menulis apa pun di Java/Scala, jadi saya sudah menyiapkan 'wrapper' untuk Anda 'backup-standalone.sh' dengan python untuk solusi cadangan lengkap
https://Gist.github.com/FloMko/7adf2e00cd80fe7cc88bb587cde999ce
Akan menyenangkan melihat pembaruan apa pun tentang dukungan bawaan apa pun untuk pencadangan tepat waktu

Hai,
Terima kasih atas kerjamu! Sebagai solusi sementara, saya dapat membayangkan untuk menambahkan ini sebagai skrip tambahan ke repo ini dan menggantinya nanti dengan solusi bawaan. Jangan ragu untuk menambahkan ini sebagai permintaan Tarik :) (ke ./bin/kafka-backup-point-in-time.py atau yang lainnya ;))

Saya akan memublikasikan implementasi yang sepenuhnya terpisah yang ditulis dalam Go yang tidak bergantung pada connect API. Hanya FYI. Kami sudah menggunakannya di lingkungan produksi kami.

@akamensky dapatkah Anda membagikan solusi Anda? sejauh Anda telah menguji solusi Anda, itu akan baik-baik saja

@FloMko kami baru saja menerbitkannya. Anda dapat menemukannya (serta biner yang dibangun kembali) di sini

Terima kasih @WesselVS untuk PR #99 Anda! Saya baru saja menggabungkannya menjadi master. Akan melakukan rilis dengan peningkatan ini dan beberapa perbaikan lainnya segera.

@akamensky Keren! Senang melihat lebih banyak pekerjaan tentang Cafka Backup ;)

Apakah halaman ini membantu?
0 / 5 - 0 peringkat