Bất kỳ ý tưởng về cách chạy bảo trì trên một trang web luôn luôn được sử dụng?


18

Tôi giúp đỡ với một trang web chơi game lớn ở Úc. Chúng tôi chạy các cuộc thi từ 7 giờ sáng giờ địa phương đến 1 giờ sáng ngày hôm sau, mỗi ngày trong tuần. Chúng tôi đã không bỏ qua một ngày kể từ khi trang web được phát hành. Đương nhiên, điều này làm cho việc bảo trì cực kỳ khó khăn để chạy và chúng tôi thấy rằng máy chủ dàn của chúng tôi có tới 50 lần cam kết trước chi nhánh sản xuất của chúng tôi. Thông thường, nhà phát triển chính phải thức dậy rất sớm để hợp nhất các chi nhánh và đảm bảo mọi thứ đều hoạt động tốt.

Chúng tôi đã cố gắng làm cho trang dàn dựng của chúng tôi giống với trang sản xuất, nhưng chúng tôi chỉ có thể làm cho nó giống nhau.

Trang web của chúng tôi dựa trên Laravel với máy chủ Node.JS cho thời gian thực. Chúng tôi đang sử dụng Laravel Forge.

Có ai có bất kỳ đề xuất về cách chúng tôi có thể đẩy cập nhật thường xuyên hơn? Chúng tôi đang mở cho bất cứ điều gì.


Tại sao một triển khai mất nhiều thời gian?
Michael Hampton

@MichaelHampton Việc triển khai của chúng tôi không mất nhiều thời gian, chỉ là chúng tôi không đủ khả năng để ngừng hoạt động nếu có sự cố xảy ra.
phô mai5505

1
Tôi đoán câu hỏi, sau đó, là: Tại sao một rollback mất quá nhiều thời gian?
Michael Hampton

@MichaelHampton chúng tôi đã không xem xét chính xác các rollback, tuy nhiên đôi khi chúng tôi thực hiện các cập nhật lớn sẽ làm mất trang web quá lâu.
phô mai5505

5
Bất cứ điều gì đang chiếm khối lượng lớn thời gian, đó là những gì bạn cần xem xét.
Michael Hampton

Câu trả lời:


22

Có rất nhiều điều bạn có thể làm để cải thiện quy trình triển khai của mình. Một vài trong số đó là:

  • Đảm bảo mã của bạn được kiểm tra tốt.

    Tốt nhất bạn nên có phạm vi kiểm tra đơn vị 100%, cũng như kiểm tra tích hợp cho mọi kịch bản có thể hiểu được.

    Nếu bạn chưa có thứ này, có lẽ bạn nên bỏ mọi thứ và chăm sóc nó.

    Nhìn vào sự phát triển theo hành vi.

    Có một bộ kiểm tra hoàn chỉnh sẽ cho phép bạn ...

  • Chạy tích hợp liên tục.

    Bất cứ khi nào ai đó thực hiện thay đổi, CI có thể tự động chạy bộ thử nghiệm trên đó. Nếu bộ kiểm tra vượt qua, thì nó có thể triển khai ngay lập tức (hoặc lên lịch triển khai). Đối với những thay đổi không yêu cầu bất kỳ thay đổi đáng kể nào đối với cơ sở dữ liệu của bạn, việc này một mình sẽ giúp bạn tiết kiệm rất nhiều thời gian và đau đầu.

    Trong trường hợp có vấn đề, CI cũng có thể cung cấp cho bạn rollback một lần nhấp.

    CI là nhiều ít hữu ích nếu bộ kiểm tra của bạn là không đầy đủ và chính xác, như toàn bộ đang gánh tiền đề về việc có thể để xác nhận mã của bạn một cách tự động.

  • Thực hiện cập nhật nguyên tử.

    Lý tưởng nhất là bạn không nên sao chép các tệp mới trên tệp cũ trên máy chủ sản xuất. Thay vào đó, sử dụng một công cụ như capistrano, sao chép mọi tệp vào một vị trí mới, sau đó sử dụng một liên kết tượng trưng để trỏ đến triển khai mong muốn. Quay trở lại là tức thời vì nó chỉ đơn giản là thay đổi liên kết tượng trưng để trỏ đến triển khai trước đó. (Mặc dù điều này không nhất thiết bao gồm di chuyển cơ sở dữ liệu của bạn.)

    Cũng xem xét liệu các container như Docker có thể giúp bạn.

  • Thực hiện các thay đổi nhỏ hơn, thường xuyên hơn.

    Cho dù bạn có xét nghiệm, CI, hoặc không có gì, điều này một mình có thể giúp bạn đáng kể. Mỗi thay đổi nên có nhánh git riêng và việc triển khai nên có càng ít thay đổi càng tốt. Bởi vì các thay đổi nhỏ hơn, có ít khả năng xảy ra lỗi trong quá trình triển khai.

    Trên lưu ý đó, thực hiện các thay đổi cô lập hơn bất cứ khi nào có thể. Nếu bạn đã thực hiện một thay đổi cho trò chơi Omaha và nó không ảnh hưởng đến Texas Hold'em, 5 thẻ bài hoặc bất cứ điều gì khác, thì đó là trò chơi duy nhất cần phải tạm dừng để bảo trì.

  • Phân tích bất cứ điều gì lâu dài.

    Bạn đã đề cập đến một số phần của việc triển khai của bạn mất một thời gian dài. Đây có thể là thay đổi lược đồ cơ sở dữ liệu. Thật đáng để có một DBA nhìn vào cơ sở dữ liệu của bạn, cùng với mỗi thay đổi lược đồ, để xem những gì có thể hoạt động tốt hơn.

    Có một chuyên gia về vấn đề nhìn vào bất kỳ phần nào khác của việc triển khai chiếm nhiều khối thời gian lớn.

  • Giờ làm việc lẻ.

    Bạn có thể đã làm điều này, nhưng nó đề cập đến. Các nhà phát triển (và sysadins!) Sẽ không còn hoạt động "9 đến 5" nữa, đặc biệt là cho hoạt động 24x7. Nếu ai đó dự kiến ​​sẽ dành hàng giờ để trông trẻ triển khai, khắc phục mọi sự cố và sau đó giữ một lịch trình ban ngày, thì những kỳ vọng của bạn là không thực tế, và bạn đang thiết lập người đó để kiệt sức.


