Hướng Dẫn Cài Đặt và Thiết Lập Apache Kafka Trên Ubuntu 20.04 Từng Bước

Hướng Dẫn Cài Đặt và Thiết Lập Apache Kafka Trên Ubuntu 20.04 Từng Bước

Apache Kafka là một hệ thống môi giới tin nhắn phân tán phổ biến, được thiết kế để xử lý khối lượng dữ liệu thời gian thực lớn. Một cụm Kafka có khả năng mở rộng cao và chịu lỗi tốt. Nó cũng có khả năng xử lý thông lượng (throughput) vượt trội so với các hệ thống môi giới tin nhắn khác như ActiveMQRabbitMQ. Mặc dù thường được sử dụng như một hệ thống tin nhắn kiểu publish/subscribe, nhiều tổ chức cũng dùng nó cho việc tổng hợp log vì nó cung cấp khả năng lưu trữ bền vững cho các tin nhắn đã xuất bản.

Hệ thống tin nhắn kiểu publish/subscribe cho phép một hoặc nhiều nhà sản xuất (producer) xuất bản tin nhắn mà không cần quan tâm đến số lượng người tiêu dùng hay cách thức họ xử lý các tin nhắn đó. Các client đã đăng ký sẽ tự động nhận thông báo về các cập nhật và việc tạo tin nhắn mới. Hệ thống này hiệu quả và mở rộng hơn so với các hệ thống mà client phải định kỳ kiểm tra để xem có tin nhắn mới hay không.

Yêu Cầu

Để làm theo hướng dẫn này, bạn cần chuẩn bị:

● Một máy chủ Ubuntu 20.04 với tối thiểu 4 GB RAM và một người dùng không phải root có quyền sudo. Bạn có thể thiết lập theo hướng dẫn Cài đặt ban đầu cần thiết Ubuntu 20.04 nếu bạn chưa có tài khoản người dùng không phải root. Các cài đặt với dưới 4 GB RAM có thể khiến dịch vụ Kafka gặp sự cố.

OpenJDK 11 được cài đặt trên máy chủ của bạn. Để cài đặt phiên bản này, hãy làm theo hướng dẫn Cách Cài Đặt Java với APT trên Ubuntu 20.04. Kafka được viết bằng Java, do đó cần một JVM.

Bước 1 – Tạo người dùng dành riêng cho Kafka

Vì Kafka có thể xử lý các yêu cầu qua mạng, bước đầu tiên của bạn là tạo một người dùng chuyên dụng cho dịch vụ này. Điều này giúp giảm thiểu rủi ro cho máy chủ Ubuntu của bạn trong trường hợp ai đó xâm nhập vào máy chủ Kafka. Bạn sẽ tạo một người dùng tên là kafka trong bước này.

Đăng nhập vào máy chủ với tài khoản sudo không phải root, sau đó tạo người dùng kafka:

sudo adduser kafka

Làm theo các hướng dẫn để đặt mật khẩu và tạo người dùng kafka.

Tiếp theo, thêm người dùng kafka vào nhóm sudo bằng lệnh adduser. Bạn cần quyền này để cài đặt các phụ thuộc của Kafka:

sudo adduser kafka sudo

Người dùng kafka của bạn bây giờ đã sẵn sàng. Đăng nhập vào tài khoản kafka bằng lệnh:

su -l kafka

Bây giờ, sau khi đã tạo người dùng dành riêng cho Kafka, bạn đã sẵn sàng để tải xuống và giải nén các tập tin nhị phân của Kafka.

Bước 2 – Tải xuống và giải nén các tập tin nhị phân của Kafka

Trong bước này, bạn sẽ tải xuống và giải nén các tập tin nhị phân của Kafka vào các thư mục chuyên dụng trong thư mục home của người dùng kafka.

Đầu tiên, tạo một thư mục có tên Downloads trong /home/kafka để lưu các file tải xuống:

