Hem hızlı (<1 saniye) hem de yavaş veritabanı geçişlerinden (> 30 saniye) oluşan bir uygulamamız var. Şu anda, veritabanı geçişlerini CI'nin bir parçası olarak çalıştırıyoruz, ancak daha sonra CI aracımız, uygulamamız için (çoklu ortamlarda) ideal olmayan tüm veritabanı bağlantı dizelerini bilmelidir. Bu işlemi, uygulamanın başlatıldığında kendi veritabanı geçişlerini çalıştıracak şekilde değiştirmek istiyoruz.
Durum şu:
Bu uygulamanın birden fazla örneğimiz var - üretimde yaklaşık 5. Onları arayalım node1, ..., node5
. Her uygulama tek bir SQL Server örneğine bağlanır ve aktarma dağıtımlarını kullanmayız (tüm uygulamalar bildiğim kadarıyla aynı anda dağıtılır)
Sorun: Uzun süredir devam eden bir göçümüz olduğunu varsayalım. Bu durumda, node1
taşıma işlemini başlatır, ardından taşıma işlemini başlatır. Şimdi, node4
başlıyor ve uzun süren taşıma henüz tamamlanmadı, bu nedenle node4
taşıma işlemine başlıyor -> olası veri bozulması? Bu soruna karşı nasıl önlersiniz ya da sorun endişelenecek kadar önemli mi?
Ben bir dağıtılmış kilit (kullanarak etcd
veya bu satır boyunca bir şey) ile bu sorunu çözmeyi düşünüyordum . Temel olarak, tüm uygulamalar kilidi almaya çalışır, bunlardan sadece biri onu alır ve geçişleri çalıştırır, ardından kilidini açar. Uygulamaların geri kalanı başlatıldığında ve kritik bölüme girdiğinde, tüm taşıma işlemleri zaten çalıştırılmıştır, böylece taşıma komut dosyası yalnızca kapanır.
Bununla birlikte, bağırsaklarım "bu aşırı kilolu, daha basit bir çözüm olmalı" diyor, bu yüzden burada başka birinin daha iyi fikirleri olup olmadığını görmek isteyeceğim.