Giải pháp đơn giản nhất ở đây là sử dụng kịch bản triển khai trong một công cụ như Capistrano và thậm chí có thể thực hiện cân bằng tải.
JakeGould

Cảm ơn vì lời khuyên. Chúng tôi sẽ xem xét điều này. Hiện tại chúng tôi chưa có bộ thử nghiệm nào cả, và tôi thực sự muốn xem xét nó tuy nhiên trang web đã được phát triển được hơn 8 tháng và quá lớn nên sẽ mất hơn một tuần để tạo ra một bộ. Chúng tôi đang chạy Laravel Forge, chỉ cần liên kết phiên bản mới với thư mục mà nginx được thiết lập. Tôi không thể làm việc nhiều giờ do trường học, và các nhà phát triển khác cũng vậy.
phô mai5505

1
@ cheese5505 Tôi biết điều này thật khó chịu và điều này không giải quyết được vấn đề của bạn, nhưng khi bạn nói điều này, thì Viêu đã quá lớn, sẽ mất hơn một tuần để tạo ra một thứ . Bất kỳ quá trình phát triển và triển khai lành mạnh nào cũng sẽ cho phép một máy chủ được xây dựng trong vòng chưa đầy một ngày hoặc có thể vài giờ đến một giờ. Bạn thực sự nên xem lại những gì bạn đã làm để xây dựng đống thứ không thể quản lý này để tránh điều này. Vấn đề không phải là phức tạp mà là tầm nhìn xa cơ bản trong kế hoạch.
JakeGould

1
"Hiện tại chúng tôi chưa có bộ thử nghiệm nào" - hãy sửa lỗi này ngay bây giờ , trước khi phát triển các tính năng mới. Đây là điểm đau lớn nhất của bạn và sẽ là một rủi ro sẵn có. Kiểm tra tự động sẽ đi một chặng đường dài hướng tới việc ngăn chặn mất điện và sẽ giảm đau đáng kể.
Josh

6

Dường như từ những gì bạn nói rằng bạn có một cửa sổ bảo trì từ 1 giờ sáng đến 7 giờ sáng mỗi ngày, vấn đề không phải là thời gian mà là sự tiện lợi. Điều này là bình thường và nhiều người chỉ coi nó là một phần của kinh doanh.

Bạn có thể có một hệ thống 2 (hoặc nhiều phụ trợ) với giao diện điều khiển lưu lượng truy cập đến bất kỳ nơi nào hiện đang hoạt động. Một khi bạn hài lòng rằng một bản phát hành sẽ hoạt động, bạn nói với giao diện người dùng để chuyển sang hệ thống mới. điều này sẽ dễ dàng để kịch bản mất một thời gian ngắn.

