Vì sao hệ thống vẫn sập trong dịp cao điểm dù đã nâng gấp đôi server? Câu trả lời thường nằm ở Database

Vì sao hệ thống vẫn sập trong dịp cao điểm dù đã nâng gấp đôi server? Câu trả lời thường nằm ở Database

Tác giả: FPT Cloud
15:20 01/04/2026

Trong nhiều ngành nghề kinh doanh, câc dịp cao điểm như flash sale, sự kiện tri ân, Lễ Tết...thường dẫn đến lượng truy cập lớn trên hệ thống. Và kịch bản quen thuộc thường xảy ra: hệ thống bắt đầu chậm, sau đó lỗi hàng loạt chỉ sau vài phút traffic tăng.

Điều đáng nói ở đây là gì? Đội ngũ vận hành đã có sự chuẩn bị. Server được tăng gấp đôi, thậm chí gấp ba tài nguyên từ chiều hôm trước. Hệ thống giám sát (Monitoring) đã bật cảnh báo từ sớm. Nhưng mọi nỗ lực dường như vô nghĩa — hệ thống vẫn "chết đứng" ngay vào những phút đầu tiên nổ ra sự kiện.

Tại sao một hệ thống được chuẩn bị kỹ lưỡng về hạ tầng vẫn sập? Câu trả lời nằm ở một góc tối ít ai ngờ tới và thường bị bỏ qua đầu tiên: Không phải do Web Server đuối sức, cũng không phải do nghẽn băng thông — mà thủ phạm chính là Database.

Hệ thống của bạn không sập đơn thuần vì lượng traffic quá đông. Nguyên nhân cốt lõi là do kiến trúc hệ thống vốn dĩ không được sinh ra để phục vụ quy mô khổng lồ đó. Có 3 điểm nghẽn bóp nghẹt dòng chảy dữ liệu — và cả ba đều liên quan trực tiếp đến cách Database được thiết kế từ gốc, chứ không phải do cách nó được phân bổ tài nguyên vận hành.

1. Khi Vertical Scaling chạm giới hạn của Database

Một phản xạ phổ biến khi hệ thống bắt đầu chậm là nâng cấp phần cứng của server database. CPU được tăng thêm lõi xử lý, RAM được mở rộng, ổ lưu trữ được thay bằng loại có tốc độ cao hơn.

Cách tiếp cận này được gọi là vertical scaling — tăng sức mạnh cho một máy chủ duy nhất.

Trong giai đoạn đầu, vertical scaling thường mang lại cải thiện rõ rệt. Các truy vấn dữ liệu (database queries) được xử lý nhanh hơn và thời gian phản hồi của hệ thống giảm xuống. Tuy nhiên, cách mở rộng này có một giới hạn tự nhiên: toàn bộ dữ liệu và toàn bộ truy cập vẫn đang tập trung vào một node database duy nhất.

Khi lưu lượng truy cập tiếp tục tăng, database server dần trở thành một “điểm nghẽn trung tâm”. CPU có thể chạm ngưỡng sử dụng tối đa, hàng nghìn truy vấn đồng thời bắt đầu cạnh tranh tài nguyên, và thời gian xử lý mỗi request tăng lên nhanh chóng.

Ở giai đoạn này, việc tiếp tục nâng cấp server thường mang lại hiệu quả rất hạn chế. Bởi dù phần cứng có mạnh đến đâu, một database đơn lẻ vẫn phải xử lý toàn bộ workload của hệ thống.

Vấn đề lúc này không còn là server yếu, mà là kiến trúc database chưa được thiết kế để mở rộng theo lưu lượng truy cập.

Database AI Gen

2. Giới hạn kết nối: khi Database hết “làn xử lý”

Hãy hình dung database như một trạm thu phí trên cao tốc. Số làn xe cố định — giả sử 200 làn. Ngày thường, xe đi lại mượt mà. Nhưng vào 12:00 ngày 4.4, 50.000 xe đổ vào cùng lúc.

Dù mỗi làn xử lý rất nhanh — ùn tắc vẫn xảy ra từ hàng cây số trước trạm.

