2010-04-01 30 views
33

Mặt xấu của việc đẩy vào Heroku là tôi phải đẩy mã (và máy chủ khởi động lại tự động) trước khi chạy di chuyển db của tôi. Điều này rõ ràng có thể gây ra khoảng 500 lỗi khi người dùng điều hướng trang web có mã mới mà không có bảng/thuộc tính mới: giải pháp được Heroku đề xuất là sử dụng chế độ bảo trì, nhưng tôi muốn một cách không có nhược điểm cho phép webapp của tôi chạy mọi lúc!Triển khai nóng trên Heroku mà không có thời gian chết

Có cách nào không? Ví dụ với Capistrano:

  • tôi chuẩn bị mã để triển khai trong một thư mục mới
  • tôi chạy (lạc hậu) di cư và các mã cũ tiếp tục làm việc một cách hoàn hảo
  • tôi Swith dụ thú lai vào thư mục mới và khởi động lại máy chủ

... và tôi không có thời gian chết!

Trả lời

0

Heroku không thể triển khai bởi capistrano. Bạn bị chặn bởi công cụ phát hành bởi heroku.

Hệ thống không có thời gian chết là không thể trong mọi trường hợp. Cách thay đổi lược đồ của bạn với thay đổi lớn mà không cần dừng máy chủ của bạn. Nếu bạn không dừng nó, bạn có thể tránh một số thay đổi và cơ sở dữ liệu của bạn có thể không phù hợp. SO việc sử dụng trang bảo trì là một giải pháp bình thường.

Nếu bạn muốn một giải pháp nhỏ để tránh sự cố là cân bằng trong hai máy chủ. Một với chỉ đọc cơ sở dữ liệu trong quá trình di chuyển của bạn. Bạn có thể chuyển sang ví dụ này trong quá trình di chuyển của bạn tránh trang bảo trì. Sau khi di chuyển của bạn, bạn trở lại với chủ của bạn.

+1

Xin chào shingara, Tôi rất tiếc nhưng tôi không đồng ý với bạn. Tôi không muốn sử dụng cân bằng tải cho điều này: một trong những tính năng tuyệt vời của Heroku là sức mạnh đám mây "trasparent" bởi sự cần thiết và tôi muốn sử dụng tính năng này ... Để cân bằng tải trong Heroku tôi phải mantain hai các ứng dụng khác nhau và DB chỉ đọc có thể gây ra sự cố cho người dùng của tôi. Và hệ thống không có thời gian chết không bao giờ là không thể. Tôi đã sử dụng đúng hệ thống được giải thích mà không có thời gian chết. Trong trường hợp thay đổi lớn mà không có khả năng tương thích với lược đồ db tôi có thể sử dụng trang bảo trì: nhưng đây là 5% của tất cả các trường hợp của tôi ... – zetarun

+0

Bạn có thể tránh được vấn đề được mô tả trong câu trả lời này bằng cách sử dụng CouchDB, ví dụ. – iconoclast

5

Phương pháp duy nhất để cải thiện quy trình phần nào là những gì anh chàng này gợi ý. Điều này vẫn không phải là một kịch bản triển khai nóng mặc dù:

http://casperfabricius.com/site/2009/09/20/manage-and-rollback-heroku-deployments-capistrano-style/

Một điều tôi sẽ đề nghị chỉ đẩy di cư của bạn lên đến Heroku đầu tiên và chạy chúng trước khi bạn đẩy codebase của bạn. Điều này sẽ đòi hỏi phải cam kết di trú như cam kết độc lập và tự đẩy chúng mỗi lần (đó không phải là lý tưởng). Tôi rất ngạc nhiên khi không có giải pháp nào tốt hơn cho vấn đề này với tất cả các ứng dụng lớn được lưu trữ trên Heroku ngay bây giờ.

21

Bạn có thể thiết lập ứng dụng Heroku thứ hai trỏ đến cùng một DB làm ứng dụng sản xuất chính của bạn và sử dụng ứng dụng thứ cấp để chạy di chuyển DB của bạn mà không làm gián đoạn quá trình sản xuất (giả sử di chuyển không phá vỡ phiên bản trước của ứng dụng) .

Hãy gọi các ứng dụng Heroku SẢN XUẤTSTAGING.

chuỗi triển khai của bạn sẽ trở thành cái gì đó như:

  1. Triển khai mã mới để dàn
    git push heroku staging
  2. di cư Run cơ sở dữ liệu trên dàn (để cập nhật PROD db)
    heroku run -a staging-app rake db:migrate
  3. Triển khai mã mới tới PRODUCTION
    git push heroku production

Ứng dụng dàn sẽ không chi phí bạn bất cứ điều gì vì bạn sẽ không cần phải quá cấp miễn phí Heroku và nó sẽ là khá tầm thường để thiết lập một kịch bản triển khai cào để làm điều này cho bạn tự động.

Chúc may mắn!

+0

Bạn vẫn còn một chút thời gian chết với bước 3 phải không? – andrewrk

+0

Tôi tin rằng Heroku sẽ giữ các dynos cũ của bạn cho đến khi biên soạn của sên mới được hoàn thành để trang web của bạn sẽ vẫn có sẵn trong khi bước 3 đang chạy. Tôi cho rằng có thể có một số thời gian chết tạm thời trong khi Heroku cắt định tuyến từ các dynos cũ sang những cái mới nhưng nó phải là khá tối thiểu. – jshkol

+2

Tôi không chắc rằng một ý tưởng thực sự hay là có môi trường dàn dựng được liên kết với db sản xuất của bạn nếu bạn thực sự sử dụng nó như một môi trường dàn dựng. – Daniel

9

Nếu bạn có thể sống cùng với hai phiên bản của cùng một ứng dụng cùng một lúc, Heroku hiện có tính năng preboot.

https://devcenter.heroku.com/articles/preboot

+0

Liên kết chính xác hiện là: https://devcenter.heroku.com/articles/preboot –

3

Bạn thực sự sẽ có một số thời gian chết khi Heroku khởi động lại ứng dụng của bạn. Họ có một tính năng gọi là Preboot mới bắt đầu lên dynos mới trước khi đưa ra khỏi những cái cũ: https://devcenter.heroku.com/articles/labs-preboot/

Đối với sự di cư của cơ sở dữ liệu, mà liên kết bài viết với trang này về cách đối phó với vấn đề rằng: http://pedro.herokuapp.com/past/2011/7/13/rails_migrations_with_no_downtime/

1

tôi lần đầu tiên cam kết di chuyển, chạy chúng, sau đó đẩy phần còn lại của mã. Thêm một tệp như sau:

git commit -m 'added migration' -- db/migrate/2012-your-migration.rb 
Các vấn đề liên quan