Bây giờ bạn có thể lựa chọn rời khỏi hệ thống cũ để bạn có thể sao lưu hoặc cập nhật hệ thống để nó có thể được sử dụng như một phụ tùng cho hệ thống trực tiếp cho đến khi đến lúc xây dựng / kiểm tra các bản cập nhật tiếp theo.


Khi bạn phân biệt phụ trợ với frontend, bạn có nghĩa là kiến ​​trúc phần mềm hoàn toàn mô-đun? Hoặc kiến ​​trúc máy chủ như một bộ cân bằng tải?
JakeGould

2
chỉ cần một cái gì đó chấp nhận các kết nối và đưa chúng đến phụ trợ chính hiện tại.
user9517 hỗ trợ GoFundMonica

5

Sửa đổi các câu trả lời khác: Bạn nên theo mô hình triển khai màu xanh lam . Khi bạn muốn phát hành một phiên bản mới, bạn triển khai nó đến một trang web dàn nội bộ. Sau đó, bạn có thể chạy thử nghiệm tự động trên trang web sản xuất phiên bản tiếp theo. Khi các bài kiểm tra đi qua, bạn chỉ điểm cân bằng tải để sử dụng trang web mới.

Điều này giúp theo cách sau:

  1. Các vấn đề nghiêm trọng luôn được tìm thấy với thời gian chết bằng không.
  2. Chuyển sang một phiên bản mới có thời gian chết chính xác bằng 0 vì phiên bản mới đã được khởi động và khởi động.
  3. Bạn có thể chuyển về phiên bản cũ bất cứ lúc nào vì nó vẫn đang hoạt động.

Tất cả các vấn đề khác mà bạn và những người khác đã đề cập trở nên ít nghiêm trọng hơn khi bạn có thể triển khai bất cứ lúc nào một cách không căng thẳng. Mô hình triển khai màu xanh lam là một giải pháp khá hoàn chỉnh cho các vấn đề triển khai.


Chúng tôi đã có một máy chủ dàn mà chúng tôi sử dụng để kiểm tra, nhưng tại thời điểm sản xuất và dàn dựng là trên các nhà cung cấp máy chủ khác nhau ở các địa điểm khác nhau. Chúng tôi đang cố gắng chuyển sản xuất đến nơi dàn dựng vì nó cung cấp hiệu suất tốt hơn cho chúng tôi.
phô mai5505

1
Điều quan trọng là chỉ cần chuyển bộ cân bằng tải sang phiên bản làm việc đã được chứng minh. Với mô hình hiện tại bạn không có điều đó.
usr

1
Làm thế nào tốt một mô hình này phụ thuộc rất nhiều vào những gì trang web đang làm. Nếu trang web không trạng thái thì tuyệt vời nhưng nếu nó không trạng thái, bạn phải tìm ra cách bạn sẽ chuyển trạng thái đó khi chuyển đổi.
Peter Green

@PeterGreen rất khó để các trang web có trạng thái vì điều đó không cho phép phân cụm và trạng thái có thể bị mất bất cứ lúc nào khi triển khai lại / khởi động lại / sự cố / màn hình, v.v. Do đó, điều này rất không phổ biến.
usr

@usr hầu hết các trang web đều có nhà nước. Trạng thái đó có thể được lưu trữ trong tệp hoặc trong cơ sở dữ liệu. Trong trường hợp sau, cơ sở dữ liệu có thể là cục bộ hoặc từ xa. Một số nâng cấp có thể có tác động đến trạng thái đó có nghĩa là nâng cấp và khôi phục không đơn giản chỉ là chuyển qua mã.
Peter Green

3

Bạn sẽ làm gì nếu trung tâm dữ liệu chính của bạn bị ngừng hoạt động, điều này xảy ra tại tất cả các trung tâm dữ liệu theo thời gian? Bạn có thể chấp nhận thời gian chết, bạn có thể thất bại với một trung tâm dữ liệu khác, bạn có thể đang chạy ở chế độ hoạt động tích cực trong nhiều trung tâm dữ liệu mọi lúc hoặc bạn có thể có một số kế hoạch khác. Cho dù đó là một trong những thứ đó, hãy làm điều đó khi bạn phát hành, và sau đó bạn có thể đưa trung tâm dữ liệu chính của mình xuống trong khi phát hành. Nếu bạn chuẩn bị có thời gian chết khi trung tâm dữ liệu của bạn bị ngừng hoạt động, thì bạn đã sẵn sàng để có thời gian chết, vì vậy đó không phải là vấn đề trong quá trình phát hành.


2

Để thêm vào các câu trả lời trước:

  • Sử dụng chiến lược triển khai cho phép rollback và chuyển đổi tức thời, Capistrano hoặc khá nhiều hệ thống triển khai khác sẽ giúp ích cho việc này. Bạn có thể sử dụng những thứ như ảnh chụp nhanh cơ sở dữ liệu và mã liên kết mã để có thể nhanh chóng trở lại trạng thái trước đó.

  • Sử dụng quản lý cấu hình hoàn chỉnh, không để lại bất cứ thứ gì được quản lý thủ công. Các hệ thống như SaltStack, Ansible và Puppet là những ví dụ. Chúng có thể được áp dụng cho các cấu hình container Docker và các hộp mơ hồ.

  • Sử dụng HA để đảm bảo bạn có thể xử lý các yêu cầu khi nâng cấp nút. Nếu quá trình nâng cấp thất bại, chỉ cần xuống nút và khi nó được khôi phục, hãy đưa nó trở lại và giải pháp HA của bạn sẽ thông báo và đẩy các yêu cầu đến nút đã nói lại. HAProxy là một ví dụ, nhưng nginx cũng hoạt động tốt.

  • Đảm bảo ứng dụng có thể xử lý các trường hợp đồng thời, được lưu trữ dữ liệu phiên bản trung tâm được sử dụng cho dữ liệu không phải mã cần được lưu trữ trên đĩa, chẳng hạn như bộ đệm. Bằng cách này, bạn sẽ không bao giờ có ứng dụng được nâng cấp chạy vào bộ đệm ẩn từ một phiên bản khác. Điều này sẽ được thực hiện trên bộ đệm thanh lọc và thực hiện khởi động bộ đệm. (Điều lưu trữ chỉ là một ví dụ)

Tôi thường thiết lập quy trình công việc trong đó các nhà quản lý nhóm có thể phê duyệt các yêu cầu hợp nhất cho một nhánh đặc biệt thực hiện tất cả các công cụ CI thông thường, nhưng như một bước cuối cùng bổ sung cũng bắt đầu đẩy đến các nút sản xuất. Những gì bạn về cơ bản là chạy một triển khai CI thủ công đến một thể hiện sản xuất. Nếu trường hợp đó không tạo ra phản hồi không hợp lệ, phá vỡ hoặc làm những điều kỳ lạ đối với dữ liệu của bạn, thì bạn sẽ nâng cấp hàng loạt tất cả các nút bằng giải pháp CI bạn chọn. Theo cách này, nếu một triển khai hoạt động, bạn biết tất cả các triển khai sẽ hoạt động cho một thẻ / cam kết cụ thể.

Ngay bây giờ, có vẻ như bạn đang chạy một ứng dụng sản xuất trên một nút, với một quy trình triển khai, một nguồn và một mục tiêu. Điều này thực tế có nghĩa là mỗi bước trong quy trình làm việc đó là một điểm thất bại mà chính nó có thể phá vỡ trang web. Đảm bảo rằng điều đó không thể xảy ra là cơ sở của tất cả các quá trình CI, HA và chuyển đổi dự phòng. Không chỉ chạy một nút, không chạy chỉ một tiến trình HA, không chạy trên một địa chỉ IP, không chạy chỉ một CDN, v.v ... Nghe có vẻ tốn kém, nhưng đặt một bản sao của những gì bạn đã có trong một giá đỡ trên một máy chủ có kết nối riêng của nó thường tốn ít hơn một giờ ngừng hoạt động trên một trang web kinh doanh.


0

Tôi đồng ý trên toàn cầu với Michael về mọi điểm của anh ấy ( /server//a/739449/309477 ).

Theo tôi, cải tiến đầu tiên bạn nên thực hiện là sử dụng công cụ triển khai (Capistrano).

Nó sẽ cho phép bạn triển khai một cách hòa bình, sau đó chuyển sang phiên bản mới hơn ngay lập tức. Nếu có bất cứ điều gì sai, bạn có thể chuyển trở lại phiên bản làm việc ngay lập tức, chỉ bằng cách thay đổi liên kết tượng trưng hiện tại thành phiên bản hoạt động.

Và Capistrano là khá nhanh để xử lý đầu tiên (so với việc bắt đầu sử dụng các bài kiểm tra và CI sẽ là một khoản đầu tư thời gian lớn hơn).

Thứ hai, nếu tiền không phải vấn đề chính của bạn , bạn nên có một máy chủ phát triển iso-prod để kiểm tra ứng dụng của mình trước khi triển khai nó trong sản xuất. Sử dụng giải pháp công nghiệp (Ansible, Chef, Puppet) để quản lý các phiên bản VPS.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.