Hướng dẫn ClickHouse: Vượt qua giới hạn Row-Store để phân tích dữ liệu tốc độ mili giây

Database tutorial - IT technology blog
Database tutorial - IT technology blog

Tại sao cơ sở dữ liệu dạng dòng gặp giới hạn khi phân tích

Hầu hết chúng ta bắt đầu hành trình với PostgreSQL hoặc MySQL. Chúng cực kỳ tuyệt vời cho các tác vụ giao dịch (OLTP) khi bạn cần cập nhật hồ sơ người dùng hoặc xử lý đơn hàng. Nhưng ngay khi bạn thử chạy một truy vấn tổng hợp như SELECT AVG(price) FROM sales trên 500 triệu dòng, trang quản trị của bạn thường sẽ bị treo. Tôi đã từng chứng kiến CPU máy chủ sản xuất chạm ngưỡng 100% trong khi ổ cứng hoạt động quá tải, chỉ vì hệ thống phải nạp từng byte của mọi dòng vào bộ nhớ chỉ để tính một giá trị trung bình.

ClickHouse giải quyết vấn đề này bằng cách đảo ngược mô hình lưu trữ. Thay vì dòng, nó lưu trữ dữ liệu theo cột. Nếu truy vấn của bạn chỉ cần cột ‘price’, ClickHouse sẽ bỏ qua mọi thứ khác trên đĩa. Theo kinh nghiệm của tôi, kiến trúc này có thể rút ngắn thời gian truy vấn từ 45 giây xuống còn 80 mili giây trên các tập dữ liệu mà thông thường sẽ làm treo một phiên bản SQL tiêu chuẩn. Nó được xây dựng chuyên biệt cho xử lý phân tích trực tuyến (OLAP) và đo lường thời gian thực (real-time telemetry).

Cài đặt: Đưa ClickHouse vào hoạt động

Tôi thường sử dụng hai phương pháp triển khai: trình quản lý gói gốc để đạt sự ổn định lâu dài trong môi trường sản xuất, hoặc Docker để tạo bản thử nghiệm nhanh. Đối với các môi trường đám mây chạy Ubuntu 22.04 hoặc 24.04, phương pháp cài đặt gốc là tiêu chuẩn vàng.

Cách 1: Cài đặt trực tiếp trên Ubuntu

Đầu tiên chúng ta cần thêm kho lưu trữ chính thức. Vì ClickHouse không có sẵn trong các kho mặc định của Ubuntu, chúng ta sẽ lấy khóa GPG và đăng ký nguồn. Tôi khuyên bạn nên sử dụng cách tiếp cận signed-by hiện đại thay vì apt-key đã lỗi thời.

sudo apt-get install -y apt-transport-https ca-certificates dirmngr
GNUPGHOME=$(mktemp -d)
sudo gpg --no-default-keyring --keyring /usr/share/keyrings/clickhouse-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 8919F6BD2B48D754
echo "deb [signed-by=/usr/share/keyrings/clickhouse-keyring.gpg] https://packages.clickhouse.com/deb stable main" | sudo tee /etc/apt/sources.list.d/clickhouse.list
sudo apt-get update

sudo apt-get install -y clickhouse-server clickhouse-client

Trình cài đặt sẽ yêu cầu bạn nhập mật khẩu cho người dùng mặc định. Đừng để trống phần này. Sau khi các gói đã được cài đặt, hãy khởi chạy daemon:

sudo service clickhouse-server start
sudo service clickhouse-server status

Cách 2: Sử dụng Docker Compose

Docker hoàn hảo để thử nghiệm cục bộ mà không làm xáo trộn các thư viện hệ thống. Nó cũng giúp quản lý ulimits—thứ mà ClickHouse rất nhạy cảm—trở nên dễ dàng hơn nhiều. Hãy tạo một tệp docker-compose.yml:

services:
  clickhouse:
    image: clickhouse/clickhouse-server:latest
    container_name: clickhouse-server
    ports:
      - "8123:8123"
      - "9000:9000"
    ulimits:
      nofile:
        soft: 262144
        hard: 262144
    volumes:
      - ./ch_data:/var/lib/clickhouse
      - ./ch_logs:/var/log/clickhouse-server

Chạy docker-compose up -d và nút hiệu năng cao của bạn đã sẵn sàng.

Cấu hình phiên bản ClickHouse

Cấu hình thường sử dụng XML, mặc dù các phiên bản hiện đại hiện đã hỗ trợ YAML. Bạn sẽ tìm thấy logic cốt lõi trong /etc/clickhouse-server/config.xml cho các cài đặt toàn hệ thống và users.xml cho quyền hạn và hạn ngạch tài nguyên.

Lắng nghe trên mọi giao diện mạng

Theo mặc định, ClickHouse chỉ lắng nghe trên localhost để bảo mật. Để kết nối từ bảng điều khiển Grafana hoặc một backend bên ngoài, hãy tìm thẻ <listen_host> trong config.xml và bỏ chú thích nó:

<!-- /etc/clickhouse-server/config.xml -->
<listen_host>0.0.0.0</listen_host>

Quản lý bộ nhớ và ngăn ngừa lỗi OOM

Bộ nhớ là tài nguyên mà ClickHouse sẽ tiêu thụ một cách triệt để. Nếu bạn đang dùng VPS có 16GB RAM, một truy vấn mất kiểm soát có thể kích hoạt trình hủy tiến trình OOM (Out of Memory) và làm sập cơ sở dữ liệu. Hãy bảo vệ tiến trình bằng cách thiết lập giới hạn cứng trong users.xml dưới hồ sơ mặc định:

<!-- /etc/clickhouse-server/users.xml -->
<max_memory_usage>12000000000</max_memory_usage> <!-- Giới hạn 12GB -->

Mẹo nhỏ: Làm sạch dữ liệu trước khi nhập

Làm sạch dữ liệu thường là phần tẻ nhạt nhất trong quy trình. Khi tôi cần chuyển đổi các tệp xuất CSV lộn xộn thành JSON sạch, tôi sử dụng toolcraft.app/vi/tools/data/csv-to-json. Nó chạy hoàn toàn trong trình duyệt của bạn. Điều này đảm bảo không có dữ liệu nhạy cảm nào rời khỏi máy khi bạn chuẩn bị các bản ghi cho định dạng JSONEachRow format.

Xác minh và Giám sát

clickhouse-client là giao diện chính của bạn. Nó nhanh hơn và nhiều tính năng hơn các trình shell SQL tiêu chuẩn, thường trả về metadata của hàng tỷ dòng chỉ trong chớp mắt.

clickhouse-client --password your_password

-- Tạo cơ sở dữ liệu
CREATE DATABASE itfromzero;

-- Tạo bảng với engine MergeTree
CREATE TABLE itfromzero.web_logs (
    event_date Date,
    event_time DateTime,
    ip String,
    url String,
    status UInt16
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(event_date)
ORDER BY (event_date, url);

Engine MergeTree là “ngựa chiến” ở đây. Nó tự động nén dữ liệu ngay lập tức, thường đạt tỷ lệ nén 10:1 hoặc thậm chí 40:1. Điều này giúp giảm đáng kể chi phí lưu trữ so với các kho lưu trữ dạng dòng truyền thống.

Kiểm tra sức khỏe hệ thống

Tính năng giám sát được tích hợp trực tiếp vào các bảng hệ thống. Bạn có thể chẩn đoán các vấn đề hiệu năng mà không cần cài đặt thêm các agent phụ trợ. Tôi sử dụng hai truy vấn này thường xuyên:

-- Xác định các truy vấn đang chạy tiêu tốn nhiều tài nguyên
SELECT query_id, user, elapsed, query, read_rows, formatReadableSize(read_bytes) as data_read
FROM system.processes;

-- Kiểm tra dung lượng đĩa vật lý thực tế của từng bảng
SELECT table, formatReadableSize(sum(bytes_on_disk)) AS total_size
FROM system.parts
WHERE active
GROUP BY table;

Nếu một truy vấn có vẻ chậm chạp, hãy nhìn vào cột read_rows. Đọc quá nhiều dữ liệu thường có nghĩa là khóa ORDER BY của bạn không hiệu quả. Trong ClickHouse, khóa chính quyết định thứ tự sắp xếp vật lý trên đĩa. Thiết lập đúng khóa này là bí quyết để chuyển từ trạng thái “đủ nhanh” sang “phản hồi tức thì”.

Chuyển sang ClickHouse mang lại cảm giác giống như đổi một chiếc xe gia đình lấy một động cơ phản lực. Có thể mất một tuần để bạn quen với tư duy lưu trữ dạng cột, nhưng một khi bạn thấy một truy vấn tổng hợp phức tạp trên một tỷ dòng hoàn tất trong 0,05 giây, bạn sẽ không bao giờ muốn quay lại nữa.

Share: