5 bước để nâng cấp backend của trang web mà không làm gián đoạn dịch vụ
deployment
10
White

Ngoc Dao viết ngày 20/03/2016

Làm thế nào để nâng cấp trang web mà không làm gián đoạn dịch vụ? Đây là câu hỏi phỏng vấn các công ty lớn thường hỏi khi bạn xin vào vị trí làm lập trình backend. Bài viết này giới thiệu một giải pháp dễ thực hiện.

Các hệ thống web thường có cấu trúc sau:

Load balancer và/hoặc reverse proxy web server
      |               |                |
      |               |                |
App server 1    App server 2     App server 3
      |               |                |
      |               |                |
      +------------- DB ---------------+
  • Tầng trên cùng là load balancer và/hoặc reverse proxy web server, để hứng kết nối từ client.
  • Tầng tiếp theo nhiều web app server để phân tải và chết server này thì còn server kia.
  • Tầng dưới cùng là DB.

Tất nhiên nếu đi sâu vào chi tiết thì mỗi tầng sẽ có nhiều chiêu thức phức tạp nữa. Ví dụ đối với trang web có lượng truy cập khổng lồ, thì sẽ dùng kết hợp cả load balancer và reverse proxy web server chứ không chỉ dùng một cái, DB thì cấu trúc theo kiểu master-slave, có hot standby, failover, lại còn dùng thêm server để cache v.v.

Trong bài viết này, ta dùng cấu trúc giản lược như hình trên để miêu tả giải pháp cho câu hỏi trên.

Chương trình (trang web) = code (app server) + data (DB)

Nâng cấp trang web có thể là nâng cấp một trong 2 cái, hoặc cả 2.

Trường hợp dễ nhất là chỉ nâng cấp code, chỉ thay đổi mã chương trình, giải pháp thường là:

  1. Chỉnh load balancer và/hoặc reverse proxy web server để kết nối không chạy vào app server 1.
  2. Tắt chương trình trên app server 1, thực hiện nâng cấp chương trình.
  3. Bật nó lên lại.
  4. Chỉnh load balancer và/hoặc reverse proxy web server để kết nối chạy vào app server 1 như cũ.
  5. Lặp lại các bước trên cho các app server còn lại.

Trường hợp khó hơn là dính đến nâng cấp data, như thay đổi cấu trúc các bảng hoặc giá trị trong DB, có giải pháp 5 bước sau:

Bước Thao tác nâng cấp Code Data Chương trình
1 (Chương trình đang chạy bình thường với phiên bản cũ hiện tại) Cũ, chỉ xử lí được data cũ
2 Nâng cấp các app server Code mới, cần xử lí được cả data cũ và mới
3 Nâng cấp DB Như trên Mới

Đến đây, mặc dù cả code và data đã mới, nhưng ta vẫn giữ cho chương trình như cũ bằng cách cấu hình. Người dùng bình thường nhìn từ bên ngoài (giao diện v.v.) sẽ vẫn thấy các thứ chưa có gì thay đổi, nhưng thực ra nội tạng chương trình đã sẵn sàng để bật sang trạng thái mới. Bí quyết ở đây là chương trình được tích hợp hệ thống gọi là feature flag, để người vận hành có thể bật tắt các tính năng. Việc thiết kế hệ thống feature flag này là đề tài cũng rất thú vị, sẽ đề cập ở bài viết khác.

  • Bước 4: Bật feature flag để ban đầu chỉ thử nghiệm tính năng mới cho một vài người dùng. Nếu thấy ổn thì sẽ bật cho tất cả mọi người.
  • Bước 5: Đến đây trang web đã ổn, có thể dọn dẹp để bỏ đi code và data cũ.

Mấu chốt của giải pháp trên là:

  • Dùng load balancer và/hoặc reverse proxy web server để người dùng vẫn truy cập được dịch vụ.
  • Viết code mới sao cho nó xử lí được cả data cũ và mới.

Ở trên, ta thấy có chỗ cần tắt app server để nâng cấp. Nếu dùng một số công nghệ cao cấp như Erlang, thì còn có thể nâng cấp code mà không cần tắt app server (hot code reload)! Chiêu thức này rất hữu dụng cho những hệ thống cần realtime (ví dụ realtime multiplayer games), cần lưu trạng thái vào trong memory của app server luôn để xử lí cho nó nhanh, khi nào thực sự cần lưu trạng thái lâu dài mới phải lưu vào DB. Đây cũng là đề tài thú vị, có thể đề cập ở bài viết khác. Hãy tưởng tượng khi cả trăm ngàn game thủ đang đấu realtime với nhau, bạn vẫn có thể nâng cấp chương trình mà không làm đứt kết nối hoặc gián đoạn trận đấu.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Ngoc Dao

102 bài viết.
299 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
42 1
Bài viết này giải thích sự khác khác nhau giữa hai ngành khoa học máy tính (computer science) và kĩ thuật phần mềm (software engineering), hi vọng ...
Ngoc Dao viết hơn 2 năm trước
42 1
White
37 2
Nếu là team leader, giám đốc công ty hay tướng chỉ huy quân đội, vấn đề cơ bản bạn gặp phải là “hướng mọi người đi theo con đường bạn chỉ ra”. Thử...
Ngoc Dao viết hơn 2 năm trước
37 2
White
23 1
SVVN số 29/2008] Theo GS làm thế nào để đào tạo được những sinh viên là lực lượng lao động có thể đáp ứng được thực tế rất bất trắc, rất dễ thay đổ...
Ngoc Dao viết hơn 2 năm trước
23 1
Bài viết liên quan
White
2 0
Nhận thấy một số bạn khi pull code về server gặp phải trường hợp như sau. Tiêu Phong deploy lên server nên khi clone code về đã dùng lệnh git clon...
Ôm Boom viết gần 2 năm trước
2 0
White
36 25
Vừa rồi mình vừa tiết kiệm được $5 mỗi tháng sau khi migrate cái (Link) từ Digital Ocean sang Heroku Free Dyno. (Ảnh) Kết quả thật mĩ mãn vì hầu ...
Cẩm Huỳnh viết hơn 1 năm trước
36 25
White
4 0
Đây là một trong những bài thuộc series Ship your Elixir app with confidence của mình. Các bài trong series: 1. (Link) 2. (Link) Mở bài Một ng...
Cẩm Huỳnh viết hơn 1 năm trước
4 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
102 bài viết.
299 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!