mkdir ~/Downloads

Sử dụng curl để tải xuống các tập tin nhị phân của Kafka:

curl "https://downloads.apache.org/kafka/2.8.2/kafka_2.13-2.8.2.tgz" -o ~/Downloads/kafka.tgz

Tiếp theo, tạo một thư mục có tên kafka và chuyển đến thư mục này. Bạn sẽ sử dụng thư mục này làm thư mục cơ sở cho cài đặt Kafka:

mkdir ~/kafka && cd ~/kafka

Giải nén tệp bạn đã tải xuống bằng lệnh tar:

tar -xvzf ~/Downloads/kafka.tgz --strip 1

Chú ý: Tham số --strip 1 được sử dụng để đảm bảo rằng nội dung của file nén được giải nén trực tiếp vào thư mục ~/kafka/ chứ không nằm trong một thư mục con (ví dụ như ~/kafka/kafka_2.13-2.8.2/).

Sau khi tải xuống và giải nén thành công, bạn có thể bắt đầu cấu hình máy chủ Kafka.

Bước 3 – Cấu hình máy chủ Kafka

Một Kafka topic là danh mục, nhóm, hoặc tên nguồn cấp dữ liệu mà các tin nhắn có thể được xuất bản. Tuy nhiên, hành vi mặc định của Kafka không cho phép bạn xóa một topic. Để thay đổi điều này, bạn cần chỉnh sửa file cấu hình, điều mà bạn sẽ làm trong bước này.

Các tùy chọn cấu hình của Kafka được chỉ định trong file server.properties. Mở file này bằng nano hoặc trình soạn thảo ưa thích của bạn:

nano ~/kafka/config/server.properties

Đầu tiên, thêm một thiết lập cho phép bạn xóa các topic của Kafka. Thêm dòng sau vào cuối file:

~/kafka/config/server.properties
delete.topic.enable = true

Tiếp theo, bạn sẽ thay đổi thư mục nơi lưu trữ log của Kafka bằng cách chỉnh sửa thuộc tính log.dirs. Tìm thuộc tính log.dirs và thay thế đường dẫn hiện tại bằng đường dẫn được đánh dấu:

~/kafka/config/server.properties
log.dirs=/home/kafka/logs

Sau đó, lưu lại và đóng file.

Bây giờ, sau khi đã cấu hình Kafka, bạn có thể tạo các file unit của systemd để chạy và kích hoạt máy chủ Kafka khi khởi động.

Bước 4 – Tạo File Unit của systemd và Khởi Động Máy Chủ Kafka

Trong phần này, bạn sẽ tạo các file unit của systemd cho dịch vụ Kafka. Các file này sẽ giúp bạn thực hiện các hành động như khởi động, dừng, và khởi động lại Kafka theo cách thống nhất với các dịch vụ Linux khác.

Kafka sử dụng Zookeeper để quản lý trạng thái cụm và cấu hình của nó. Zookeeper được dùng trong nhiều hệ thống phân tán, và bạn có thể tìm hiểu thêm về công cụ này trong tài liệu chính thức của Zookeeper. Bạn sẽ sử dụng Zookeeper như một dịch vụ thông qua các file unit này.

Tạo File Unit cho Zookeeper

Mở file unit cho zookeeper:

sudo nano /etc/systemd/system/zookeeper.service

Nhập nội dung định nghĩa unit sau vào file:

/etc/systemd/system/zookeeper.service
[Unit]
Requires=network.target remote-fs.target
After=network.target remote-fs.target

[Service]
Type=simple
User=kafka
ExecStart=/home/kafka/kafka/bin/zookeeper-server-start.sh /home/kafka/kafka/config/zookeeper.properties
ExecStop=/home/kafka/kafka/bin/zookeeper-server-stop.sh
Restart=on-abnormal

[Install]
WantedBy=multi-user.target

