Cài đặt và cấu hình Zookeeper cho Kafka
Zookeeper là thành phần quản lý cấu hình và phối hợp (coordination) bắt buộc cho Kafka. Nó lưu trữ metadata của cluster, vị trí partition leader và danh sách broker.
Trên Ubuntu 24.04, ta sẽ sử dụng Zookeeper Standalone để đơn giản hóa việc triển khai ban đầu, chuẩn bị cho việc mở rộng sau này.
Tải và cài đặt Zookeeper
Trước tiên, cần tải bản phân phối Apache Zookeeper từ trang chủ. Phiên bản 3.8.x tương thích tốt với Kafka 3.x.
sudo apt update
sudo apt install wget curl -y
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.8.3/apache-zookeeper-3.8.3-bin.tar.gz
tar -xvf apache-zookeeper-3.8.3-bin.tar.gz
sudo mv apache-zookeeper-3.8.3-bin /opt/zookeeper
sudo ln -s /opt/zookeeper /opt/zookeeper-latest
Kết quả mong đợi: Thư mục /opt/zookeeper được tạo và chứa các file bin, conf của Zookeeper.
Cấu hình Zookeeper (zoo.cfg)
Cấu hình Zookeeper cần chỉ định port mặc định (2181) và thư mục lưu trữ dữ liệu (dataDir). Với cluster đơn nút, ta chỉ cần một node.
Chỉnh sửa file cấu hình tại đường dẫn đầy đủ:
sudo nano /opt/zookeeper/conf/zoo.cfg
Dán toàn bộ nội dung sau vào file (xóa nội dung cũ nếu có):
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
admin.enableServer=false
Kết quả mong đợi: File zoo.cfg được lưu, cấu hình port 2181 sẵn sàng cho kết nối client.
Khởi động Zookeeper
Tạo thư mục data nếu chưa tồn tại và khởi động server Zookeeper. Cần chạy dưới quyền root hoặc user có quyền truy cập thư mục data.
sudo mkdir -p /var/lib/zookeeper
sudo chown -R $USER:$USER /var/lib/zookeeper
/opt/zookeeper/bin/zkServer.sh start
Kiểm tra trạng thái:
sudo systemctl status zookeeper 2>/dev/null || /opt/zookeeper/bin/zkServer.sh status
Kết quả mong đợi: Dòng "Mode: standalone" xuất hiện, báo hiệu Zookeeper đang chạy và sẵn sàng.
Cài đặt và cấu hình Apache Kafka
Sau khi Zookeeper ổn định, ta tiến hành cài đặt Kafka. Đây là core engine xử lý luồng sự kiện (event stream).
Tải và cài đặt Kafka
Tải Kafka phiên bản tương thích (3.6.x) và giải nén vào thư mục /opt/kafka.
cd /tmp
wget https://archive.apache.org/dist/kafka/3.6.1/kafka_2.13-3.6.1.tgz
tar -xvf kafka_2.13-3.6.1.tgz
sudo mv kafka_2.13-3.6.1 /opt/kafka
sudo ln -s /opt/kafka /opt/kafka-latest
Kết quả mong đợi: Thư mục /opt/kafka chứa các script khởi động trong thư mục bin.
Cấu hình Kafka Server (server.properties)
File server.properties là nơi định nghĩa hành vi của Kafka broker. Cần cấu hình ID, đường dẫn log, kết nối Zookeeper và các tham số bảo mật cơ bản.
Chỉnh sửa file tại đường dẫn đầy đủ:
sudo nano /opt/kafka/config/server.properties
Xóa nội dung cũ và thay thế hoàn toàn bằng cấu hình sau (đã được tối ưu cho môi trường Ubuntu 24.04 và chuẩn bị cho bảo mật SASL):
broker.id=0
listeners=PLAINTEXT://0.0.0.0:9092,SASL_PLAINTEXT://0.0.0.0:9093
advertised.listeners=PLAINTEXT://localhost:9092,SASL_PLAINTEXT://localhost:9093
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/var/lib/kafka/data
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=localhost:2181
zookeeper.connection.timeout.ms=18000
group.initial.rebalance.delay.ms=0
sasl.enabled.protocol=PLAIN
listeners.security.protocol.map=PLAINTEXT:PLAINTEXT,SASL_PLAINTEXT:SASL_PLAINTEXT
authorizer.class.name=kafka.security.authenticator.AclAuthorizer
Kết quả mong đợi: File server.properties được lưu với cấu hình 2 listeners (cơ bản và bảo mật), chuẩn bị cho việc bật ACL.
Tạo thư mục dữ liệu và quyền
Kafka cần quyền ghi vào thư mục lưu log. Nếu không tạo trước, server sẽ crash khi khởi động.
sudo mkdir -p /var/lib/kafka/data
sudo chown -R $USER:$USER /var/lib/kafka/data
Kết quả mong đợi: Thư mục /var/lib/kafka/data được tạo và user hiện tại có quyền truy cập.
Cấu hình bảo mật cơ bản (ACL và SASL/PLAINTEXT)
Để bảo vệ topic và đảm bảo chỉ user được phép mới sản xuất/đọc sự kiện, ta cần bật SASL PLAINTEXT và ACL.
Tạo file credentials (user.properties)
Kafka cần một file chứa username và password để xác thực (SASL). Chúng ta sẽ tạo file này để dùng cho cả Producer và Consumer.
sudo nano /opt/kafka/config/user.properties
Nội dung file:
admin=admin-secret
app-user=app-user-secret
Kết quả mong đợi: File user.properties được lưu, chứa cặp username/password.
Cấu hình JAAS (Java Authentication and Authorization Service)
Để Kafka đọc file user.properties, cần cấu hình JAAS trong server.properties. Tuy nhiên, để đơn giản trong bước khởi động, ta sẽ truyền tham số vào command line hoặc tạo file JAAS riêng.
Tạo file JAAS cho server:
sudo nano /opt/kafka/config/kafka_server_jaas.conf
Nội dung file:
KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin-secret"
user_admin="admin-secret"
user_app-user="app-user-secret";
};
Cập nhật server.properties để trỏ đến file JAAS này:
echo 'sasl.mechanism.inter.broker.protocol=PLAIN' >> /opt/kafka/config/server.properties
echo 'sasl.enabled.protocol=PLAIN' >> /opt/kafka/config/server.properties
echo 'listener.name.sasl_plaintext.sasl.mechanism=PLAIN' >> /opt/kafka/config/server.properties
echo 'authorizer.class.name=kafka.security.authorizer.AclAuthorizer' >> /opt/kafka/config/server.properties
Kết quả mong đợi: Server.properties đã được bổ sung các tham số xác thực và phân quyền.
Cấp quyền ACL (Access Control List)
Trước khi khởi động Kafka, ta cần cấp quyền mặc định cho user "admin" để quản lý, và "app-user" để đọc/giấy topic. Ta dùng script kafka-acls.sh sau khi server chạy, nhưng để đảm bảo server chạy được trước, ta cấp quyền toàn cầu cho admin.
Đợi server chạy (bước sau), thực hiện lệnh cấp quyền. Ở đây ta ghi sẵn script để chạy ngay sau khi khởi động.
Khởi động và kiểm tra trạng thái Kafka
Bây giờ tiến hành khởi động Kafka với file JAAS đã cấu hình.
Khởi động Kafka Server
Chạy Kafka server với tham số JAAS. Cần đảm bảo Zookeeper đã chạy trước.
cd /opt/kafka
JAUTHCONFIG=/opt/kafka/config/kafka_server_jaas.conf /opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.properties &
Chờ khoảng 30-60 giây để Kafka khởi động hoàn tất và kết nối Zookeeper.
Kết quả mong đợi: Không có lỗi Fatal, xuất hiện dòng "Kafka Server started".
Thiết lập ACL sau khi khởi động
Bây giờ ta cấp quyền cụ thể cho topic "events" (sẽ dùng cho Event Sourcing). Cấp quyền Write cho app-user và Read cho app-user.
JAUTHCONFIG=/opt/kafka/config/kafka_server_jaas.conf /opt/kafka/bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:app-user --operation Write --topic events
JAUTHCONFIG=/opt/kafka/config/kafka_server_jaas.conf /opt/kafka/bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:app-user --operation Read --topic events
JAUTHCONFIG=/opt/kafka/config/kafka_server_jaas.conf /opt/kafka/bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:admin --operation All --topic "*"
Kết quả mong đợi: Thông báo "ACL created successfully" xuất hiện cho mỗi lệnh.
Kiểm tra trạng thái Cluster và Topic
Verify rằng Kafka đã tạo topic "events" và các broker đang hoạt động trên cả port 9092 và 9093.
/opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --list
/opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9093 --list
/opt/kafka/bin/kafka-consumer-groups.sh --bootstrap-server localhost:9093 --describe --all-groups
Kết quả mong đợi: Danh sách topic xuất hiện (có thể trống nếu chưa tạo), không bị lỗi "Authentication failed" khi dùng port 9093.
Tạo Topic Events cho Event Sourcing
Tạo topic "events" với 3 partition để đảm bảo khả năng song song (parallelism) khi replay event.
JAUTHCONFIG=/opt/kafka/config/kafka_server_jaas.conf /opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9093 --create --topic events --partitions 3 --replication-factor 1 --config cleanup.policy=delete --config min.insync.replicas=1
Kiểm tra lại topic đã được tạo:
JAUTHCONFIG=/opt/kafka/config/kafka_server_jaas.conf /opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9093 --describe --topic events
Kết quả mong đợi: Hiển thị thông tin topic "events" với 3 partition và 1 replica.
Đ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 1: Chuẩn bị môi trường Ubuntu 24.04 và kiến thức nền tảng
Phần 3: Thiết kế Schema và quản lý dữ liệu với Schema Registry »