2012-01-24 25 views
20

Trên Heroku, ngay sau khi bạn đẩy mã mới, các trường hợp phục vụ web khởi động lại ... ngay cả khi bổ sung/thay đổi lược đồ cơ sở dữ liệu cơ bản (qua syncdb hoặc di chuyển về phía nam) chưa được áp dụng.Trên Heroku, có nguy hiểm trong một Django syncdb/Nam di chuyển sau khi dụ đã khởi động lại với mã mô hình đã thay đổi?

Trong nhiều trường hợp, điều này có thể chỉ gây ra lỗi vô hại làm giảm tốc độ syncdb/di chuyển được chạy ngay sau đó. Nhưng tôi lo ngại rằng trong một số trường hợp, mã mới có thể làm việc một nửa làm thay đổi bất ngờ trong cơ sở dữ liệu di chuyển trước.

Cách nào phù hợp để chống lại rủi ro này?

Một kỹ thuật có thể là thêm syncdb/migrate vào Procfile để nó chạy trước khi khởi động lại web. Tuy nhiên, trong trường hợp có nhiều phiên bản, hoặc thậm chí có thể là trường hợp một cá thể mã cũ đang chạy cho đến khi một cá thể mã mới được biết, thì vẫn có một biến thể của vấn đề trong đó mã nói chuyện với một DB với một lược đồ không khớp.

Có tính năng 'giữ tất cả các trường hợp web' (hoặc thực tiễn phổ biến nhất) để cho phép di chuyển hoàn tất mà không có lưu lượng truy cập web không?

Hoặc tôi có quá lo ngại về rủi ro không đáng kể trong thực tế không?

+2

+1 câu hỏi hay. Tôi có cùng một câu hỏi và tin rằng đây là một nguy cơ nghiêm trọng cần phải tránh. Nếu syncdb/migrate hoạt động tốt, trang web của bạn sẽ ngừng hoạt động dưới một phút. Nhưng nếu nó không thành công vì bất kỳ lý do gì, trang web của bạn sẽ ngừng hoạt động cho đến khi bạn có thể giải quyết nó ... – Spike

+1

Tôi có cùng một vấn đề. Nó thực sự xảy ra rằng trang web của tôi khi xuống, bởi vì di cư phía nam của tôi đã không thành công. May mắn thay, tôi đã có thể khôi phục các thay đổi bằng cách sử dụng lệnh "heroku rollback". – duduklein

+4

Tôi muốn giới thiệu một ví dụ dàn dựng để 'thực hành' di chuyển trước khi thử nó trên trang web sản xuất thực tế của bạn. http://devcenter.heroku.com/articles/multiple-environments –

Trả lời

9

Cách an toàn nhất để xử lý di cư của thiên nhiên này, Heroku hay không, là để áp dụng nghiêm chỉnh một cách tiếp cận phù hợp với lược đồ và mã của bạn:

  • Mỗi phụ hoặc thay đổi schema biến đổi phải tương thích ngược;
  • Mọi thay đổi lược đồ phá hoại phải được thực hiện sau mã phụ thuộc vào nó đã bị xóa;
  • Mọi thay đổi mã phải hoặc là:
    • bền chống lại khả năng thay đổi sơ đồ liên quan vẫn chưa được thực hiện (ví dụ, loại bỏ một mô hình hay một vùng trên mô hình) hoặc
    • thực hiện sau khi sự thay đổi schema liên quan đã được thực hiện (thêm một mô hình hay một vùng trên mô hình)

Nếu bạn cần phải thực hiện một sự thay đổi đáng kể của một mô hình, phương pháp này có thể yêu cầu các bước sau:

  • Tạo một bảng cơ sở dữ liệu mới để giữ cấu trúc mô hình mới của bạn, và triển khai mà di cư
  • Tạo một mô hình mới với cấu trúc mới và mã để sao chép thay đổi từ mô hình cũ sang mô hình mới khi cái cũ thay đổi mô hình và triển khai mã đó
  • Thực thi hành động di chuyển hoặc mã để sao chép tất cả dữ liệu mô hình cũ sang mô hình mới
  • Cập nhật codebase của bạn để sử dụng mô hình mới thay vì mô hình cũ, xóa mô hình cũ và triển khai mã đó
  • Thực thi di chuyển để xóa mô hình cũ Cấu trúc từ cơ sở dữ liệu

Với một số suy nghĩ và lập kế hoạch, nó có thể được sử dụng để thay đổi mạnh mẽ hơn cũng như:

  • Triển khai mã mà hoàn toàn loại bỏ sự phụ thuộc vào một phần của cơ sở dữ liệu, có lẽ thay thế những bộ phận của trang web có các trang bảo trì
  • Triển khai di chuyển tạo ra những thay đổi mạnh mẽ mà không vì bất kỳ lý do nào làm việc với quy trình làm việc hai mô hình trên
  • Mã triển khai mang lại các phần bị ảnh hưởng trở lại với cấu trúc mô hình mới được hỗ trợ

Điều này có thể khó khăn để tổ chức và đòi hỏi kỷ luật nghiêm ngặt và hiểu biết vững chắc của sự tương tác của mã của bạn với cơ sở dữ liệu của bạn, nhưng trong thực tế, nó không cho phép đối với hầu hết những thay đổi được thực hiện không có thời gian chết hơn máy chủ khởi động lại chính nó áp đặt.

1

Có vẻ như thay đổi cơ sở dữ liệu nhanh là cách để đi, nhưng nó đòi hỏi một cơ sở dữ liệu chuyên dụng.

http://devcenter.heroku.com/articles/fast-database-changeovers

Ngoài ra, đây là một hướng dẫn để sao chép dữ liệu từ một cơ sở dữ liệu (ví dụ, sản xuất) đến một cơ sở dữ liệu (ví dụ, dàn), làm chuyển đổi schema/dữ liệu (ví dụ, sử dụng django/nam), sau đó chuyển đổi ứng dụng để sử dụng cá thể cơ sở dữ liệu mới được cập nhật.

http://devcenter.heroku.com/articles/migrating-data-between-plans

Có vẻ hợp lý, nhưng có khả năng chậm nếu có một lượng lớn dữ liệu.

1

Phương pháp khuyến cáo là thế này:

  • thay đổi Thêm cơ sở dữ liệu cho các tính năng mới của bạn để mã hiện tại của bạn
  • Tận dụng mã hiện có phù hợp với sơ đồ mới
  • Triển khai
  • Thêm các tính năng mới vào mã số của bạn
  • Triển khai

Điều này có nghĩa là các thay đổi cơ sở dữ liệu của bạn đã sẵn sàng khi mã bắt đầu yêu cầu chúng.

Tuy nhiên ....

Có một vài vấn đề với điều này. Đầu tiên tôi biết không có cửa hàng phát triển nào được tổ chức đủ để có thể xử lý điều này, vì các tính năng chỉ được xây dựng đặc biệt, và thứ hai là bạn không thực sự tiết kiệm được gì. Nói chung, trừ khi bạn thực hiện những thay đổi lớn đối với một cơ sở dữ liệu khổng lồ, các thay đổi của bạn sẽ không mất nhiều thời gian để áp dụng và thường chỉ trong vài giây mà nhà phát triển có thể làm việc khá vui vẻ khi khởi động lại vv khi cần thiết. Quay lại đầu trang Nguy cơ là người dùng có thể nhận được một trang lỗi. Nếu các thay đổi lớn hơn, bạn có một số lựa chọn thay thế.Một là sử dụng chế độ bảo trì để tắt trang web trong vài giây.

Thành thật mà nói, không có cách nào rõ ràng về cách xử lý điều này một cách độc đáo như định nghĩa mã của bạn cần phải được đặt ra để thay đổi cơ sở dữ liệu của bạn bắt đầu. Cách tốt nhất mà tôi tìm thấy để tiếp cận vấn đề là xem xét từng thay đổi riêng lẻ và tìm ra đường đi mượt mà nhất cho từng trường hợp theo từng trường hợp.

Việc triển khai triển khai trên môi trường dàn dựng sẽ giảm thiểu nguy cơ triển khai xấu, và cung cấp cho bạn ý tưởng về tác động.

1

Heroku gần đây đã phát hành "buildpacks" là các tập lệnh họ sử dụng để thiết lập môi trường cho ứng dụng của bạn, từ quản lý các phụ thuộc để khởi động lại các phiên bản. Về cơ bản nó là một toàn diện hơn Procfile mà bạn có thể tùy chỉnh.

Bạn có thể chia rẽ Python buildpack và sửa đổi tập lệnh để chạy theo trình tự bạn muốn. Nối lệnh bạn chạy đến syncdb đến cuối bin/steps/django. Cam kết và đặt repo này trên Github.

Thật không may như của bây giờ nó không thể thay đổi buildpack của một ứng dụng Heroku hiện có, do đó bạn sẽ phải xóa nó và tạo một trỏ đến buildpack repo của bạn:

heroku create --stack cedar --buildpack [email protected]:... 

này là tốt nhất giải pháp vì nó

  • không chi phí bất cứ điều gì ở tất cả
  • không yêu cầu bạn phải thích nghi với mã của bạn để Heroku
  • Chỉ đồng bộ các db ONC e trên mỗi triển khai

Hy vọng điều này sẽ hữu ích.

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