Tôi đang tạo một hệ thống thăm dò các thiết bị để lấy dữ liệu về các số liệu khác nhau, chẳng hạn như mức độ sử dụng CPU, mức độ sử dụng đĩa, nhiệt độ, v.v. (có thể) trong khoảng thời gian 5 phút sử dụng SNMP. Mục tiêu cuối cùng là cung cấp trực quan cho người dùng hệ thống dưới dạng biểu đồ chuỗi thời gian.
Tôi đã xem xét việc sử dụng RRDTool trong quá khứ, nhưng từ chối nó vì việc lưu trữ dữ liệu bị bắt vô thời hạn rất quan trọng đối với dự án của tôi và tôi muốn truy cập cao hơn và linh hoạt hơn vào dữ liệu đã chụp. Vì vậy, câu hỏi của tôi là thực sự:
Điều gì là tốt hơn, một cơ sở dữ liệu quan hệ (như MySQL hoặc PostgreSQL) hoặc cơ sở dữ liệu không liên quan hoặc NoQuery (như MongoDB hoặc Redis) liên quan đến hiệu suất khi truy vấn dữ liệu để lập biểu đồ.
Quan hệ
Đưa ra một cơ sở dữ liệu quan hệ, tôi sẽ sử dụng một data_instances
bảng, trong đó sẽ được lưu trữ mọi trường hợp dữ liệu được ghi lại cho mỗi số liệu được đo cho tất cả các thiết bị, với các trường sau:
Lĩnh vực: id
fk_to_device
fk_to_metric
metric_value
timestamp
Khi tôi muốn vẽ biểu đồ cho một số liệu cụ thể trên một thiết bị cụ thể, tôi phải truy vấn bảng số ít này để lọc các thiết bị khác và các số liệu khác được phân tích cho thiết bị này:
SELECT metric_value, timestamp FROM data_instances
WHERE fk_to_device=1 AND fk_to_metric=2
Số lượng hàng trong bảng này sẽ là:
d * m_d * f * t
trong đó d
số lượng thiết bị , m_d
là số liệu tích lũy được ghi lại cho tất cả các thiết bị, f
là tần suất mà dữ liệu được thăm dò và t
là tổng thời gian hệ thống thu thập dữ liệu.
Đối với người dùng ghi 10 số liệu cho 3 thiết bị cứ sau 5 phút trong một năm, chúng tôi sẽ chỉ có dưới 5 triệu hồ sơ.
Chỉ mục
Không có chỉ mục trên fk_to_device
và fk_to_metric
quét bảng mở rộng liên tục này sẽ mất quá nhiều thời gian. Vì vậy, lập chỉ mục các trường đã nói ở trên và cũng timestamp
(để tạo biểu đồ với các khoảng thời gian được bản địa hóa) là một yêu cầu.
Không liên quan (NoQuery)
MongoDB có khái niệm về một bộ sưu tập , không giống như các bảng, chúng có thể được tạo lập trình mà không cần thiết lập. Với những điều này, tôi có thể phân vùng lưu trữ dữ liệu cho từng thiết bị hoặc thậm chí từng số liệu được ghi lại cho từng thiết bị.
Tôi không có kinh nghiệm với NoQuery và không biết liệu họ có cung cấp bất kỳ tính năng nâng cao hiệu suất truy vấn nào không, chẳng hạn như lập chỉ mục, tuy nhiên đoạn trước đề xuất thực hiện hầu hết các truy vấn quan hệ truyền thống trong cấu trúc mà dữ liệu được lưu trữ trong NoQuery.
Chưa quyết định
Một giải pháp quan hệ với việc lập chỉ mục chính xác sẽ giảm xuống một lần thu thập thông tin trong năm? Hoặc cấu trúc dựa trên bộ sưu tập của các cách tiếp cận NoQuery (phù hợp với mô hình tinh thần của dữ liệu được lưu trữ) mang lại lợi ích đáng chú ý?