Tổng quan về Apache Kafka
Apache Kafka là một nền tảng phân tán mã nguồn mở được thiết kế để xử lý các luồng dữ liệu theo thời gian thực với tốc độ cao và khả năng mở rộng linh hoạt. Được phát triển ban đầu bằng ngôn ngữ Scala và Java, Kafka giải quyết các vấn đề cốt lõi trong hệ thống phân tán như quản lý dữ liệu hoạt động (Activity Stream), pipeline xử lý dữ liệu và log aggregation. Khác với các hệ thống nhắn tin truyền thống, Kafka ưu tiên tối đa hóa throughput (lượng dữ liệu xử lý trên đơn vị thời gian) hơn là hỗ trợ các tính năng phức tạp như giao dịch (transaction) chuẩn ACID hay tuân thủ nghiêm ngặt giao thức AMQP.
Kiến trúc hệ thống và các khái niệm cốt lõi
Kafka hoạt động dựa trên mô hình Producer-Consumer, nơi dữ liệu được truyền tải qua một lớp trung gian là Broker cluster. Các thành phần chính bao gồm:
- Producer (Nhà sản xuất): Ứng dụng gửi dữ liệu vào Kafka.
- Broker (Môi giới): Các nút máy chủ trong cụm Kafka chịu trách nhiệm lưu trữ và phục vụ dữ liệu.
- Consumer (Người tiêu thụ): Ứng dụng đọc và xử lý dữ liệu từ Kafka.
Dữ liệu trong Kafka được tổ chức thành Topic (Chủ đề). Mỗi Topic được chia nhỏ thành nhiều Partition (Phân vùng) để cho phép xử lý song song và tăng hiệu năng. Partition là đơn vị nhỏ nhất của việc lưu trữ và hoạt động như một hàng đợi FIFO (Nhập trước, Xuất trước). Để đảm bảo tính sẵn sàng cao, mỗi Partition có thể được sao chép (Replicated) sang nhiều Broker khác nhau, giúp tránh mất dữ liệu khi một node gặp sự cố.
Thiết lập cụm Zookeeper
Kafka phụ thuộc vào Zookeeper để quản lý trạng thái phân tán, điều phối và lưu trữ metadata. Do đó, bước đầu tiên là triển khai một cụm Zookeeper ổn định.
1. Chuẩn bị môi trường
Cụm Zookeeper yêu cầu số lượng máy chủ lẻ (ví dụ: 3 máy) để đảm bảo khả năng bỏ phiếu (quorum). Mỗi máy cần cài đặt Java Runtime Environment (JRE).
# Cài đặt Java (Ví dụ trên hệ điều hành CentOS/RHEL)
sudo yum install -y java-1.8.0-openjdk-devel
2. Cấu hình Zookeeper
Tải giải nén Zookeeper và tạo cấu trúc thư mục dữ liệu.
# Tạo thư mục dữ liệu
sudo mkdir -p /var/lib/zookeeper/data
sudo mkdir -p /var/lib/zookeeper/logs
# Tải và giải nén (Giả sử dùng phiên bản 3.4.14)
cd /usr/local
wget http://archive.apache.org/dist/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
tar -xzf zookeeper-3.4.14.tar.gz
cd zookeeper-3.4.14
Tạo file cấu hình conf/zoo.cfg:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/var/lib/zookeeper/data
dataLogDir=/var/lib/zookeeper/logs
clientPort=2181
server.1=192.168.1.10:2888:3888
server.2=192.168.1.11:2888:3888
server.3=192.168.1.12:2888:3888
Trong đó:
tickTime: Đơn vị thời gian tính bằng mili-giây cho heartbeat.server.X: X là ID của server, cần khớp với nội dung filemyid.
Tạo file myid trên từng node tương ứng:
# Node 1
echo "1" | sudo tee /var/lib/zookeeper/data/myid
# Node 2
echo "2" | sudo tee /var/lib/zookeeper/data/myid
# Node 3
echo "3" | sudo tee /var/lib/zookeeper/data/myid
3. Dọn dẹp dữ liệu tự động
Zookeeper không xóa log và snapshot cũ theo mặc định, dẫn đến đầy đĩa. Bạn có thể cấu hình tự động dọn dẹp trong zoo.cfg:
autopurge.snapRetainCount=3
autopurge.purgeInterval=24
Triển khai cụm Kafka Cluster
Sau khi Zookeeper đã sẵn sàng, chúng ta tiến hành cài đặt Kafka trên các node.
1. Cài đặt và cấu hình cơ bản
Tải và giải nén Kafka binary.
cd /usr/local
wget http://archive.apache.org/dist/kafka/2.1.0/kafka_2.11-2.1.0.tgz
tar -xzf kafka_2.11-2.1.0.tgz
cd kafka_2.11-2.1.0
Chỉnh sửa file cấu hình config/server.properties. Mỗi node cần có broker.id duy nhất.
# ID duy nhất cho mỗi broker (0, 1, 2...)
broker.id=0
# Cổng lắng nghe kết nối
listeners=PLAINTEXT://192.168.1.10:9092
# Thư mục lưu trữ log message
log.dirs=/usr/local/kafka-logs
# Số lượng partition mặc định
num.partitions=2
# Thời gian lưu trữ log (giờ)
log.retention.hours=168
# Kích thước tối đa của segment log
log.segment.bytes=1073741824
# Kết nối tới cụm Zookeeper
zookeeper.connect=192.168.1.10:2181,192.168.1.11:2181,192.168.1.12:2181
2. Khởi động dịch vụ
Sử dụng lệnh sau để khởi động Kafka dưới dạng daemon (background process) trên tất cả các nodes:
bin/kafka-server-start.sh -daemon config/server.properties
Kiểm tra process đang chạy:
jps -lm
# Kết quả mong đợi: ... kafka.Kafka
3. Kiểm thử hoạt động
Tạo một Topic mới tên là test-cluster với 1 partition và 2 bản sao (replication-factor):
bin/kafka-topics.sh --create --zookeeper 192.168.1.10:2181 \
--replication-factor 2 --partitions 1 --topic test-cluster
Kiểm tra danh sách Topic:
bin/kafka-topics.sh --list --zookeeper 192.168.1.10:2181
Mô phỏng Producer gửi dữ liệu:
bin/kafka-console-producer.sh --broker-list 192.168.1.10:9092 --topic test-cluster
# Nhập dữ liệu và nhấn Enter
Mô phỏng Consumer nhận dữ liệu:
bin/kafka-console-consumer.sh --bootstrap-server 192.168.1.10:9092 \
--topic test-cluster --from-beginning
4. Quản lý và vận hành
Kafka lưu trữ metadata trên Zookeeper. Bạn có thể kiểm tra trạng thái cụm bằng cách kết nối vào Zookeeper CLI:
/usr/local/zookeeper-3.4.14/bin/zkCli.sh -server 192.168.1.10:2181
Để xem danh sách các broker đang hoạt động:
ls /brokers/ids
Để xem chi tiết về một Topic cụ thể và các partition:
get /brokers/topics/test-cluster