Kami memiliki aplikasi yang memiliki campuran migrasi cepat (<1 detik) dan database lambat (> 30 detik). Saat ini, kami menjalankan migrasi basis data sebagai bagian dari CI, tetapi kemudian alat CI kami harus mengetahui semua rangkaian koneksi basis data untuk aplikasi kami (lintas beberapa lingkungan) yang tidak ideal. Kami ingin mengubah proses ini sehingga aplikasi menjalankan migrasi basis datanya sendiri ketika dijalankan.
Inilah situasinya:
Kami memiliki beberapa contoh aplikasi ini - sekitar 5 dalam produksi. Sebut saja mereka node1, ..., node5
. Setiap aplikasi terhubung ke turunan SQL Server tunggal, dan kami tidak menggunakan penyebaran bergulir (semua aplikasi dikerahkan secara bersamaan sejauh yang saya tahu)
Masalah: misalkan kita memiliki migrasi yang berjalan lama. Dalam hal ini, node1
mulai, kemudian mulai menjalankan migrasi. Sekarang, node4
mulai, dan migrasi yang sudah berjalan lama belum selesai, begitu node4
juga mulai menjalankan migrasi -> kemungkinan korupsi data? Bagaimana Anda mencegah masalah ini atau apakah masalah itu cukup penting untuk dikhawatirkan?
Saya sedang berpikir untuk menyelesaikan masalah ini dengan kunci terdistribusi (menggunakan etcd
atau sesuatu di sepanjang garis itu). Pada dasarnya, semua aplikasi mencoba untuk mendapatkan kunci, hanya satu dari mereka yang mendapatkannya dan menjalankan migrasi, lalu membuka kunci. Ketika sisa aplikasi mulai dan masuk ke bagian kritis, semua migrasi sudah dijalankan sehingga skrip migrasi keluar begitu saja.
Namun, nyali saya mengatakan "ini berlebihan, pasti ada solusi yang lebih sederhana," jadi saya pikir saya akan bertanya di sini untuk melihat apakah ada orang lain yang memiliki ide yang lebih baik.