Kiến trúc của Apache Kafka được thiết kế theo mô hình phân tán và log-based với mục tiêu đảm bảo khả năng mở rộng nhanh chóng, hiệu năng cao và xử lý luồng dữ liệu thời gian thực. Dưới đây là các thành phần chính và kiến trúc tổng quan của Kafka.
1. Thành phần chính của Kafka
- Producer (Nhà sản xuất): Thành phần chịu trách nhiệm gửi tin nhắn (messages) vào các topic trong Kafka. Producers có thể gửi tin nhắn đến một hoặc nhiều topic. Mỗi tin nhắn sẽ được phân loại và ghi vào topic tương ứng.
- Consumer (Nhà tiêu thụ): Thành phần đọc và xử lý tin nhắn từ các topic. Consumers có thể đăng ký một hoặc nhiều topic và đọc tin nhắn từ các phân vùng (partition) trong topic đó. Kafka hỗ trợ mô hình pub/sub (publish-subscribe) cho phép nhiều consumers cùng đọc từ một topic.
- Broker: Broker là máy chủ (hoặc node) trong cụm Kafka chịu trách nhiệm lưu trữ dữ liệu và xử lý các yêu cầu từ các producers và consumers. Mỗi cụm Kafka bao gồm một hoặc nhiều brokers, các broker này hoạt động cùng nhau để quản lý dữ liệu phân tán.
- Topic (Chủ đề): Là nơi lưu trữ các tin nhắn. Một topic có thể được chia thành nhiều phân vùng (partition). Mỗi phân vùng chứa một phần của dữ liệu trong topic, tin nhắn trong mỗi phân vùng được sắp xếp theo thứ tự.
- Partition (Phân vùng): Topic được chia nhỏ thành các phân vùng để tăng khả năng mở rộng và tối ưu hóa hiệu suất. Mỗi phân vùng lưu trữ một tập hợp các tin nhắn dưới dạng log được sắp xếp tuần tự. Mỗi tin nhắn trong phân vùng có một số thứ tự gọi là offset. Offset xác định vị trí của tin nhắn trong phân vùng.
- Zookeeper: Kafka sử dụng Zookeeper để quản lý metadata của cụm (cluster), duy trì thông tin cấu hình và theo dõi trạng thái của các brokers. Tuy nhiên Zookeeper đang dần được thay thế bởi Kafka Raft Metadata (KRaft) để quản lý cụm nội bộ và không cần Zookeeper trong các phiên bản Kafka mới.
- Consumer Group (Nhóm tiêu thụ): Là một tập hợp các consumers làm việc cùng nhau để xử lý tin nhắn từ một hoặc nhiều topic. Mỗi phân vùng chỉ có thể được tiêu thụ bởi một consumer duy nhất trong nhóm, giúp tăng hiệu quả tiêu thụ tin nhắn và bảo đảm rằng mỗi tin nhắn chỉ được xử lý một lần trong nhóm đó.
2. Luồng dữ liệu trong Kafka
- Producer gửi tin nhắn: Producers gửi tin nhắn đến một topic cụ thể. Tin nhắn sẽ được lưu trữ trong một hoặc nhiều phân vùng (partitions) của topic. Kafka cung cấp tùy chọn để producers có thể chỉ định key cho tin nhắn, giúp phân phối tin nhắn vào đúng phân vùng.
- Brokers lưu trữ dữ liệu: Mỗi broker quản lý một hoặc nhiều phân vùng của các topic. Khi tin nhắn được gửi đến, broker chịu trách nhiệm lưu trữ tin nhắn vào ổ đĩa theo thứ tự trong phân vùng tương ứng. Kafka lưu trữ tin nhắn trong một thời gian cấu hình nhất định và không xóa chúng ngay lập tức sau khi tiêu thụ, cho phép consumers có thể đọc lại.
- Consumers đọc tin nhắn: Consumers trong một Consumer Group đọc tin nhắn từ các phân vùng. Mỗi phân vùng chỉ được tiêu thụ bởi một consumer duy nhất trong nhóm để bảo đảm rằng không có tin nhắn nào bị xử lý lặp lại trong nhóm đó. Consumers có thể kiểm soát việc tiêu thụ bằng cách theo dõi offset của phân vùng.
3. Khả năng phân tán và mở rộng của Kafka
- Phân vùng và song song: Kafka dựa trên khái niệm partition để chia nhỏ các topic thành nhiều phần. Mỗi phân vùng có thể nằm trên các broker khác nhau, giúp phân phối tải và lưu trữ dữ liệu song song. Điều này giúp Kafka dễ dàng mở rộng theo chiều ngang, xử lý hàng triệu tin nhắn mỗi giây.
- Replication (Nhân bản): Để bảo đảm tính sẵn sàng cao và khả năng chịu lỗi, mỗi phân vùng có thể được nhân bản (replication) trên nhiều broker. Kafka sử dụng cơ chế leader-follower replication, trong đó một broker được chỉ định làm leader cho mỗi phân vùng và các brokers khác là followers. Khi tin nhắn được ghi vào phân vùng, leader sẽ ghi trước và theo sau đó các followers sẽ sao chép dữ liệu từ leader để bảo đảm dữ liệu luôn nhất quán.
- Leader và Follower: Mỗi phân vùng có một leader chịu trách nhiệm quản lý và xử lý tất cả các yêu cầu đọc/ghi cho phân vùng đó. Các follower đồng bộ dữ liệu từ leader. Nếu leader gặp sự cố thì một trong các followers sẽ được thăng cấp thành leader mới, điều đó bảo đảm tính sẵn sàng của dữ liệu.
4. Đảm bảo độ tin cậy
Kafka cung cấp các cơ chế khác nhau để bảo đảm độ tin cậy và độ chính xác của dữ liệu:
- Replication: Dữ liệu được nhân bản trên nhiều brokers, bảo đảm rằng nếu một broker gặp sự cố dữ liệu vẫn có thể được khôi phục từ các broker khác.
- Acknowledgement: Producers có thể cấu hình để Kafka xác nhận khi tin nhắn đã được ghi thành công vào một hoặc nhiều bản sao (replica) giúp bảo đảm dữ liệu không bị mất trong quá trình ghi.
- Exactly Once Semantics (EOS): Kafka cung cấp cơ chế Exactly Once để bảo đảm rằng tin nhắn chỉ được xử lý một lần duy nhất, đặc biệt quan trọng trong các hệ thống yêu cầu tính nhất quán cao.
5. Cơ chế lưu trữ log-based
Kafka lưu trữ tin nhắn theo dạng log trong các phân vùng. Mỗi phân vùng là một log tuần tự, nơi tin nhắn được thêm vào cuối log và có thể đọc lại bất cứ lúc nào. Điều này mang lại các lợi ích như sau:
- Đọc lại tin nhắn: Consumers có thể đọc lại các tin nhắn cũ từ bất kỳ vị trí nào trong log dựa trên offset. Điều này rất hữu ích cho các hệ thống phân tích hoặc xử lý dữ liệu cần xem lại các sự kiện cũ.
- Xóa tin nhắn theo thời gian: Kafka không xóa tin nhắn ngay sau khi chúng được tiêu thụ. Thay vào đó, nó lưu trữ tin nhắn trong một khoảng thời gian cấu hình (retention period) hoặc cho đến khi log đạt đến dung lượng tối đa. Sau đó, các tin nhắn cũ sẽ bị xóa hoặc ghi đè.
6. Vai trò của Zookeeper
Trước khi Kafka phát triển KRaft (Kafka Raft), Zookeeper được sử dụng để quản lý metadata và duy trì trạng thái của các brokers. Zookeeper chịu trách nhiệm:
- Theo dõi trạng thái của các broker.
- Điều phối phân phối leader và follower cho các phân vùng.
- Lưu trữ thông tin cấu hình của cụm Kafka.
Tuy nhiên, Zookeeper đang dần được thay thế bởi KRaft để Kafka trở nên tự chủ hơn trong việc quản lý cụm mà không cần đến hệ thống bên ngoài.
7. Kiến trúc tổng thể
- Producers gửi dữ liệu vào Kafka qua các topic.
- Brokers phân phối và lưu trữ dữ liệu, đồng thời quản lý các phân vùng của topic.
- Consumers đọc tin nhắn từ các phân vùng của topic và xử lý chúng.
- Zookeeper (hoặc KRaft) quản lý trạng thái của cụm Kafka, điều phối brokers và duy trì metadata.
#Kafka, Apache Kafka là gì? Tổng quan về Kafka, Câu Hỏi Phỏng Vấn Kafka