Trong hầu hết các hệ thống web, mỗi request từ người dùng sẽ cần một kết nối tới database để đọc hoặc ghi dữ liệu. Số lượng kết nối này được quản lý thông qua cơ chế gọi là connection pool.

Trong điều kiện bình thường, cơ chế này hoạt động rất ổn định. Các request được phân phối qua các kết nối sẵn có và database xử lý chúng với độ trễ rất thấp.

Nhưng khi traffic tăng đột biến, số lượng request đồng thời có thể tăng gấp hàng chục lần trong vài giây. Khi đó, toàn bộ connection pool nhanh chóng bị sử dụng hết. Những request mới buộc phải chờ kết nối trống trước khi được xử lý.

Điều đáng chú ý là ở nhiều sự cố production, database server vẫn còn tài nguyên CPU và RAM. Tuy nhiên, vì tất cả các kết nối đều đã được sử dụng, hệ thống vẫn không thể xử lý thêm request mới.

Trong một số trường hợp, tình hình còn trở nên tệ hơn khi ứng dụng bắt đầu tự động retry các request bị timeout. Những request retry này tạo thêm kết nối mới tới database, khiến connection pool cạn nhanh hơn và tạo ra hiệu ứng quá tải dây chuyền

z7489293707904 b13b6aa2f4e0cedb93a0e6c89e78ce9e.jpg

3. Write Storm — sự bùng nổ lượng truy cập từ E-commerce và Fintech

Trong các hệ thống có nhiều giao dịch như thương mại điện tử hoặc fintech, một vấn đề khác thường xuất hiện khi lượng giao dịch hoặc truy cập tăng mạnh: write storm trong database.

Relational database được thiết kế để đảm bảo tính chính xác và nhất quán của dữ liệu. Khi một giao dịch đang cập nhật một bản ghi, database thường khóa tạm thời bản ghi đó để tránh việc nhiều giao dịch thay đổi dữ liệu cùng lúc.

Trong ngày thường, cơ chế này hoạt động hoàn hảo. Nhưng trong flash sale — khi 10.000 người cùng bấm "Thanh toán" trong 3 giây cho cùng một sản phẩm — tất cả 10.000 transaction đó đang tranh nhau một row lock.

Kết quả: không phải 10.000 transaction xử lý song song. Mà là 10.000 transaction xếp hàng tuần tự, mỗi cái chờ cái trước hoàn thành.

Trong các hệ thống có lưu lượng giao dịch lớn, hiện tượng này có thể lan rộng rất nhanh và trở thành nguyên nhân chính khiến database phản hồi chậm hoặc ngừng xử lý request mới.

Bài toán thực sự không phải là server, mà là kiến trúc Database

Nhìn lại, ba nguyên nhân trên đều dẫn tới một kết luận giống nhau: trong các hệ thống có lượng người dùng lớn, việc mở rộng server chỉ là một phần của bài toán.

Yếu tố quan trọng hơn là cách kiến trúc database được thiết kế để xử lý lưu lượng truy cập tăng dần theo thời gian.

Trong giai đoạn đầu của một sản phẩm, việc sử dụng một relational database chạy trên một node duy nhất là hoàn toàn hợp lý. Nó giúp hệ thống đơn giản, dễ vận hành và đảm bảo tính nhất quán của dữ liệu.

Nhưng khi hệ thống phát triển và lượng giao dịch tăng lên, kiến trúc này bắt đầu bộc lộ giới hạn. Việc tập trung toàn bộ dữ liệu và toàn bộ truy cập vào một điểm duy nhất khiến database trở thành nút thắt cổ chai của toàn bộ hệ thống.

Đó là lý do nhiều tổ chức khi thiết kế hệ thống ở quy mô lớn thường bắt đầu bằng một câu hỏi khác:

Database cần được tổ chức như thế nào để hệ thống có thể phân tán tải và mở rộng theo lưu lượng truy cập, thay vì dồn toàn bộ áp lực vào một máy chủ duy nhất?

Câu hỏi này chính là điểm khởi đầu của nhiều kiến trúc database hiện đại.