Tôi đang cố gắng để đạt được việc triển khai thời gian chết bằng không để tôi có thể triển khai ít hơn trong giờ nghỉ và nhiều hơn trong giờ "chậm" - hoặc bất cứ lúc nào, theo lý thuyết.
Thiết lập hiện tại của tôi, có phần đơn giản hóa:
- Máy chủ web A (Ứng dụng .NET)
- Máy chủ web B (Ứng dụng .NET)
- Máy chủ cơ sở dữ liệu (Máy chủ SQL)
Quy trình triển khai hiện tại của tôi:
- "Dừng" các trang web trên cả Máy chủ Web A và B
- Nâng cấp lược đồ cơ sở dữ liệu cho phiên bản của ứng dụng đang được triển khai
- Cập nhật máy chủ web A
- Cập nhật máy chủ web B
- Đưa mọi thứ trở lại trực tuyến
Vấn đề hiện tại
Điều này dẫn đến một lượng nhỏ thời gian chết mỗi tháng - khoảng 30 phút. Tôi làm điều này trong giờ nghỉ, vì vậy đó không phải là một vấn đề lớn - nhưng đó là điều tôi muốn tránh xa.
Ngoài ra - không có cách nào để thực sự quay trở lại. Tôi thường không tạo các tập lệnh DB rollback - chỉ nâng cấp các tập lệnh.
Tận dụng cân bằng tải
Tôi muốn có thể nâng cấp một Máy chủ Web cùng một lúc. Lấy Web Server A ra khỏi bộ cân bằng tải, nâng cấp nó, đưa nó trở lại trực tuyến, sau đó lặp lại cho Web Server B.
Vấn đề là cơ sở dữ liệu. Mỗi phiên bản phần mềm của tôi sẽ cần phải thực thi đối với một phiên bản cơ sở dữ liệu khác nhau - vì vậy tôi bị "kẹt".
Giải pháp có thể
Một giải pháp hiện tại tôi đang xem xét là áp dụng các quy tắc sau:
- Không bao giờ xóa bảng cơ sở dữ liệu.
- Không bao giờ xóa một cột cơ sở dữ liệu.
- Không bao giờ đổi tên một cột cơ sở dữ liệu.
- Không bao giờ sắp xếp lại một cột.
- Mỗi thủ tục lưu trữ phải được phiên bản.
- Ý nghĩa - 'spFind ALLThings' sẽ trở thành 'spFind ALLThings_2' khi nó được chỉnh sửa.
- Sau đó, nó trở thành 'spFind ALLThings_3' khi được chỉnh sửa lại.
- Quy tắc tương tự áp dụng cho quan điểm.
Trong khi, điều này có vẻ hơi cực đoan - tôi nghĩ nó giải quyết được vấn đề. Mỗi phiên bản của ứng dụng sẽ đánh DB theo cách không phá vỡ. Mã mong đợi một số kết quả nhất định từ các lượt xem / thủ tục được lưu trữ - và điều này giữ cho 'hợp đồng' có hiệu lực. Vấn đề là - nó chỉ thấm nước. Tôi biết tôi có thể dọn sạch các thủ tục lưu trữ cũ sau khi ứng dụng được triển khai trong một thời gian, nhưng nó chỉ cảm thấy bẩn. Ngoài ra - nó phụ thuộc vào tất cả các nhà phát triển tuân theo quy tắc này, điều này hầu hết sẽ xảy ra, nhưng tôi tưởng tượng ai đó sẽ phạm sai lầm.
Cuối cùng - Câu hỏi của tôi
- Đây là cẩu thả hay hacky?
- Có ai khác làm theo cách này?
- Những người khác giải quyết vấn đề này như thế nào?