2012-06-19 43 views
6

Tôi nghĩ rằng tôi không hoàn toàn hiểu quy trình triển khai. Dưới đây là những gì tôi biết:Hiểu Triển khai Ứng dụng Web Python

  • khi chúng ta cần phải làm triển khai nóng - có nghĩa là chúng ta cần phải thay đổi mã đó là sống - chúng ta có thể làm điều đó bằng cách tải lại mô-đun, nhưng
  • imp.reload là một ý tưởng tồi, và chúng ta nên khởi động lại ứng dụng thay vì tải lại các module thay đổi
  • lý tưởng là mã chạy phải là một bản sao của kho lưu trữ mã của bạn, và bất cứ lúc nào bạn cần phải triển khai, bạn chỉ cần kéo những thay đổi

Bây giờ, giả sử tôi có nhiều phiên bản wsgi ứng dụng chạy sau một proxy ngược như nginx (trên các cổng như 8011, 8012, ...). Và, giả sử rằng tôi nhận được yêu cầu 5 mỗi giây.

Bây giờ trong trường hợp này, tôi nên cập nhật mã của mình như thế nào trong tất cả các phiên bản đang chạy của ứng dụng.

  • Nếu tôi dừng lại tất cả các trường hợp, sau đó cập nhật tất cả trong số họ, sau đó khởi động lại tất cả - Tôi chắc chắn sẽ mất một số yêu cầu
  • Nếu tôi cập nhật mỗi trường hợp từng người một - sau đó các trường hợp sẽ được ở trạng thái không nhất quán (một số sẽ chạy mã cũ và một số mới) cho đến khi tất cả chúng được cập nhật. Bây giờ nếu một yêu cầu truy cập một thể hiện được cập nhật, và sau đó một yêu cầu tiếp theo (và liên quan) sẽ truy cập một cá thể cũ hơn (chưa được cập nhật) - thì tôi sẽ nhận được kết quả sai.

Ai đó có thể giải thích kỹ lưỡng về cách các ứng dụng bận rộn như thế này được triển khai nóng?

+0

Câu hỏi hay. Mong các câu trả lời! – invert

Trả lời

2

Để triển khai trên một số trường hợp nóng phía sau bộ cân bằng tải như nginx Tôi thích thực hiện triển khai cuộn bằng công cụ như Fabric.

  1. Vải kết nối bạn với Server 1
  2. Shut down máy chủ web
  3. thay đổi triển khai, hoặc bằng cách sử dụng VCS của bạn hoặc chuyển tarball với các ứng dụng mới
  4. Bắt đầu lên web-server
  5. GOTO1 và kết nối với máy chủ tiếp theo.

Bằng cách đó bạn không bao giờ ngoại tuyến và liền mạch khi nginx biết khi nào máy chủ web bị gỡ xuống khi nó cố gắng xoay vòng và chuyển sang người tiếp theo thay vào đó, ngay khi nút/dụ là sao lưu nó sẽ trở lại vào cách sử dụng sản xuất.

EDIT:

Bạn có thể sử dụng các mô-đun ip_hash trong nginx để đảm bảo tất cả các yêu cầu từ một địa chỉ IP đi vào cùng một máy chủ cho chiều dài của phiên

Chỉ thị này gây ra các yêu cầu để được phân phối giữa upstreams dựa trên địa chỉ IP của máy khách. Chìa khóa cho băm là địa chỉ mạng lớp C của máy khách. Phương pháp này đảm bảo rằng yêu cầu của khách hàng sẽ luôn được chuyển đến cùng một máy chủ.Nhưng nếu máy chủ này được coi là không hoạt động, thì yêu cầu của máy khách này sẽ được chuyển sang máy chủ khác. Điều này mang lại cho một khách hàng xác suất cao sẽ luôn luôn kết nối với cùng một máy chủ.

Điều này có ý nghĩa với bạn, khi máy chủ web của bạn được cập nhật và khách hàng đã kết nối với phiên bản mới, tất cả các kết nối cho phiên đó sẽ tiếp tục được chuyển tiếp đến cùng một máy chủ.

này để lại cho bạn trong tình hình

  1. Khách hàng kết nối với trang web, được phục vụ từ Server 1
  2. Server 1 được cập nhật trước khi kết thúc khách hàng bất cứ điều gì họ đang làm
  3. khách hàng tiềm năng còn lại trong một trạng thái ngớ ngẩn?

Kịch bản này đặt ra câu hỏi, bạn có đang xóa mọi thứ khỏi API/Trang web có khả năng khiến khách hàng ở trạng thái lấp lửng không? Nếu tất cả những gì bạn đang làm là ví dụ cập nhật các phần tử giao diện người dùng hoặc thêm các trang, nhưng không thay đổi bất kỳ API back-end nào thì bạn không nên gặp bất kỳ vấn đề nào. Nếu bạn đang xóa các hàm API, bạn có thể gặp phải các vấn đề.

+0

NHƯNG, như tôi đã phác thảo ở trên, điều này khiến máy chủ ứng dụng của bạn ở trạng thái không nhất quán. Điều gì sẽ xảy ra nếu yêu cầu truy cập vào máy chủ được cập nhật và sau đó yêu cầu có liên quan sẽ truy cập vào yêu cầu chưa được cập nhật? Làm thế nào để bạn quản lý khoảng thời gian đó trong khi máy chủ của bạn đang được cập nhật? – treecoder

+0

Đã chỉnh sửa câu trả lời của tôi để bao gồm thông tin về ip_hash cho các kết nối liên tục đến máy chủ cho phiên. –

0

Bạn không thể lấy một nửa máy chủ của mình ngoại tuyến (nói bằng cách kéo chúng ra khỏi nhóm cân bằng tải) và sau đó cập nhật chúng. Sau đó đưa họ trở lại trực tuyến trong khi đồng thời kéo xuống nửa còn lại. Sau đó cập nhật chúng và đưa chúng trở lại trực tuyến.

Điều này sẽ đảm bảo bạn luôn trực tuyến đồng thời đảm bảo rằng bạn không bao giờ có các phiên bản cũ và mới của ứng dụng trực tuyến cùng một lúc. Có, điều này có nghĩa là trang web của bạn sẽ hoạt động bằng một nửa dung lượng trong thời gian đó. Nhưng điều đó có thể ổn chứ?

Các vấn đề liên quan