Kiến trúc
Sơ đồ tổng thể
+------------------------------------------------+
| Access Hub (Laravel) |
| Control plane: kiểm kê, tenant, luật, UI, |
| thông báo, audit, IaC, MySQL (RW tách riêng) |
+-----^--------------------------^---------------+
sự kiện, seen, enroll, | | đồng bộ luật, registry,
inventory (API v1) | | truy vấn, purge (internal API)
+-----+--------------------------+---------------+
| Collector |
| role ingest | role worker | role admin |
+--+-----------+------+------------+-------------+
| | | |
Redis (state) Bus VictoriaMetrics Outbox (sự kiện chờ gửi)
^
HTTPS (443), chỉ đi ra |
+----------+ +----------+ +----------+
| Agent | | Agent | | Agent | ... hàng nghìn máy Linux và Windows
+----------+ +----------+ +----------+Vai trò tiến trình của collector
Cùng một binary collector, chọn vai trò bằng cờ --roles=ingest,worker,admin (mặc định all cho dev). Mỗi vai trò scale độc lập.
| Vai trò | Việc làm | Tính chất |
|---|---|---|
ingest | Nhận HTTP từ agent: enroll (proxy sang Access Hub), metrics, config, inventory, renew. Xác thực token qua registry, kiểm tra giới hạn, đẩy lên bus, cập nhật last_seen | Không trạng thái, scale ngang sau load balancer |
worker | Đọc bus, ghi TSDB theo lô, đánh giá luật, phát hiện mất tín hiệu, tạo sự kiện, gửi về Access Hub qua outbox | Có trạng thái trong bộ nhớ theo shard, snapshot vào Redis |
admin | API nội bộ cho Access Hub: đẩy thay đổi registry, nạp lại luật, truy vấn số liệu, xóa dữ liệu tenant, trạng thái collector | Chỉ mở trong mạng nội bộ |
Luồng dữ liệu chính
1. Enroll (đăng ký agent mới)
- Admin tạo License trong Access Hub (gắn công ty, có thể gắn sẵn một
Server, có hạn, số lần dùng). - Cài agent với token đó. Agent gọi
POST /agent/v1/enrolltới collector. - Collector chuyển tiếp (proxy) sang
POST /api/v1/monitoring/collector/enrollcủa Access Hub. Access Hub kiểm tra token, ghép hoặc tạoServer, tạo bản ghi agent, sinh agent token. - Collector nhận
agent_id, company_id, server_id, agent_token, nạp vào registry Redis, trảagent_id, agent_token, configvề agent. Token chỉ hiện đúng một lần.
2. Nhận số liệu (đường nóng)
- Agent gửi
POST /agent/v1/metrics(protobuf, nén) mỗi chu kỳ (mặc định 30 giây, có jitter). ingestbăm token, tra registry Redis (miss thì hỏi Access Hub một lần, có cache âm), lấycompany_id, server_id.- Kiểm tra giới hạn: kích thước, số series, cửa sổ thời gian, tốc độ theo agent.
- Gắn nhãn
company_id,server_id(bỏ mọi nhãn cùng tên agent gửi lên), đẩy vào bus theo shardhash(server_id) mod N. - Ghi
last_seenvào Redis, trả 200 kèmserver_time,config_etag. workergom lô, ghi TSDB bằng Prometheus remote-write, đồng thời đánh giá luật.
3. Cảnh báo
- Access Hub là nơi tạo và sửa luật. Collector kéo luật (
sinceversion) và cache. workerđánh giá luật trên luồng mẫu, giữ trạng thái pending/firing trong bộ nhớ, snapshot Redis.- Mất tín hiệu: bộ quét theo dõi
last_seen, phát sự kiệnagent.downsaumax(3 x interval, 90s). - Sự kiện (mở, đóng, mất tín hiệu, phục hồi) vào outbox bền vững, rồi gửi lô tới
POST /api/v1/monitoring/collector/events(idempotent theoevent_id). - Access Hub tạo
monitoring_alert, kích hoạt thông báo, webhook, chuông Reverb, audit.
4. Truy vấn từ giao diện
Người dùng mở tab sức khỏe máy chủ. Access Hub kiểm tra quyền và công ty, rồi gọi API truy vấn của collector (/internal/v1/query/...) với company_id và server_id cố định. Collector tự chèn bộ lọc nhãn, không nhận PromQL thô từ ngoài.
5. Xóa dữ liệu
Khi công ty bị xóa vĩnh viễn hoặc máy chủ bị xóa vĩnh viễn, Access Hub gọi DELETE /internal/v1/tenants/{company_id}/data (hoặc theo server_id). Collector xóa series tương ứng trong TSDB, dọn Redis, thu hồi agent.
Ranh giới tin cậy
| Ranh giới | Tin cậy | Kiểm soát |
|---|---|---|
| Agent -> Collector | Không tin nội dung | Token, giới hạn, danh tính từ registry, kiểm tra đầu vào |
| Collector -> Access Hub | Tin có điều kiện | Bearer token của user dịch vụ, quyền monitoring.collector, TLS |
| Access Hub -> Collector (admin) | Tin có điều kiện | Token admin riêng, mạng nội bộ, TLS |
| Collector -> TSDB, Redis, Bus | Tin | Mạng nội bộ, xác thực dịch vụ, TLS khi ra khỏi node |
Công nghệ
| Lớp | Lựa chọn | Lý do ngắn | Quyết định |
|---|---|---|---|
| Ngôn ngữ agent và collector | Go | Binary tĩnh, chéo nền tảng, hiệu năng, thư viện hệ thống tốt | ADR 0003 |
| Giao thức | HTTPS + protobuf, nén zstd/gzip | Qua proxy và tường lửa dễ, gọn, dễ cân tải | ADR 0002 |
| Mô hình thu thập | Agent đẩy (push) | Chỉ kết nối đi ra, không giữ thông tin đăng nhập vào máy chủ | ADR 0001 |
| TSDB | VictoriaMetrics: single node cho dev và on-prem nhỏ, cụm cho hệ thống Cloud (ghi bằng JSON import) | Gọn, nén tốt, dễ vận hành, thay thế được | ADR 0005, 0014, 0015, 0017 |
| Trạng thái nóng | Redis (hoặc Valkey) | last_seen, registry cache, snapshot, rate limit | |
| Bus | In-process (GĐ 1), NATS JetStream (GĐ 3) | Trừu tượng hóa bằng interface Bus | ADR 0009 |
| Trạng thái, cấu hình, cảnh báo | MySQL của Access Hub | Nguồn sự thật, nhỏ, không phải chuỗi thời gian | ADR 0004 |
Topology triển khai
- Dev: một tiến trình
--roles=all+ Redis + VictoriaMetrics trong Docker Compose, Access Hub thật hoặc mock. - Production nhỏ (đến khoảng 2.000 máy): 2 node collector
allsau load balancer, 1 Redis có replica, 1 VictoriaMetrics. - Production lớn (5.000 đến 10.000+ máy): ingest, worker, admin tách riêng, NATS JetStream 3 node, Redis HA, VictoriaMetrics cluster (hệ thống Cloud, ADR 0017; không chia instance theo tenant), rollup cụm riêng.
- Nhiều vùng hoặc nhiều tenant lớn: nhiều collector độc lập, Access Hub gán collector cho từng agent (bảng
monitoring_collectors), agent nhậncollector_urltrong cấu hình và có thể được chuyển sang collector khác.
Chi tiết kích thước và HA ở 08-scaling-ha.