+11

Kafka không cần Zookeeper? Kafka Kraft mode

Mayfest2023

Mở đầu

Các bạn nếu đã từng làm việc với Kafka thì sẽ quen với mô hình sử dụng Zookeeper với Kafka. Không biết các bạn có tự hỏi giống mình là tại sao chúng ta cần phải sử dụng thêm Zookeeper mà không sử dụng trực tiếp luôn Kafka? Cho các bạn nào chưa biết thì Zookeeper có nhiệm vụ:

  • Quản lý metadata của Kafka: ZooKeeper lưu trữ metadata của cụm Kafka, bao gồm vị trí của các broker, cấu hình topic và các phân vùng (partition).

  • Bầu cử nhà lãnh đạo: ZooKeeper được sử dụng để bầu leader cho mỗi phân vùng (partition) của một topic. Điều này đảm bảo rằng chỉ có một broker chịu trách nhiệm xử lý ghi cho một phân vùng cụ thể vào bất kỳ thời điểm nào.

  • Quản lý consumer group offsets: ZooKeeper được sử dụng để lưu trữ vị trí đọc hiện tại (current offset) của mỗi consumer group. Điều này cho phép consumer tiếp tục đọc tiếp từ vị trí cũ khi bị lỗi hay khởi động lại.

  • HealthCheck: ZooKeeper giám sát sức khỏe của cụm Kafka và có thể thông báo cho quản trị viên nếu có bất kỳ vấn đề nào phát sinh.

image.png

Zookeeper có những lợi ích nhất định đối với hệ thống, tuy nhiên trong một số trường hợp zookeeper làm tăng độ phức tạp của hệ thống, tăng khả năng lỗi do có nhiều thành phần,... Với mô hình Kafka mới trong bài này mình giới thiệu đến các bạn thì chúng ta sẽ không còn cần sử dụng Zookeeper nữa! Mô hình này hoạt động trong chế độ Kraft của Kafka.

Kafka Kraft là gì?

Kafka Kraft là một giao thức đồng thuận mới được phát triển nhằm múc đích loại bỏ đi sự hiện diện của Zookeeper trong hệ thống. Thay vì lưu trữ dữ liệu thành 2 thành phần hệ thống riêng biệt: Zookeeper và Kafka thì với giao thức này, Kafka sẽ tự lưu trữ các metadata trên chính nó. Sử dụng giao thức này bạn cần bật chế độ Kraft trên cụm Kafka, Kraft sẽ sử dụng Qurom Controller mới với giao thức đồng thuận Raft để bầu chọn leader.

image.png

Zookeeper đã tạo ra tội lỗi gì mà phải loại bỏ?

Nếu bạn đã sử dụng Kafka với Zookeeper ngon lành thì không có lý do gì để thay đổi mô hình cả! Tuy nhiên nếu bạn đã gặp lỗi khi chạy hay hệ thống đã to dần lên với nhiều topic, nhiều partition thì cần cân đo đong đếm lại. Sau đây là lý do tại sao ta nên cân nhắc loại bỏ Zookeeper:

  • Với giới hạn của Zookeeper, Kafka chỉ có thể hỗ trợ 200,000 partitions
  • Khi có broker tham gia vào cluster, việc đồng bộ và bầu chọn lại leader có thể gây quá tải ở Zookeeper và làm chậm hệ thống.
  • Việc cài đặt cụm Kafka với Zookeeper khá phức tạp, khó xây dựng.
  • Đôi khi việc đồng bộ metadata từ Kafka sang Zookeeper sẽ bị lỗi
  • Đảm bảo security khó khăn hơn (Bảo vệ 1 thằng thì dễ hơn 2 thằng)
  • ....

Với 1 vài các yếu tố trên và với kinh nghiệm 1 thời gian chinh chiến kha khá với Kafka thì mình nghĩ việc chuyển sang Mode Kraft rất đáng cân nhắc!

Kraft Mode hoạt động thế nào?

Chế độ này sử dụng Quorum Controller mới trong Kafka, Quorum Controller sử dụng event-sourced storage model và cơ chế đồng thuận Raft để đồng bộ metadata giữa các Quorum (broker).

image.png

Một trong số Quorum Controller sẽ đóng vai trò leader tạo ra event trong metadata topic, các Quorum Controller còn lại sẽ đồng bộ từ leader bằng cách phản hồi các event này. Vì vậy khi một broker bị lỗi và cần tham gia lại có thể bắt kịp các sự kiện bị mất từ nhật ký event.

Không như với mô hình dựa trên Zookeeper, khi có sự thay đổi về Leader thì Quorum Controller mới đã có sẵn các dữ liệu metadata đã được đồng bộ trong bộ nhớ thay vì phải load lại trạng thái từ Zookeeper.

Lợi ích khi sử dụng Kraft Mode

  • Tăng khả năng mở rộng của Kafka, dễ dàng mở rộng đến hàng triệu partition
  • Dễ dàng cài đặt, bảo trì <= Cái này đụng vào rồi mới thấy nó sướng 😄 😄 😄
  • Tăng sự ổn định cho hệ thống, dễ dàng giám sát và quản lý (Do mô hình đơn giản hơn)
  • Khởi động, Restart Kafka nhanh hơn
  • Tăng khả năng phục hồi khi xảy ra sự cố

Sau đây là bảng so sánh thời gian Shutdown và Recovery giữa 2 mô hình With Zookeeper và With Quorum Controller, ta có thể nhận thấy được sự khác biệt tương đối lớn.

image.png

Bắt đầu nhanh với Kafka Kraft mode

Để bắt đầu nhanh sử dụng thử Kraft mode này bạn có thể sử dụng docker để dựng:

Để thử nhanh bạn có thể sử dụng image Kafka của bitnami bitnami/kafka:latest và kích hoạt mode KRAFT bằng biến môi trường KAFKA_ENABLE_KRAFT=yes

docker run -p9092:9092 --name kafka -e ALLOW_PLAINTEXT_LISTENER=yes -e KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true -e KAFKA_ENABLE_KRAFT=yes bitnami/kafka:latest

Lưu ý: Hiện mode Kraft chưa được khuyến khích sử dụng cho môi trường production!!! Bạn chỉ nên sử dụng cho môi trường test, staging, dev,...

Nếu bạn cảm thấy bài viết hữu ích hãy UpVote và Follow mình để theo dõi thêm nhiều bài viết nữa nhé 😄

Tham khảo

Sau đây là các nguồn mình có tham khảo và sử dụng hình ảnh:

Chuyên mục quảng cáo

Nếu các bạn đang có nhu cầu triển khai ứng dụng như NodeJS, Python, Golang, Java hoặc sử dụng các Database - Message Queue như MongoDB, MySQL, Redis, Kafka thì có thể tham khảo sử dụng Bizfly Cloud App Engine nha! Đây là sản phẩm Serverless mà bên mình đang phát triển nhằm mục đích đơn giản hóa quá trình triển khai ứng dụng cho các bạn Devs. Hiện sản phẩm đang miễn phí sử dụng, hy vọng các bạn sẽ ủng hộ 😄. Bất cứ đóng góp gì các bạn có thể nhắn cho mình thông qua Telegram @HoangViet12 nhé! Have a nice day 😄


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.