2011-09-08 31 views
14

Nhóm của chúng tôi đã rất quan tâm đến việc triển khai liên tục gần đây, nhưng chúng tôi đã gặp phải một chút rào cản liên quan đến cách thực sự nhận mã được triển khai trên Heroku - có vẻ như không thể tránh khỏi làm một mã đẩy đến Heroku.Heroku có thể được định cấu hình để triển khai liền mạch không?

Trong một môi trường truyền thống, mã triển khai có lẽ sẽ giống như thế này:

  1. Đẩy mã lên đến một thư mục dàn dựng ở đâu đó (mã cũ vẫn sống)
  2. Run di cư đối với cơ sở dữ liệu (thêm thường thì không an toàn hơn khi chạy trước khi di chuyển và một số ít mã sẽ phá vỡ mã này có thể được bảo vệ)
  3. Lấy một nửa (hoặc một số phần trăm máy chủ) ra khỏi bộ cân bằng tải.
  4. Triển khai mã cho các máy chủ đó.
  5. Nếu có thể, hãy chạy một số loại kiểm tra khói tự động/thực hiện các máy chủ vì vậy họ đang "nóng"
  6. Chuyển mà máy chủ được trong và ngoài của cân bằng tải
  7. Rửa và lặp lại.

Với Heroku, tôi có rất ít quyền kiểm soát hai bước quan trọng:

  • tôi không thể chạy di cư cơ sở dữ liệu đầu tiên. Một cách tôi đã xem xét để giải quyết vấn đề này là giữ cho việc di chuyển cơ sở dữ liệu được phân nhánh một cách riêng biệt, và đẩy chúng vào heroku trước - trong khi đau đớn, sẽ giải quyết được vấn đề - nhưng chỉ làm trầm trọng thêm ...
  • Thời gian quay của Dyno có thể mất một thời gian khá dài - rõ ràng, đây là lỗi của Rails so với Heroku, nhưng vấn đề chính là tôi không thể làm gì đó như cân bằng tải trên để đảm bảo rằng ứng dụng của tôi đã sẵn sàng và được tải trước một máy chủ mới được triển khai được đưa trở lại cân bằng tải. Thay vào đó, tôi khá nhiều không có lựa chọn nào khác ngoài việc cung cấp cho người dùng màn hình tải 10-15 giây và hy vọng điều tốt nhất (và thực hiện TWICE đó nếu tôi sử dụng chiến lược triển khai cơ sở dữ liệu từ trên)

Chúng tôi sử dụng bảo trì màn hình hiện tại, nhưng không phải là giải pháp có thể mở rộng nếu chúng tôi chuyển sang triển khai liên tục đầy đủ (có thể chúng tôi có khoảng 10-20 lần triển khai mỗi ngày và màn hình bảo trì 10-20 * 30 giây bắt đầu tăng)

Có ai gặp sự cố tương tự không? Bạn đã giải quyết chúng như thế nào? Bất kỳ nghiên cứu điển hình/câu chuyện thành công nào cho đúng triển khai liên tục trên heroku?

Trả lời

10

Về dynos thời gian spin-up, Heroku có một tính năng beta để giải quyết việc đó:

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

Về cơ bản nó khởi động dynos mới của bạn đầu tiên, đợi một thời gian, chuyển giao thông và chỉ sau đó giết những cái cũ. Ứng dụng của tôi đã thấy sự cải thiện đáng kể về hiệu suất trong quá trình triển khai. Bạn có thể đọc tại đây:

http://ylan.segal-family.com/blog/2012/08/27/deploy-to-heroku-with-near-zero-downtime/

+0

Điều này có vẻ hoàn toàn phù hợp với chúng tôi! Cảm ơn vì đã cho tôi biết! –

+0

Tôi đang sử dụng tính năng này trong sản xuất cho www.versioneye.com và nó hoạt động hoàn hảo. Có một số suy nghĩ để thông báo. Nó không phải là một giải pháp cho việc di chuyển cơ sở dữ liệu lớn. Nhưng đối với việc tung ra các tính năng với ít thay đổi db, nó là hoàn hảo. Tôi thích nó. –

7

Trên Heroku, chúng tôi sẽ phát hành SIGTERM cho (các) dyno của bạn khi khởi động lại. Sau một thời gian ngắn nếu quá trình không dừng lại, chúng sẽ bị giết. Điều này sẽ cho phép bạn đủ thời gian gia hạn để khởi động lại liên tục khi bạn không chạy di chuyển.

Bạn luôn có thể đẩy mã vào ứng dụng dàn dựng được chỉ vào DB sản xuất của bạn và chạy di chuyển từ đó. Pedro đã viết một bài đăng trên blog tốt đẹp về việc di chuyển thời gian chết bằng 0 cũng sẽ giúp quá: http://pedro.herokuapp.com/past/2011/7/13/rails_migrations_with_no_downtime/

Hy vọng điều này sẽ giúp một số.

+0

Cảm ơn! Tôi nghĩ rằng điều này có rất nhiều chiến lược tuyệt vời cho phía cơ sở dữ liệu của mọi thứ - mặc dù vẫn còn thời gian khởi động dyno để giải quyết, đó là một bước tiến lớn trong đúng hướng. Về điểm đầu tiên của bạn, tôi không chắc chắn mức độ này sẽ giúp ích bao nhiêu - luôn có người dùng truy cập trang web trong khi dyno spin-up và họ sẽ thấy thời gian chờ đợi lâu, trừ khi tôi bỏ lỡ một cái gì đó ở đó. –

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