Apache Kafka Report - NOSQL-2017/seminar-1312393-1312024 GitHub Wiki
1. Giới thiệu: (về đầu trang)
Apache Kafka là một hệ thống xử lý hàng đợi theo cơ chế publish-subscribe; Kafka còn hỗ trợ triển khai hệ thống thu thập log theo mô hình phân tán (distribute), phân chia (partition), và đồng bộ (replicate). Mã nguồn Kafka được thiết kế cho việc xử lý dữ liệu lớn khi đọc/ghi dữ liệu, giảm độ trễ trong quá trình truyền tải dữ liệu.
Kafka là hệ thống logging lưu lại các trạng thái của hệ thống, nhằm phòng tránh mất thông tin khi hệ thống gặp sự cố.
2. Các khái niệm cơ bản:(về đầu trang)
- Kafka lưu, phân loại message theo topics.
- Kafka sử dụng producers để publish (pub) message vào các topics ở trên
- Kafka sử dụng consumers để subscribe (sub) vào topics, sau đó xử lý các message lấy được theo một logic nào đó
- Kafka thường được chạy dưới dạng cluster, khi đó mỗi server trong đó sẽ được gọi là broker
Việc truyền tải dữ liệu giữa các hệ thống khác với Kafka broker được thực hiện thông qua giao thức TCP; việc phát triển, phân tích dữ liệu có thể thực hiện trên nhiều nền tảng ngôn ngữ lập trình khác nhau.
Topic có thể hiểu là một ngôn ngữ chung giữa producer (người nói) và consumer (người nghe, sử dụng).
Với mỗi topic, kafka sẽ duy trì thông qua partitioned log như hình sau:
Mỗi partition là một chuỗi log, có thứ tự và không thể thay đổi.
Mỗi message trong partition sẽ có id tăng dần , gọi là offset.
Kafka cluster sẽ lưu lại mọi message đã được publish, cho dù message đó đã được sử dụng hay chưa. Thời gian lưu message có thể tuỳ chỉnh được thông qua log retention.
Một điểm thú vị là Consumer sẽ điều khiển những gì mình muốn đọc thông qua offset của message, hay thậm chí là thứ tự đọc. Consumer có thể reset lại vị trí của offset để re-process lại một vài message nào đó.
Message được gửi bởi producer đến một topic partition nào đó sẽ được đảm bảo thứ tự , thông qua offset
Producer có nhiệm vụ chính là đẩy message vào topic. Cụ thể hơn là producer chọn message nào để đẩy vào partition nào trong topic. Nhiệm vụ này rất quan trọng, giúp cho kafka có khả năng “scale” tốt.
Thông thường thì một hệ thống messaging sẽ có 2 loại
Queue: Một message sẽ được xử lý bời một consumer
Pub/Sub: Một message sẽ được xử lý bởi một vài consumer thích hợp, tuỳ theo topic
Với Kafka chúng ta có consumer group giúp chúng ta có thể làm được đồng thời cả 2 loại trên. Việc subscribe một topic sẽ được thực hiện bởi consumer group. Mỗi một message sẽ được gửi cho “duy nhất” một consumer instance trong một consumer group. Vậy:
Nếu nhiều consumer instance cùng group: chúng ta sẽ có một hệ thống queue
Nếu mỗi instance là một group, chúng ta sẽ có một hệ thống pub/sub
Kafka đảm bảo consumer instance sẽ “nhìn thấy” message theo đúng thứ tự trong log
3. Use case (về đầu trang)
- Tracking hành động người dùng: các thông số như page view, search action của user sẽ được publish vào một topic và sẽ được xử lý sau
- Log Aggregration: log sẽ được gửi từ nhiều server về một nơi thống nhất, sau đó có thể được làm sạch và xử lý theo một logic nào đó
- Event-Sourcing: Lưu lại trạng thái của hệ thống để có thể phục hồi trong trường hợp system gặp sự cố.
4. Cài đặt (về đầu trang)
Download kafka từ 1 trong số các link ở đây
Kafka là một ứng dụng Scala (chạy trên Java Virtual Machine – JVM) nên chỉ cần máy cài sẵn java là hoàn toàn có thể chạy một cách dễ dàng. Nếu máy chưa cài đặt JVM, có thể cài đặt bằng 2 lệnh:
sudo apt-get install default-jre
sudo apt-get install default-jdk
Sau khi download từ link ở trên thì giải nén vào đâu đó:
tar -xzf kafka_2.10-0.8.2.0.tgz
cd kafka_2.10-0.8.2.0
5. Start Server (về đầu trang)
Trong bộ cài đặt của Kafka có kèm theo sẵn Zookeeper nên ta có thể start server Zookeeper từ đó:
bin/zookeeper-server-start.sh config/zookeeper.properties
Tiếp theo là start server Kafka:
bin/kafka-server-start.sh config/server.properties
6. Ví dụ sử dụng Kafka để gửi message và show các message (về đầu trang)
Đầu tiên (sau khi đã start server Zookeeper và Kafka), các chức năng đều được lưu trữ ở thư mục kafka_2.10-0.8.2.0/bin (hoặc kafka_2.10-0.8.2.0/bin/Windows nếu chạy trên Windows) nên ta dẫn vào thư mục này:
cd kafka_2.10-0.8.2.0/bin
Tạo topic, tên demoak
:
kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic demoak
Test thử xem topic đã được tạo hay chưa:
kafka-topics.sh --list --zookeeper localhost:2181
Đẩy messages vào topic (lúc này topic sẽ được mở), ta có thể nhập message bất kỳ sau khi thực hiện lệnh:
kafka-console-producer.sh --broker-list localhost:9092 --topic demoak
Show các messages đã được đẩy vào trong topic từ lúc bắt đầu, ta mở 1 cửa sổ console khác, dẫn về thư mục như trên và thực hiện lệnh:
kafka-console-consumer.sh --zookeeper localhost:2181 --topic demoak --from-beginning
Sau khi thực hiện lệnh thì các messages sẽ được hiển thị trên console.