Thực hành setup cụm kafka trên AWS EC2

Tram Ho

Bài viết này mình sẽ trình bày khá chi tiết từng bước để có thể setup 1 cụm các server EC2 trên AWS chạy Kafka bao gồm 3 Zookeeper server và 3 Bootstrap server. Để đọc bài viết này, mình hy vọng bạn đã có chút kiến thức về AWS Cloud, Linux và Kafka. Nếu như chưa có thì cũng không sao, trong quá trình setup mình sẽ cố gắng giải thích tổng quan và cô đọng nhất có thể.

Nói về kafka thì phải cần 1 series riêng để nói hết mớ lý thuyết của nó, trong phạm vi bài viết này chúng ta chỉ tập trung vào cách setup 1 cụm Kafka. Cho nên mình chỉ giới thiệu tổng quan 2 khái niệm chính và cần thiết trong bài viết này là Zookeeper và Kafka Bootstrap server. Các khái niệm khác bạn có thể đọc tại đây

Zookeeper là gì?

Zookeeper trong Kafka có thể hiểu đơn giản là một nơi quản lý, lưu trữ thông tin về cluster, bao gồm các broker, topic, partition và các metadata khác. Nó cũng cung cấp một bộ kiểm soát phiên bản để giúp cho việc quản lý và quản trị cluster Kafka một cách dễ dàng hơn. Với sự hỗ trợ của ZooKeeper, các nút trong một cluster Kafka có thể giao tiếp với nhau để quản lý các hoạt động như tăng hoặc giảm số lượng các broker, thêm hoặc xoá topic, v.v

Setup Zookeeper trên AWS

Setup Zookeeper rất quan trọng vì hầu hết các cài đặt cấu hình đều được setup tại bước này, cho nên mình sẽ dùng cả bài viết này để setup nó một cách cẩn thẩn và chi tiết, còn phần sau mình sẽ setup 3 con server Kafka còn lại.
Đây là các bước mình sẽ thực hiện:

  1. Tạo tài khoản AWS
  2. Setup network security allow port 2181, 2888 và 3888
  3. Setup VPC riêng cho cụm
  4. Tạo ra 3 con instane EC2 (t2.medium 4gb ram)

Ở bước đầu tiên, các bạn có thể đọc tại đây để tạo cho mình một tài khoản AWS.
Sau khi tạo thành công, các bạn vào EC2 service, đây là chính là nơi để khởi tạo các server

image.png

Bước tiếp theo mình sẽ tạo ra một security group để các server và máy mình có thể kết nối với nhau.
image.png

Security group giúp chúng ta bảo mật ở phạm vi instance, bước tiếp theo mình sẽ tạo thêm 1 VPC riêng để giúp cụm chúng ta bảo mật hơn ở phía subnet nhé.

Vào VPC service, chọn Create VPC, đặt tên tùy thích, ở đây mình đặt tên là my-kafka-vpc với IPv4 CIDR là
192.168.1.0/24. Vì cụm kafka của mình cần đến 6 server, do đó các bạn hãy chọn region nào có ít nhất 6 AZ nha, ở mỗi AZ sẽ được đặt 1 con EC2.

image.png

Tiếp theo, chúng ta vào Subnets tab chọn Create Subnet vào tạo ra 6 subnet tương ứng với mỗi AZ với các thông tin như bảng sau

image.png

Tạo 1 Internet Gateway và liên kết với VPC vừa tạo, gắn Route table trên từng Subnet vừa tạo. Điều này giúp chúng ta có thể connect ra bên ngoài.
image.png

image.png

Sau đó chúng ta sẽ khởi tạo trước 1 instance EC2, lý do mình tạo trước 1 instance là bởi mình sẽ cài đặt cấu hình một lượt cho nó, sau đó chúng ta chúng ta chỉ cần tạo ra AMI trên instance vừa tạo để có thể tạo ra thêm các instance khác mà ở đó đã setup sẵn các cấu hình cho chúng ta.

Sau khi khởi tạo xong, các bạn có thể ssh vào nó, chú ý bạn phải đảm bảo rằng trong security group đã allow IP của bạn với port 22 nhé

Tiếp theo, mình cần phải setup các package và service cần dùng, các bạn chạy câu lệnh sau

Chú ý chúng ta cũng cần phải disable RAM Swap vì nó có thể gây lỗi

Để các server có thể gọi nhau một cách dễ dàng thì ở file hostname các bạn thêm dòng này sau đây

Các chỗ <your-ip-address> các bạn tự thêm dùm mình các private ip của các server còn lại nha, ở ví dụ của mình, mình sẽ thêm 6 private ip lần lượt cho 6 con server còn lại của mình.

Ở các bước tiếp theo, chúng ta sẽ tải Zookeeper và kafka về server