File unit trên cho biết Zookeeper cần có mạng và hệ thống tập tin sẵn sàng trước khi khởi động. Phần [Service] chỉ định rằng systemd sẽ sử dụng các script zookeeper-server-start.shzookeeper-server-stop.sh để khởi động và dừng dịch vụ. Ngoài ra, Zookeeper sẽ được khởi động lại nếu nó bị tắt bất thường.

Sau khi thêm nội dung, lưu lại và đóng file.

Tạo File Unit cho Kafka

Tiếp theo, tạo file unit cho kafka:

sudo nano /etc/systemd/system/kafka.service

Nhập nội dung định nghĩa unit sau vào file:

/etc/systemd/system/kafka.service
[Unit]
Requires=zookeeper.service
After=zookeeper.service

[Service]
Type=simple
User=kafka
ExecStart=/bin/sh -c '/home/kafka/kafka/bin/kafka-server-start.sh /home/kafka/kafka/config/server.properties > /home/kafka/kafka/kafka.log 2>&1'
ExecStop=/home/kafka/kafka/bin/kafka-server-stop.sh
Restart=on-abnormal

[Install]
WantedBy=multi-user.target

Phần [Unit] chỉ định rằng unit này phụ thuộc vào zookeeper.service, đảm bảo Zookeeper được khởi động tự động khi dịch vụ Kafka khởi động. Phần [Service] chỉ định rằng systemd sẽ sử dụng các script kafka-server-start.shkafka-server-stop.sh để khởi động và dừng dịch vụ, và Kafka sẽ được khởi động lại nếu nó bị tắt bất thường.

Lưu lại và đóng file.

Bây giờ, sau khi đã định nghĩa các unit, khởi động Kafka bằng lệnh:

sudo systemctl start kafka

Để đảm bảo máy chủ đã khởi động thành công, kiểm tra log của journal cho unit kafka:

sudo systemctl status kafka

Bạn sẽ nhận được đầu ra tương tự như sau:

Output
● kafka.service
     Loaded: loaded (/etc/systemd/system/kafka.service; disabled; vendor preset>
     Active: active (running) since Wed 2023-02-01 23:44:12 UTC; 4s ago
   Main PID: 17770 (sh)
      Tasks: 69 (limit: 4677)
     Memory: 321.9M
     CGroup: /system.slice/kafka.service
             ├─17770 /bin/sh -c /home/kafka/kafka/bin/kafka-server-start.sh /ho>
             └─17793 java -Xmx1G -Xms1G -server -XX:+UseG1GC -XX:MaxGCPauseMill>

Hiện tại, bạn có một máy chủ Kafka đang lắng nghe trên cổng 9092, đây là cổng mặc định của máy chủ Kafka.

Dịch vụ kafka đã được khởi động. Tuy nhiên, nếu bạn khởi động lại máy chủ, Kafka sẽ không tự khởi động lại. Để kích hoạt dịch vụ kafka khi khởi động máy chủ, chạy lệnh:

sudo systemctl enable zookeeper

Bạn sẽ nhận được thông báo rằng một liên kết (symlink) đã được tạo:

Output
Created symlink /etc/systemd/system/multi-user.target.wants/zookeeper.service → /etc/systemd/system/zookeeper.service.

Sau đó, chạy lệnh:

sudo systemctl enable kafka

Bạn sẽ nhận được thông báo rằng một liên kết đã được tạo:

Output
Created symlink /etc/systemd/system/multi-user.target.wants/kafka.service → /etc/systemd/system/kafka.service.

Trong bước này, bạn đã khởi động và kích hoạt các dịch vụ kafka và zookeeper. Ở bước tiếp theo, bạn sẽ kiểm tra cài đặt Kafka.

Bước 5 – Kiểm tra cài đặt Kafka

Trong bước này, bạn sẽ kiểm tra cài đặt Kafka của mình. Bạn sẽ xuất bản và tiêu thụ một thông điệp “Hello, World” để đảm bảo máy chủ Kafka hoạt động như mong đợi.

Việc xuất bản tin nhắn trong Kafka đòi hỏi:

● Một producer, cho phép xuất bản các bản ghi và dữ liệu tới các topic.

● Một consumer, đọc tin nhắn và dữ liệu từ các topic.

Đầu tiên, tạo một topic có tên TutorialTopic:

~/kafka/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic TutorialTopic

Bạn có thể tạo một producer từ dòng lệnh sử dụng script kafka-console-producer.sh. Script này yêu cầu hostname của máy chủ Kafka, một cổng và tên topic làm đối số.

Bạn sẽ nhận được thông báo rằng topic đã được tạo:

Output
Created topic TutorialTopic.

Bây giờ, xuất bản chuỗi “Hello, World” tới topic TutorialTopic:

echo "Hello, World" | ~/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic TutorialTopic > /dev/null

Tiếp theo, tạo một Kafka consumer sử dụng script kafka-console-consumer.sh. Script này yêu cầu hostname và cổng của máy chủ ZooKeeper, cùng với tên topic, làm đối số. Lệnh sau sẽ tiêu thụ tin nhắn từ topic TutorialTopic. Lưu ý tùy chọn --from-beginning cho phép tiêu thụ các tin nhắn đã được xuất bản trước khi consumer được khởi động:

~/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic TutorialTopic --from-beginning

Nếu không có vấn đề cấu hình, bạn sẽ thấy thông báo “Hello, World” xuất hiện trên terminal:

Output
Hello, World

Script sẽ tiếp tục chạy, chờ các tin nhắn mới được xuất bản. Để kiểm tra thêm, mở một terminal mới và đăng nhập vào máy chủ. Nhớ đăng nhập với tài khoản kafka:

su -l kafka

Trong terminal mới này, khởi chạy một producer để xuất bản một thông điệp thứ hai:

echo "Hello World from Sammy at Dataonline!" | ~/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic TutorialTopic > /dev/null

Thông điệp này sẽ xuất hiện trong kết quả của consumer trong terminal ban đầu:

Output
Hello, World
Hello World from Sammy at Dataonline!

Khi bạn hoàn tất việc kiểm tra, nhấn CTRL+C để dừng script consumer trong terminal ban đầu.

Bây giờ, bạn đã cài đặt và cấu hình thành công máy chủ Kafka trên Ubuntu 20.04. Ở bước tiếp theo, bạn sẽ thực hiện một vài tác vụ nhanh để củng cố bảo mật cho máy chủ Kafka của mình.

Bước 6 – Củng cố bảo mật cho máy chủ Kafka

Với việc cài đặt đã hoàn tất, bạn có thể loại bỏ quyền admin của người dùng kafka và củng cố bảo mật cho máy chủ Kafka.

Trước khi tiến hành, hãy đăng xuất và đăng nhập lại bằng một tài khoản sudo không phải root khác. Nếu bạn vẫn đang sử dụng phiên shell mà bạn đã khởi động hướng dẫn này, hãy gõ exit.

Loại bỏ người dùng kafka khỏi nhóm sudo:

sudo deluser kafka sudo

Để cải thiện bảo mật cho máy chủ Kafka của bạn, hãy khóa mật khẩu của người dùng kafka bằng lệnh passwd. Hành động này đảm bảo rằng không ai có thể đăng nhập trực tiếp vào máy chủ sử dụng tài khoản này:

sudo passwd kafka -l

Tham số -l khóa khả năng thay đổi mật khẩu của người dùng (passwd).

Tại thời điểm này, chỉ có root hoặc một người dùng có quyền sudo mới có thể đăng nhập dưới tài khoản kafka bằng lệnh:

sudo su - kafka

Trong tương lai, nếu bạn muốn mở khóa khả năng thay đổi mật khẩu, sử dụng lệnh passwd với tùy chọn -u:

sudo passwd kafka -u

Bây giờ, bạn đã hạn chế thành công quyền admin của người dùng kafka. Bạn đã sẵn sàng để bắt đầu sử dụng Kafka. Bạn cũng có thể làm theo bước tiếp theo để cài đặt KafkaT.

Bước 7 – Cài đặt KafkaT

KafkaT được phát triển nhằm cải thiện khả năng xem chi tiết về cụm Kafka của bạn và thực hiện một số tác vụ quản trị từ dòng lệnh. Vì đây là một Ruby gem, bạn cần cài đặt Ruby để sử dụng nó. Bạn cũng cần gói build-essential để xây dựng các gem mà KafkaT phụ thuộc vào.

Cài đặt Ruby và gói build-essential bằng apt:

sudo apt install ruby ruby-dev build-essential

Bây giờ, cài đặt KafkaT bằng lệnh gem:

sudo CFLAGS=-Wno-error=format-overflow gem install kafkat

Tham số -Wno-error=format-overflow là cần thiết để dập tắt các cảnh báo và lỗi của Zookeeper trong quá trình cài đặt KafkaT.

Khi cài đặt hoàn tất, bạn sẽ nhận được thông báo hoàn tất:

Output
...
Done installing documentation for json, colored, retryable, highline, trollop, zookeeper, zk, kafkat after 3 seconds
8 gems installed

KafkaT sử dụng file .kafkatcfg như file cấu hình để xác định thư mục cài đặt và thư mục log của máy chủ Kafka. File này cũng cần có một mục chỉ định KafkaT kết nối tới instance ZooKeeper của bạn.

Tạo một file mới có tên .kafkatcfg:

nano ~/.kafkatcfg

Thêm các dòng sau để chỉ định thông tin cần thiết về máy chủ Kafka và instance ZooKeeper của bạn:

~/.kafkatcfg
{
  "kafka_path": "~/kafka",
  "log_path": "/home/kafka/logs",
  "zk_path": "localhost:2181"
}

Lưu lại và đóng file. Giờ đây, bạn đã sẵn sàng sử dụng KafkaT.

Để xem thông tin chi tiết về tất cả các partition của Kafka, hãy chạy lệnh sau:

kafkat partitions

Bạn sẽ nhận được đầu ra như sau:

Output
[DEPRECATION] The trollop gem has been renamed to optimist and will no longer be supported. Please switch to optimist as soon as possible.
/var/lib/gems/2.7.0/gems/json-1.8.6/lib/json/common.rb:155: warning: Using the last argument as keyword parameters is deprecated
...
Topic                 Partition   Leader      Replicas        ISRs
TutorialTopic         0             0         [0]             [0]
__consumer_offsets	  0		          0		      [0]							[0]
...
...

Đầu ra sẽ bao gồm TutorialTopic__consumer_offsets – đây là một topic nội bộ của Kafka dùng để lưu trữ thông tin liên quan đến client. Bạn có thể bỏ qua các dòng bắt đầu với __consumer_offsets.

Để tìm hiểu thêm về KafkaT, hãy tham khảo kho GitHub của nó:https://github.com/airbnb/kafkat

Kết luận

Giờ đây , Apache Kafka đã được cài đặt và cấu hình an toàn trên máy chủ Ubuntu của bạn. Với môi trường Kafka sẵn sàng hoạt động, bạn có thể dễ dàng tích hợp nó vào các ứng dụng của mình bằng cách sử dụng các client Kafka phù hợp với ngôn ngữ lập trình mà bạn đang sử dụng. Điều này giúp bạn tận dụng sức mạnh của Kafka để xử lý dữ liệu theo thời gian thực, xây dựng hệ thống message queue hiệu quả và mở rộng quy mô ứng dụng một cách linh hoạt.

Để tìm hiểu thêm về Kafka, bạn có thể tham khảo thêm tài liệu chính thức của nó.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *