1. Quick start: Dựng Apache Doris và query dữ liệu trong 5 phút
Nếu bạn muốn kiểm chứng ngay khả năng quét hàng chục triệu dòng dữ liệu dưới 1 giây, Docker all-in-one là con đường nhanh nhất.
Tạo file docker-compose.yml với cấu hình sau:
version: '3.8'
services:
doris:
image: apache/doris:doris-all-in-one-2.1.0
container_name: apache-doris-standalone
ports:
- "8030:8030" # FE HTTP Server
- "9030:9030" # FE MySQL Server Port
- "8040:8040" # BE HTTP Server
environment:
- FE_SERVERS=fe1:127.0.0.1:9010
- BE_SERVERS=be1:127.0.0.1:9050
volumes:
- doris_fe:/opt/apache-doris/fe/doris-meta
- doris_be:/opt/apache-doris/be/storage
volumes:
doris_fe:
doris_be:
Chạy container ở chế độ background:
docker compose up -d
Doris giao tiếp bằng giao thức MySQL tiêu chuẩn. Bạn chỉ việc dùng MySQL Client quen thuộc để kết nối (user mặc định root, không mật khẩu):
mysql -h 127.0.0.1 -P 9030 -u root
Khởi tạo database và bảng mẫu phân tích lượt truy cập web:
CREATE DATABASE analytics_db;
USE analytics_db;
CREATE TABLE site_access_log (
event_date DATE NOT NULL,
site_id INT NOT NULL,
user_id VARCHAR(64) NOT NULL,
page_url VARCHAR(255),
pv INT SUM DEFAULT "1"
)
AGGREGATE KEY(event_date, site_id, user_id, page_url)
DISTRIBUTED BY HASH(site_id) BUCKETS 10
PROPERTIES("replication_num" = "1");
INSERT INTO site_access_log VALUES
('2026-03-01', 101, 'usr_9921', '/home', 1),
('2026-03-01', 101, 'usr_9921', '/home', 2),
('2026-03-01', 102, 'usr_1024', '/checkout', 1);
SELECT site_id, SUM(pv) as total_views FROM site_access_log GROUP BY site_id;
2. Giải thích chi tiết: Nút thắt cổ chai RDBMS và kiến trúc MPP của Doris
Khi RDBMS truyền thống đuối sức trước bài toán Analytics
Hãy tưởng tượng bảng orders hay tracking_logs trên MySQL hoặc PostgreSQL phình từ 5 triệu lên 80 triệu bản ghi. Lúc này, chỉ một truy vấn SUM kèm GROUP BY hay COUNT(DISTINCT user_id) cũng đủ khiến I/O nghẽn cứng. CPU server chạm ngưỡng 100%. Trong khi đó, dashboard Metabase hay Grafana liên tục quay vòng chờ phản hồi tới 30-40 giây.
Gốc rễ vấn đề nằm ở cơ chế lưu trữ dạng dòng (Row-oriented). Dù bạn chỉ cần tính tổng tiền trên 2 cột order_date và amount, database vẫn buộc phải bốc trọn vẹn từng hàng—kể cả các cột nặng ký như shipping_address hay JSON payload—từ ổ đĩa nạp vào RAM.
Apache Doris giải bài toán này như thế nào?
Doris là hệ thống Data Warehouse hiện đại sử dụng kiến trúc xử lý song song khối lượng lớn (MPP – Massively Parallel Processing). Nền tảng này kết hợp định dạng lưu trữ cột (Columnar Storage) cùng công nghệ thực thi vectorized (SIMD) để ép thời gian query xuống mức sub-second (dưới 1 giây).
- Lưu trữ dạng cột & Nén sâu: Doris chỉ đọc đúng các cột có trong câu truy vấn. Nhờ thuật toán LZ4/ZSTD, tỷ lệ nén thực tế đạt từ 5:1 đến 8:1, giúp tiết kiệm tới 75% dung lượng lưu trữ trên đĩa.
- Kiến trúc 2 thành phần độc lập: Cụm Doris chỉ bao gồm Frontend (FE – quản lý metadata, parse SQL, phân phối plan) và Backend (BE – lưu trữ tablet, scan và tính toán phân tán). Hệ thống chạy độc lập, loại bỏ hoàn toàn gánh nặng vận hành ZooKeeper hay Hadoop HDFS.
- Tương thích hoàn toàn chuẩn MySQL Wire: Đội ngũ BI có thể cắm trực tiếp Superset, Metabase, Tableau hay PowerBI vào Doris mà không cần cài đặt driver bên thứ ba.
3. Nâng cao: Thiết kế Data Model và Stream Load thời gian thực
Chọn Data Model phù hợp với bài toán
Doris cung cấp 3 mô hình bảng cốt lõi tùy theo mục đích sử dụng:
- Aggregate Model: Tự động gộp dữ liệu theo khóa định sẵn ngay khi ghi (lựa chọn hàng đầu cho số liệu dashboard, thống kê PV/UV).
- Unique Key Model: Hỗ trợ Upsert/Delete tốc độ cao (phù hợp đồng bộ CDC từ MySQL/PostgreSQL theo thời gian thực).
- Duplicate Model: Giữ nguyên từng bản ghi log thô, hỗ trợ đánh index sắp xếp theo cột để quét dải dữ liệu nhanh nhất.
Dưới đây là ví dụ tạo bảng Unique Model với tính năng Merge-on-Write tối ưu cho tác vụ update liên tục:
CREATE TABLE ecom_orders (
order_id BIGINT NOT NULL,
user_id INT NOT NULL,
order_status VARCHAR(32),
total_amount DECIMAL(12, 2),
updated_at DATETIME
)
UNIQUE KEY(order_id)
DISTRIBUTED BY HASH(order_id) BUCKETS 16
PROPERTIES(
"enable_unique_key_merge_on_write" = "true",
"replication_num" = "1"
);
Đẩy dữ liệu qua HTTP Stream Load với Python
Doris tích hợp sẵn giao thức HTTP Stream Load, cho phép nạp trực tiếp micro-batch dữ liệu định dạng JSON/CSV vào bảng đích với thông lượng từ 30.000 đến 50.000 records mỗi giây trên một node BE đơn lẻ.
Đoạn script Python đẩy dữ liệu real-time qua Stream Load:
import requests
import json
doris_host = "http://127.0.0.1:8030"
db = "analytics_db"
table = "ecom_orders"
url = f"{doris_host}/api/{db}/{table}/_stream_load"
headers = {
"format": "json",
"strip_outer_array": "true",
"Expect": "100-continue"
}
data = [
{"order_id": 10001, "user_id": 55, "order_status": "PAID", "total_amount": 1450000.00, "updated_at": "2026-03-01 10:20:00"},
{"order_id": 10002, "user_id": 89, "order_status": "SHIPPED", "total_amount": 320000.00, "updated_at": "2026-03-01 10:21:15"}
]
response = requests.put(
url,
data=json.dumps(data),
headers=headers,
auth=("root", "")
)
print(response.json())
4. Kinh nghiệm thực chiến khi triển khai Production
Khi hệ thống tracking của team mình chạm mốc 250 triệu records/tháng, việc chuyển toàn bộ workload báo cáo sang Apache Doris đã giảm tới 75% tải CPU cho cụm MySQL chính. Dưới đây là 4 kinh nghiệm vận hành thực tế bạn cần lưu ý:
- Phân bổ Bucket hợp lý: Dung lượng lý tưởng của một tablet (bucket sau nén) nằm trong khoảng 100MB đến 1GB. Tránh chia quá nhỏ (như đặt 100 buckets cho bảng chỉ có 2 triệu dòng) vì sẽ gây phân mảnh metadata và tăng gánh nặng quản lý cho FE.
- Tận dụng Rollup Index: Bảng chi tiết lưu log theo từng giây, nhưng báo cáo lại chủ yếu aggregate theo ngày. Hãy tạo Rollup Index trên nền background; tốc độ query các biểu đồ xu hướng sẽ tăng từ 5 đến 10 lần mà không cần thay đổi câu lệnh SQL gốc.
- Lựa chọn phần cứng Backend (BE): Hãy đầu tư ổ SSD NVMe. Do Doris tận dụng triệt để tập lệnh SIMD (AVX2/AVX-512) để tính toán vector, CPU có xung nhịp đơn nhân cao (từ 3.2GHz trở lên) sẽ mang lại hiệu quả vượt trội so với loại nhiều core nhưng xung nhịp thấp.
- Cấu hình Heap Memory cho FE: Metadata của Doris được giữ hoàn toàn trong RAM của FE. Khi dữ liệu lên đến hàng trăm triệu partition, hãy gán tối thiểu 8GB – 16GB JVM Heap (tham số
JAVA_OPTS="-Xmx8192m"trong fileconf/fe.conf) để phòng ngừa lỗi OutOfMemory.