Sau khi đã hoàn tất việc download, chạy thử zookeeper xem sao (chú ý tất cả các file cấu hình được được đặt trong folder config được cho sẵn bởi kafka nhé).

Khi màn hình xuất hiện như vậy thì chúng ta đã chạy thành công zookeeper trên server rồi
image.png
Nhưng chạy như thế này thì không ổn, chúng ta cần setup lại một xíu để có thể khởi động hoặc dừng nó như một service chạy ngầm

Các bạn hãy chạy câu lệnh dưới đây

Với lệnh nano bạn hãy copy content từ file theo đường dẫn /zookeeper/zookeeper trong repo của mình,
Sau khi chạy thành công, có bạn có thể start service bằng lệnh

Để chứng minh service đang được chạy, chạy câu lệnh nc -vz localhost 2181

image.png

Và để tắt service chúng ta chạy sudo service zookeeper stop

image.png

Mình dùng câu lệnh nc -vz localhost 2181 để kiểm tra xem service có hoạt động hay không, thì có thể thấy rằng việc setup service đã thành công. Như vậy chúng ta đã chính thức setup được 1 server chạy Zookeeper rồi Việc tiếp theo chúng ta sẽ tiến thành clone nó để tạo ra thêm 2 server cấu hình y chang vậy nữa.

Setup cụm Zookeeper

Trước tiên, chúng ta cần tạo AIM từ Instance trước đó. Tạo ra thêm Instance và khởi động Zookeeper service.
Dừng instance đang chạy, vào mục Action ấn chọn Create image.
image.png

Sau khi đã tạo AIM xong, chúng ta có thể khởi tạo lại các instance với những cấu hình đã setup sẵn, chú ý trong phần network, mục Primary IP, các bạn có thể chọn private ip tùy thích phù hợp với IP4 block của subnet bạn chọn (lưu ý địa chỉ này chính là ip host trong tập tin /etc/hosts ở trên)

image.png

Vậy là chúng ta đã có 3 instance chạy Zookeeper rồi, nhưng trước hết cần kiểm tra kết nối giữa 3 con này để xác định xem Network chúng ta setup trước đó có đúng hay không. Đầu tiên cần SSH vào cả 3 con server. Như lần kiểm tra ở trên bằng cách sử dụng nc -vz localhost 2181 thì lần này mình sẽ thay localhost thành lần lượt các hostname trong cụm. Ví dụ mình ssh vào con zookeeper1 vào chạy lệnh nc -vz zookeeper2 2181, kết quả trả về:

image.png

Vậy là việc setup network và config cụm của chúng ta đã gần như hoàn thành. Việc tiếp theo là setup thư mục cũng như kiểm tra cụm có hoạt động tốt hay không.

Tại thư mục Kafka, file cấu hình Zookeeper được đặt trong kafka/config/zookeeper.properties, nội dung sau đây

Mỗi Zookeeper phải có đường dẫn /data/zookeeper như đã cấu hình cho dataDir ở trên, cho nên chúng ta sẽ tạo ra đường dẫn cũng như thay đổi user role cho nó

Đối với mỗi Zookeeper trong cụm, cần có 1 file là myid chữa 1 ID riêng biệt. Đối với Zookeeper 1:

Còn Zookeeper 2 và 3 thực hiện tương tự (lưu ý thứ tự cần giống với thứ tự server trong file config).

Vậy là việc setup cụm đã xong, bây giờ check thử xem tụi nó có làm việc với nhau hay chưa. Các bạn chạy shell trên zookeeper 1 bin/zookeeper-shell.sh zookeeper1:2181 chạy câu lệnh create /my-node “testing”

image.png
Sau khi tạo node trên zookeeper 1 vào thử shell zookeeper 2 xem có node vừa tạo không

image.png

Có thể thấy rằng my-node cũng đã được tạo trong zookeeper 2. Các bạn cũng có thể chạy câu lệnh echo stat | nc <hostname> <port> . Điều này sẽ hiển thị trạng thái hiện tại của cluster ZooKeeper, bao gồm thông tin về các khách hàng đã kết nối, số lượng nút sống và nhiều hơn nữa. Nếu kết nối giữa các máy chủ là hoạt động tốt, bạn sẽ thấy một thông tin cho biết rằng kết nối đang hoạt động và cluster đang hoạt động bình thường. Trong ví dụ của mình

image.png

Vậy chúng ta đã setup cấu hình thành công cho cụm Zookeeper. Phần tiếp theo sẽ tạo tiếp cụm Kafka và thực hành trên toàn bộ cụm nhé. Good bye and good luck.

Tham khảo

https://unixcop.com/kafka-and-zookeeper-ha-cluster-setup/

https://www.clairvoyant.ai/blog/kafka-series-3.-creating-3-node-kafka-cluster-on-virtual-box?hs_amp=true

https://normanlimxk.com/2021/11/01/setup-a-kafka-cluster-on-amazon-ec2/

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo