Đạt được triển khai không ngừng hoạt động đã chạm vào cùng một vấn đề nhưng tôi cần một số lời khuyên về một chiến lược mà tôi đang xem xét.
Bối cảnh
Một ứng dụng dựa trên web với Apache / PHP để xử lý phía máy chủ và hệ thống tập tin / DB của MySQL để duy trì.
Chúng tôi hiện đang xây dựng cơ sở hạ tầng. Tất cả các phần cứng mạng sẽ có dự phòng và tất cả các cáp mạng chính sẽ được sử dụng theo cặp ngoại quan để chịu lỗi. Các máy chủ đang được cấu hình là các cặp có tính sẵn sàng cao cho khả năng chịu lỗi phần cứng và sẽ được cân bằng tải cho cả khả năng chịu lỗi của máy ảo và hiệu năng chung.
Mục đích của tôi là chúng tôi có thể áp dụng các bản cập nhật cho ứng dụng mà không mất thời gian. Tôi đã rất đau đớn khi thiết kế cơ sở hạ tầng để đảm bảo rằng tôi có thể cung cấp 100% thời gian hoạt động; sẽ vô cùng thất vọng khi sau đó có 10-15 phút ngừng hoạt động mỗi khi một bản cập nhật được áp dụng. Điều này đặc biệt quan trọng vì chúng tôi dự định sẽ có một chu kỳ phát hành rất nhanh (đôi khi nó có thể đạt tới một hoặc nhiều bản phát hành mỗi ngày.
Cấu trúc mạng
Đây là một bản tóm tắt của mạng:
Load Balancer
|----------------------------|
/ / \ \
/ / \ \
| Web Server | DB Server | Web Server | DB Server |
|-------------------------|-------------------------|
| Host-1 | Host-2 | Host-1 | Host-2 |
|-------------------------|-------------------------|
Node A \ / Node B
| / |
| / \ |
|---------------------| |---------------------|
Switch 1 Switch 2
And onward to VRRP enabled routers and the internet
Lưu ý: Máy chủ DB sử dụng bản sao chính chủ
Chiến lược đề xuất
Để đạt được điều này, tôi hiện đang nghĩ đến việc chia các kịch bản nâng cấp lược đồ DB thành hai phần. Bản nâng cấp sẽ như thế này:
- Máy chủ Web trên nút A được đưa ra khỏi dòng; lưu lượng truy cập tiếp tục được xử lý bởi máy chủ web trên nút B.
- Thay đổi lược đồ chuyển tiếp được áp dụng cho các máy chủ DB
- Web-Server Một cơ sở mã được cập nhật, bộ nhớ cache bị xóa và bất kỳ hành động nâng cấp nào khác được thực hiện.
- Máy chủ Web A được đưa trực tuyến và máy chủ web B được đưa ra ngoại tuyến.
- Cơ sở mã B của máy chủ web được cập nhật, bộ nhớ cache bị xóa và mọi hành động nâng cấp khác được thực hiện.
- Máy chủ web B được đưa trực tuyến.
- Thay đổi lược đồ cuối cùng được áp dụng cho DB
"Lược đồ chuyển tiếp" sẽ được thiết kế để thiết lập DB tương thích phiên bản chéo. Điều này chủ yếu sẽ sử dụng các chế độ xem bảng mô phỏng lược đồ phiên bản cũ trong khi bản thân bảng sẽ được thay đổi thành lược đồ mới. Điều này cho phép phiên bản cũ tương tác với DB như bình thường. Các tên bảng sẽ bao gồm các số phiên bản lược đồ để đảm bảo rằng sẽ không có bất kỳ sự nhầm lẫn nào về việc viết bảng nào.
'Lược đồ cuối cùng' sẽ loại bỏ khả năng tương thích ngược và dọn dẹp lược đồ.
Câu hỏi
Tóm lại, điều này sẽ làm việc?
cụ thể hơn:
Sẽ có vấn đề do tiềm năng viết đồng thời tại điểm cụ thể của thay đổi lược đồ chuyển tiếp? Có cách nào để đảm bảo rằng nhóm các truy vấn sửa đổi bảng và tạo chế độ xem tương thích ngược được thực hiện liên tiếp không? tức là với bất kỳ truy vấn nào khác được giữ trong bộ đệm cho đến khi thay đổi lược đồ được hoàn thành, thường sẽ chỉ là mili giây.
Có phương pháp đơn giản nào cung cấp mức độ ổn định này trong khi cũng cho phép cập nhật mà không mất thời gian không? Nó cũng được ưu tiên để tránh chiến lược lược đồ 'tiến hóa' vì tôi không muốn bị khóa trong khả năng tương thích lược đồ ngược.