Chúng tôi có một ứng dụng có sự kết hợp của cả di chuyển cơ sở dữ liệu nhanh (<1 giây) và chậm (> 30 giây). Ngay bây giờ, chúng tôi đang chạy di chuyển cơ sở dữ liệu như một phần của CI, nhưng sau đó công cụ CI của chúng tôi phải biết tất cả các chuỗi kết nối cơ sở dữ liệu cho ứng dụng của chúng tôi (trên nhiều môi trường) không lý tưởng. Chúng tôi muốn thay đổi quy trình này để ứng dụng chạy di chuyển cơ sở dữ liệu của chính nó khi khởi động.
Đây là tình huống:
Chúng tôi có nhiều phiên bản của ứng dụng này - khoảng 5 trong sản xuất. Hãy gọi cho họ node1, ..., node5
. Mỗi ứng dụng kết nối với một phiên bản SQL Server duy nhất và chúng tôi không sử dụng các triển khai cuộn (tất cả các ứng dụng được triển khai đồng thời theo như tôi biết)
Vấn đề: nói rằng chúng tôi có một di chuyển chạy dài. Trong trường hợp này, node1
bắt đầu, sau đó bắt đầu thực hiện di chuyển. Bây giờ, node4
bắt đầu và quá trình di chuyển dài chưa kết thúc, vậy node4
còn bắt đầu chạy di chuyển -> có thể bị hỏng dữ liệu không? Làm thế nào bạn có thể ngăn chặn vấn đề này hoặc vấn đề thậm chí đủ quan trọng để lo lắng?
Tôi đã nghĩ đến việc giải quyết vấn đề này bằng một khóa phân phối (sử dụng etcd
hoặc một cái gì đó dọc theo các dòng đó). Về cơ bản, tất cả các ứng dụng đều cố gắng để có được khóa, chỉ một trong số chúng nhận được nó và chạy các lần di chuyển, sau đó mở khóa. Khi phần còn lại của ứng dụng khởi động và vào phần quan trọng, tất cả các lần di chuyển đã được chạy để tập lệnh di chuyển chỉ thoát.
Tuy nhiên, chú ruột của tôi đang nói rằng "đây là quá mức cần thiết, phải có một giải pháp đơn giản hơn", vì vậy tôi đoán rằng tôi sẽ hỏi ở đây để xem có ai có ý tưởng nào tốt hơn không.