Yêu cầu phần cứng tối thiểu cho Kafka và Database
Trước khi bắt đầu cài đặt, bạn cần đảm bảo server Ubuntu 24.04 của mình đáp ứng các yêu cầu phần cứng tối thiểu để Kafka và Database chạy ổn định trong môi trường phát triển hoặc test.
Kafka là ứng dụng Java nặng về bộ nhớ và I/O disk. Nếu tài nguyên không đủ, broker sẽ bị treo hoặc crash ngay khi có lượng event tăng đột biến.
- CPU: Tối thiểu 4 Cores (Khuyến nghị 8 Cores cho môi trường Production). Kafka sử dụng nhiều luồng I/O, cần CPU mạnh để xử lý compression và replication.
- RAM: Tối thiểu 8GB. 4GB dành cho Java Heap của Kafka, 2GB cho OS, 2GB dự phòng cho Database (PostgreSQL/MySQL) và các tiến trình khác.
- Storage: Tối thiểu 100GB SSD (Nên dùng NVMe). Kafka ghi log liên tục, tốc độ write của HDD cơ học sẽ là nút cổ chai lớn nhất.
- Network: Băng thông 1Gbps ổn định. Kafka hoạt động dựa trên mạng, độ trễ (latency) cao sẽ làm chậm quá trình replication giữa các broker.
Để kiểm tra cấu hình hiện tại của server Ubuntu 24.04, chạy các lệnh sau để xác nhận phần cứng đáp ứng yêu cầu:
lscpu | grep "Model name" && free -h && df -h /
Kết quả mong đợi: Bạn thấy số core CPU >= 4, tổng RAM >= 8GB (dùng < 50%), và dung lượng trống trên partition / >= 100GB.
Cài đặt Ubuntu 24.04 và cập nhật hệ thống
Giả sử bạn đã cài đặt Ubuntu 24.04 LTS từ ISO hoặc Cloud Image. Bước đầu tiên là nâng cấp toàn bộ các gói hệ thống lên phiên bản mới nhất để đảm bảo bảo mật và tương thích với Java 21.
Cập nhật bảng danh sách gói (package list) và nâng cấp các gói đã cài đặt. Việc này giúp sửa các lỗ hổng bảo mật và cập nhật kernel mới nhất.
sudo apt update && sudo apt upgrade -y
Kết quả mong đợi: Terminal hiển thị dòng Reading package lists... và 0 upgraded, 0 newly installed (nếu đã mới) hoặc danh sách các gói đã được nâng cấp. Không có lỗi (Error) hoặc Warning về dependency.
Cài đặt các công cụ cơ bản cần thiết cho việc quản lý server (build-essential, git, curl, wget, vim). Những công cụ này sẽ được dùng xuyên suốt series để download Kafka, tạo script và debug.
sudo apt install -y build-essential git curl wget vim net-tools
Kết quả mong đợi: Các gói được cài đặt thành công, terminal hiện thông báo Setting up [package-name]... và kết thúc bằng Processing triggers for....
Cấu hình hostname của server để dễ quản lý và tránh xung đột trong cluster Kafka. Đổi tên server thành kafka-node-1 (hoặc tên bạn muốn).
sudo hostnamectl set-hostname kafka-node-1
Kết quả mong đợi: Không có output lỗi. Sau khi chạy lệnh này, bạn cần đăng xuất (logout) và đăng nhập lại (re-login) để hostname mới hiển thị trong prompt shell.
Cài đặt Java JDK 21 và cấu hình biến môi trường
Kafka phiên bản mới (3.x trở lên) yêu cầu tối thiểu JDK 17, nhưng để tận dụng các tính năng mới và chuẩn bị cho tương lai, chúng ta sẽ cài đặt OpenJDK 21 (LTS). Ubuntu 24.04 có sẵn OpenJDK 21 trong repository mặc định.
Cài đặt OpenJDK 21 và công cụ quản lý package Java. Chúng ta dùng openjdk-21-jdk vì nó nhẹ hơn Oracle JDK và tương thích hoàn toàn với Kafka.
sudo apt install -y openjdk-21-jdk openjdk-21-jre
Kết quả mong đợi: Quá trình cài đặt kéo dài khoảng 1-2 phút. Terminal hiển thị dòng Setting up openjdk-21-jdk... và update-alternatives đang cấu hình các binary java.
Kiểm tra phiên bản Java đã cài đặt để đảm bảo hệ thống nhận diện đúng JDK 21.
java -version
Kết quả mong đợi: Terminal hiển thị dòng openjdk version "21" và OpenJDK Runtime Environment (build 21+...). Nếu thấy version 11 hoặc 17, cần chạy sudo update-alternatives --config java để chọn 21.
Cấu hình biến môi trường JAVA_HOME để Kafka và các công cụ khác có thể tìm thấy đường dẫn JDK chính xác. Trên Ubuntu 24.04, đường dẫn mặc định thường nằm ở /usr/lib/jvm/java-21-openjdk-amd64.
Tạo file cấu hình biến môi trường toàn cục tại /etc/profile.d/java.sh. File này sẽ tự động load khi bạn login vào shell.
sudo nano /etc/profile.d/java.sh
Sao chép và dán nội dung hoàn chỉnh sau vào file /etc/profile.d/java.sh:
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64
export JRE_HOME=$JAVA_HOME/jre
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
echo "Java environment variables set. JAVA_HOME=$JAVA_HOME"
Lưu file (Ctrl+O, Enter) và thoát (Ctrl+X). Sau đó, apply ngay lập tức file cấu hình mà không cần logout.
source /etc/profile.d/java.sh
Kết quả mong đợi: Terminal in ra dòng Java environment variables set. JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64.
Verify lại biến môi trường bằng cách kiểm tra giá trị của JAVA_HOME.
echo $JAVA_HOME && $JAVA_HOME/bin/java -version
Kết quả mong đợi: Dòng đầu tiên trả về đường dẫn JDK 21. Dòng thứ hai chạy thành công và hiển thị version 21, chứng tỏ biến môi trường đã được thiết lập chính xác.
Kiến thức cơ bản về Event Sourcing và vai trò của Kafka
Trước khi triển khai, bạn cần nắm vững mô hình Event Sourcing để hiểu tại sao chúng ta lại cần Kafka và Database trong kiến trúc này.
Event Sourcing là một mô hình lưu trữ trạng thái (State) bằng cách lưu lại toàn bộ lịch sử các sự kiện (Events) đã xảy ra, thay vì chỉ lưu trạng thái hiện tại (Current State). Khi cần trạng thái hiện tại, hệ thống sẽ tái tạo (Replay) lại toàn bộ lịch sử sự kiện từ đầu.
- Traditional Database (CRUD): Lưu trữ State hiện tại. Ví dụ: Cập nhật số dư tài khoản từ 100 lên 50. Lịch sử giao dịch bị ẩn hoặc lưu rời rạc. Nếu dữ liệu bị lỗi, khó khôi phục nguyên trạng cũ.
- Event Sourcing: Lưu trữ Stream của Events. Ví dụ: Sự kiện
AccountCreated (100), sự kiện Deposit (50), sự kiện Withdraw (100). Trạng thái hiện tại là kết quả của việc tính toán: 100 + 50 - 100 = 50.
Vai trò của Apache Kafka trong mô hình Event Sourcing là đóng vai trò là Event Log hoặc Event Bus phân tán.
Kafka không phải là Database quan hệ, nó là một Distributed Commit Log. Các đặc tính của Kafka phù hợp hoàn hảo với Event Sourcing:
- Immutability (Tính bất biến): Một khi Event đã được ghi vào Kafka (append-only), nó không thể bị sửa hay xóa (trừ khi bị purge theo policy retention). Điều này đảm bảo tính toàn vẹn của lịch sử sự kiện.
- Persistence (Lưu trữ bền vững): Kafka lưu trữ data trên disk, không chỉ trong RAM, giúp đảm bảo dữ liệu không mất khi restart broker.
- High Throughput & Replayability: Kafka cho phép ghi và đọc với tốc độ cực cao. Quan trọng hơn, nó cho phép nhiều Consumer (Consumer Groups) đọc lại cùng một luồng sự kiện từ bất kỳ điểm thời gian nào (offset) để tái tạo trạng thái (Replay).
Kiến trúc tổng quan trong Series này:
- Producer: Ứng dụng nghiệp vụ sẽ phát sinh các Event (ví dụ: OrderCreated) và đẩy vào Kafka Topic.
- Kafka: Lưu trữ stream các Event này theo thứ tự thời gian (Ordering) và đảm bảo delivery (At-least-once).
- Consumer (Event Store): Một dịch vụ chuyên biệt sẽ đọc từ Kafka và lưu các Event vào Database (PostgreSQL/MySQL) để tạo thành Event Store chính thức, đồng thời cập nhật Read Model (Projections) cho giao diện UI.
Verify hiểu biết: Hãy tưởng tượng bạn có một Topic Kafka tên là orders. Nếu bạn tạo một đơn hàng với ID 123, sự kiện OrderCreated sẽ được ghi vào Topic này. Nếu bạn cần xem lại lịch sử đơn hàng đó 1 tháng sau, bạn không cần query database trạng thái hiện tại, mà sẽ yêu cầu hệ thống đọc lại log từ Kafka và tái tạo lại trạng thái đó dựa trên các event đã xảy ra.
Điều hướng series:
Mục lục: Series: Triển khai Database Event Sourcing với Apache Kafka và Ubuntu 24.04
Phần 2: Cài đặt và cấu hình Apache Kafka trên Ubuntu »