Kiến Trúc IoT Công Nghiệp: Định Cỡ Cụm EMQX MQTT + Hypertable TimescaleDB
Hồ sơ TimescaleOps tính chuẩn vCPU, RAM DDR5, giới hạn socket Linux và bộ đệm gom lô cho 10.000 đến 250.000 cảm biến MQTT ghi vào TimescaleDB.
Mở kết nối PostgreSQL riêng cho từng gói tin MQTT từ 50.000 bộ PLC nhà máy sẽ làm cạn kiệt kết nối ngay lập tức. Kết hợp cơ chế gom lô của EMQX với bảng hypertable dạng rộng vừa giúp chuyển hàng nghìn bản tin lẻ thành các lượt ghi tuần tự nhẹ nhàng trên một máy chủ NVMe.
| Quy Mô Luồng Mẫu | Chu Kỳ Chunk / Phân Vùng | RAM DDR5 Khuyến Nghị | Dung Lượng Ổ Đĩa Ước Tính | Cấu Hình Hạ Tầng Tham Chiếu |
|---|---|---|---|---|
| 2,500 Devices • 1K msg/s | 7d |
8 GB DDR5 | 100 GB Gen4 NVMe | Hostinger KVM 2 ($5.99/tháng) |
| 25,000 Devices • 10K msg/s | 1d |
16 GB DDR5 | 400 GB Gen4 NVMe | Hostinger KVM 8 / UltaHost VDS |
| 100,000 Devices • 50K msg/s | 6h |
32 GB DDR5 | 2 TB NVMe / ZFS | InterServer Ryzen Storage |
| 250,000+ Fleet • 150K msg/s | 6h / 1h |
64 GB DDR5 | 6 TB ZFS Vault | UltaHost VDS 64GB + InterServer |
# /etc/sysctl.d/99-emqx-timescale.conf
fs.file-max = 2097152
net.core.somaxconn = 65535
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1
-- Medium-wide IoT telemetry hypertable (10 sensor readings per tuple)
CREATE TABLE iot_sensor_telemetry (
ts TIMESTAMPTZ NOT NULL,
site_id SMALLINT NOT NULL,
device_id INTEGER NOT NULL,
temp_c REAL,
vibration_rms REAL,
voltage_v REAL,
current_a REAL,
humidity_pct REAL,
status_code SMALLINT
);
SELECT create_hypertable('iot_sensor_telemetry', by_range('ts', INTERVAL '1 day'));
1. Vì Sao Bảng Hypertable Rộng Vừa Tiết Kiệm Hơn 75% Đĩa So Với Bảng EAV Hẹp?
Trong PostgreSQL 16, mỗi dòng dữ liệu đều gánh 23 byte tiêu đề HeapTupleHeaderData kèm khóa thời gian và mã thiết bị. Nếu tách 10 thông số cảm biến thành 10 dòng hẹp riêng lẻ, phần tiêu đề lặp lại 10 lần gây lãng phí lớn. Gom 10 cột REAL (4 byte) vào chung một dòng rộng 80 byte giúp tiết kiệm hơn 75% dung lượng heap và chỉ mục RAM.
2. Gom Lô Từ EMQX Vào TimescaleDB Theo Khối 5.000 Dòng Hoặc 500ms
Thiết lập cầu nối từ EMQX (hoặc Telegraf/Vector) gom đủ 5.000 bản ghi hoặc mỗi 500ms mới ghi xuống TimescaleDB một lần, chuyển 10.000 gói tin rời rạc thành 2 giao dịch WAL tuần tự mỗi giây.
3. Giữ Cửa Sổ Nóng TimescaleDB 7 Ngày Đón Dữ Liệu Bù Khi Trạm 4G Mất Sóng
Các bộ thu thập tại tàu biển, trang trại hay hầm mỏ thường lưu tạm 48–96 giờ dữ liệu vào bộ nhớ cục bộ khi mất sóng rồi gửi bù sau. Đặt cửa sổ chưa nén 7 ngày giúp dữ liệu bù ghi thẳng vào chunk nóng.
Câu Hỏi Kỹ Thuật Về TS-04 // EMQX-IOT Trên TimescaleOps
Có thể cài chung EMQX và TimescaleDB trên cùng một VPS 16 GB RAM không?
Hoàn toàn khả thi ở quy mô dưới ~15.000 bản tin/giây khi đã bật gom lô. Hãy giới hạn 2 nhân vCPU cho EMQX trong Docker và dành phần nhân cùng RAM còn lại cho PostgreSQL.
Bảng hypertable cảm biến IoT nên dùng kiểu REAL (4 byte) hay DOUBLE PRECISION (8 byte)?
Nên dùng REAL (float4) cho nhiệt độ, độ ẩm, áp suất, điện áp; chỉ dùng DOUBLE PRECISION (float8) cho đồng hồ điện lũy kế hoặc tọa độ GPS cần độ chính xác cao.
Nếu cảm biến IoT gửi bù dữ liệu rơi vào chunk TimescaleDB đã nén thì xử lý thế nào?
Từ TimescaleDB 2.11+, hệ thống cho phép chèn dữ liệu mới vào chunk đã nén thông qua vùng đệm tạm và tự gộp nền, nhưng giữ cửa sổ nóng 7 ngày vẫn tối ưu I/O ổ đĩa nhất.