Giới Thiệu
Theo cách cài đặt Apache Kafka truyền thống thì chúng ta phải cài đặt thêm cụm ZooKeeper để thực hiện các công việc quan trọng như lưu trữ metadata, quản lý broker, kiểm soát các topic và giám sát cấu hình cụm. Tuy nhiên, sự phức tạp của việc duy trì đồng thời cụm ZooKeeper cùng với cụm Kafka đã trở nên rõ ràng theo thời gian, ngoài ra tương tác giữa Kafka và Zookeeper có thể tạo ra độ trễ, đặc biệt trong các cụm lớn hoặc khi có nhiều cập nhật metadata. Đặc biệt về Khả năng chịu lỗi, nếu Zookeeper gặp sự cố hoặc không ổn định, cả cụm Kafka có thể bị ảnh hưởng nghiêm trọng. Và để giải quyết các vấn đề đó thì KAFKA đã cho ra mắt KRAFT, một cách mới để xử lý metadata trong chính kafka đó chính là sử dụng một giao thức Raft để quản lý metadata và thực hiện bầu chọn leader.
Như bạn có thể thấy thì metadata được lưu chính kafka thông qua thư mục “cluster_metadata”. Nếu bạn tò mò metadata lưu như thế nào thì truy cập vào path mà bạn lưu data của kafka để xem nhé. Ví dụ của mình như sau
root@dbb-u22:/opt/data-kafka/__cluster_metadata-0# ls -la total 54916
drwxr-xr-x 2 root root 8192 Nov 30 22:42 .
drwxr-xr-x 6 root root 285 Nov 30 23:11 ..
-rw-r--r-- 1 root root 10485760 Nov 30 23:11 00000000000000000000.index
-rw-r--r-- 1 root root 38984994 Nov 30 23:11 00000000000000000000.log
-rw-r--r-- 1 root root 10485756 Nov 30 23:11 00000000000000000000.timeindex
-rw-r--r-- 1 root root 10 Nov 27 20:41 00000000000000005109.snapshot
-r-------- 1 root root 954 Nov 27 21:41 00000000000000012341-0000000215.checkpoint
-r-------- 1 root root 954 Nov 27 22:41 00000000000000019539-0000000215.checkpoint
-r-------- 1 root root 1470 Nov 27 23:41 00000000000000026744-0000000215.checkpoint
-r-------- 1 root root 1470 Nov 28 00:41 00000000000000033965-0000000216.checkpoint
...
-rw-r--r-- 1 root root 72 Nov 27 23:43 leader-epoch-checkpoint
-rw-r--r-- 1 root root 43 Nov 27 19:59 partition.metadata
-rw-r--r-- 1 root root 159 Nov 27 23:43 quorum-state
Cài đặt
Để an toàn thì chúng ta cần tạo một user mới đẻ chạy services kafka.
sudo adduser kafka
sudo adduser kafka sudo
Chọn và tải về kafka qua đường dẫn sau: https://downloads.apache.org/kafka
wget https://archive.apache.org/dist/kafka/3.9.0/kafka_2.13-3.9.0.tgz
Giải nén tệp vừa tải về.
tar xzf kafka_2.13-3.9.0.tgz
mv kafka_2.13-3.9.0 /opt/kafka/
Cấu hình các node, di chuyển đến thư mục vừa giải nén
nano /opt/kafka/config/kraft/server.properties
Tìm các dòng sau
...
# The role of this server. Setting this puts us in KRaft mode
process.roles=broker,controller # The node id associated with this instance's roles
node.id=1 # The connect string for the controller quorum
controller.quorum.voters=1@localhost:9092
...
Ba tham số này cấu hình nút Kafka để hoạt động như cả broker và controller , nghĩa là nó sẽ nhận và sử dụng dữ liệu (broker) và thực hiện các tác vụ quản trị (controller). node.id dùng để chỉ định ID của nút trong cụm. Tất cả các nút phải có ID nút duy nhất, ở đây mình có 3 node và sẽ dùng ID lần lượt là 1,2 và 3. controller.quorum.voters Đây là nơi bạn sẽ chỉ định địa chỉ của tất cả các node để mỗi node đều biết tất cả các node khác.
...
controller.quorum.voters=1@kafka1.your_domain:9093,2@kafka2.your_domain:9093,3@kafka3.your_domain:9093
...
listeners định nghĩa các địa chỉ mà Kafka lắng nghe, đồng thời advertised.listeners chỉ định các địa chỉ mà các máy khác kết nối tới.
...
listeners=PLAINTEXT://kafka1.your_domain:9092,CONTROLLER://kafka1.your_domain:9093 # Name of listener used for communication between brokers.
inter.broker.listener.name=PLAINTEXT # Listener name, hostname and port the broker will advertise to clients.
# If not set, it uses the value for "listeners".
advertised.listeners=PLAINTEXT://kafka1.your_domain:9092
...
Thiết lập đường dẫn lưu trữ data của kafka, mình sẽ dùng một ổ đĩa mới mount đường dẫn tách riêng với OS để lưu data của kafka
############################# Log Basics ############################# # A comma separated list of directories under which to store log files
log.dirs=/opt/data-kafka
Để đảm bảo tính sẵng sàng cho cụm, chỉnh sửa các thông số sau để dảm bảo rằng tất cả các node trên cụm đều được đồng bộ metadata, tại đây mình set là 3 vì cụm mình có 3 node và đảm bảo mỗi node đều giữ metadata.
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=3
Tiếp theo tạo một ID cho cụm mới bằng lệnh sau
cd /opt/kafka
bin/kafka-storage.sh random-uuid
Đầu ra có dạng như sau
chd94Dq-T0qyTIpxFk5o9Q
Lưu lại giá trị này dùng để khởi tạo cho node 2 và 3. Cuối cùng chạy lệnh sau để hoàn thành setup cho cụm.
cd /opt/kafka
bin/kafka-storage.sh format -t $ID_vừa_tạo -c config/kraft/server.properties
Kết quả như sau
Output...
Formatting /home/kafka/kafka-logs with metadata.version 3.7-IV4.
Thực hiện cấu hình lần lượt và làm tương tự với các node 2 và 3, nhớ thay thế node.id của mỗi cụm nhé
Tiếp đến tạo file services để chạy kafka
nano /etc/systemd/system/kafka.service [Unit]
Description=Apache Kafka Server
Documentation=http://kafka.apache.org/documentation.html
[Service]
Type=simple
ExecStart=/opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/kraft/server.properties
ExecStop=/opt/kafka/bin/kafka-server-stop.sh
Restart=on-abnormal
StandardOutput=append:/var/log/kafka/kafka.log
tandardError=append:/var/log/kafka/kafka.log
User=kafka
Group=kafka
LimitNOFILE=128000
LimitMEMLOCK=infinity
RestartSec=10
Restart=always
[Install]
WantedBy=multi-user.target
Start lần lượt services trên các node lên thôi.
sudo systemctl start kafka
Dùng CLI để kiểm tra trạng thái cụm
cd /opt/kafka
bin/kafka-metadata-quorum.sh --bootstrap-controller kafka1.your_domain:9093 describe --status
Kết quả sẽ tương tự như thế này:
ClusterId: 9HfEqOkqTe-gu_TjSlOiUw
LeaderId: 65
LeaderEpoch: 216
HighWatermark: 554531
MaxFollowerLag: 0
MaxFollowerLagTimeMs: 0
CurrentVoters: [{"id": 65, "directoryId": null, "endpoints": ["CONTROLLER://kafka65:9093"]}, {"id": 66, "directoryId": null, "endpoints": ["CONTROLLER://kafka66:9093"]}, {"id": 59, "directoryId": null, "endpoints": ["CONTROLLER://kafka59:9093"]}]
CurrentObservers: []
Trong kết quả này, bạn có thể thấy là node có id là 65 đang là leader và 3 node trong cụm của mình đã kết nối thành công. Như vậy là chúng ta đã cài đặt xong 1 cụm kafka sử dụng kraft, nếu bạn có thắc mắc ở phần cài đặt thì để lại bình luận nhé. Trong phần tới mình sẽ viết bài dùng kafka-ui để quản lý các topic và dùng các công cụ grafana, prometheus để giám sát kafka.