Tác giả: https://www.facebook.com/lang.thinh.146/
Source: https://github.com/quocthinh861/kafka-zookeeper-cluster.git
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:
- Tạo tài khoản AWS
- Setup network security allow port 2181, 2888 và 3888
- Setup VPC riêng cho cụm
- 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
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.
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.
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
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.
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
# Packages
sudo apt-get update && \ sudo apt-get -y install wget ca-certificates zip net-tools vim nano tar netcat # Java Open JDK 8
sudo apt-get -y install openjdk-8-jdk
java -version
Chú ý chúng ta cũng cần phải disable RAM Swap vì nó có thể gây lỗi
# Disable RAM Swap - can set to 0 on certain Linux distro
sudo sysctl vm.swappiness=1
echo 'vm.swappiness=1' | sudo tee --append /etc/sysctl.conf
Để 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
# Add hosts entries (mocking DNS) - put relevant IPs here
echo "<your-ip-address> kafka1
<your-ip-address> zookeeper1
<your-ip-address> kafka2
<your-ip-address> zookeeper2
<your-ip-address> kafka3
<your-ip-address> zookeeper3" | sudo tee --append /etc/hosts
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
# download Zookeeper and Kafka. Recommended is latest Kafka (0.10.2.1) and Scala 2.12
wget https://archive.apache.org/dist/kafka/0.10.2.1/kafka_2.12-0.10.2.1.tgz
tar -xvzf kafka_2.12-0.10.2.1.tgz
rm kafka_2.12-0.10.2.1.tgz
mv kafka_2.12-0.10.2.1 kafka
cd kafka/
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é).
# Testing Zookeeper install
# Start Zookeeper in the background
bin/zookeeper-server-start.sh -daemon config/zookeeper.properties
bin/zookeeper-shell.sh localhost:2181
ls /
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 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
# Install Zookeeper boot scripts
sudo nano /etc/init.d/zookeeper
sudo chmod +x /etc/init.d/zookeeper
sudo chown root:root /etc/init.d/zookeeper # you can safely ignore the warning
sudo update-rc.d zookeeper defaults
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
sudo service zookeeper start
Để chứng minh service đang được chạy, chạy câu lệnh nc -vz localhost 2181
Và để tắt service chúng ta chạy sudo service zookeeper stop
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.
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)
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ề:
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
dataDir=/data/zookeeper
clientPort=2181
maxClientCnxns=128
initLimit=10
syncLimit=5
tickTime=6000
server.1=<zookeeper_1_IP>:2888:3888
server.2=<zookeeper_2_IP>:2888:3888
server.3=<zookeeper_3_IP>:2888:3888
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ó
# create data dictionary for zookeeper
sudo mkdir -p /data/zookeeper
sudo chown -R ubuntu:ubuntu /data/
Đố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:
echo "1" > /data/zookeeper/myid
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"
Sau khi tạo node trên zookeeper 1 vào thử shell zookeeper 2 xem có node vừa tạo không
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
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://normanlimxk.com/2021/11/01/setup-a-kafka-cluster-on-amazon-ec2/