Làm cách nào để chạy di chuyển cơ sở dữ liệu một cách an toàn với nhiều phiên bản ứng dụng?


10

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, node1bắt đầu, sau đó bắt đầu thực hiện di chuyển. Bây giờ, node4bắt đầu và quá trình di chuyển dài chưa kết thúc, vậy node4cò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 etcdhoặ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.


1
Làm thế nào về việc sử dụng bảng "trạng thái di chuyển" làm khóa toàn cầu / phân tán của bạn? Hàng duy nhất sẽ cho biết nếu di chuyển hiện đang hoạt động và có thể di chuyển đã được thực hiện cuối cùng.
Bart van Ingen Schenau

Bạn có cần triển khai các ứng dụng của mình không đồng bộ không?
Bến

Câu trả lời:


4

Vì bạn đã đề cập đến máy chủ SQL: theo bài đăng DBA.SE trước đây , các thay đổi lược đồ có thể (và nên) được đưa vào giao dịch. Điều này cung cấp cho bạn khả năng thiết kế các lần di chuyển của bạn giống như bất kỳ hình thức ghi đồng thời nào khác vào DB của bạn - bạn bắt đầu một giao dịch và khi thất bại, bạn quay lại. Điều đó ngăn chặn ít nhất một số tình huống tham nhũng cơ sở dữ liệu tồi tệ nhất (mặc dù các giao dịch sẽ không ngăn mất dữ liệu khi có các bước di chuyển phá hoại như xóa một cột hoặc bảng).

Cho đến nay, tôi chắc chắn rằng bạn cũng sẽ cần một số migrationsbảng nơi đã di chuyển được áp dụng, vì vậy một quy trình ứng dụng có thể kiểm tra xem một di chuyển cụ thể đã được áp dụng hay chưa. Sau đó sử dụng "CHỌN CẬP NHẬT" để triển khai di chuyển của bạn như thế này (mã giả):

  • Bắt đầu một giao dịch
  • SELECT FROM Migrations FOR UPDATE WHERE MigrationLabel='MyMigration42'
  • nếu tuyên bố cũ trả về một giá trị, kết thúc giao dịch
  • áp dụng di chuyển (quay lại nếu thất bại, đăng nhập thất bại và kết thúc giao dịch)
  • INSERT 'MyMigration42' INTO Migrations(MigrationLabel)
  • kết thúc giao dịch

Điều đó xây dựng cơ chế khóa trực tiếp vào thử nghiệm "là di chuyển đã được áp dụng" .

Lưu ý rằng thiết kế này sẽ - về mặt lý thuyết - cho phép để các bước di chuyển của bạn không biết ứng dụng nào thực sự áp dụng nó - có thể là bước 1 được áp dụng bởi app1, bước 2 bởi app2, bước 3 bởi ứng dụng 3, bước 4 bởi app1 một lần nữa, và như vậy. Tuy nhiên, đó cũng là một ý tưởng tốt để không áp dụng di chuyển miễn là các trường hợp ứng dụng khác đang được sử dụng. Triển khai song song, như đã đề cập trong câu hỏi của bạn, có thể đã quan tâm đến ràng buộc này.


1

Có lẽ bạn có thể tìm thấy một thư viện hỗ trợ di chuyển cơ sở dữ liệu với nhiều nút.

Tôi biết về hai thư viện trong thế giới Java, cả hai đều hỗ trợ những gì bạn cần:

  • Liquibase : Từ Câu hỏi thường gặp của họ : Liquibase sử dụng hệ thống khóa phân tán để chỉ cho phép một quá trình cập nhật cơ sở dữ liệu tại một thời điểm. Các quy trình khác sẽ chỉ đơn giản là đợi cho đến khi khóa được phát hành.
  • Đường bay : Từ trang tải xuống của họ : An toàn cho nhiều nút song song ✓

Có lẽ có các công cụ khác cho Java và các ngôn ngữ khác.


Nếu bạn không thể (hoặc không muốn) sử dụng một công cụ như vậy, một bảng có thể được sử dụng như một khóa hoặc thậm chí là nhật ký di chuyển, xem ví dụ câu trả lời của Doc Browns .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.