CyStack logo
  • Sản phẩm & Dịch vụ
  • Giải pháp
  • Bảng giá
  • Công ty
  • Tài liệu
Vi

vi

Trang chủHướng dẫnCài đặt Apache Kafka trên Ubuntu 20.04 chỉ trong vài bước đơn giản
Chuyên gia

Cài đặt Apache Kafka trên Ubuntu 20.04 chỉ trong vài bước đơn giản

CyStack blog 9 phút để đọc
CyStack blog12/08/2025
Locker Avatar

Chris Pham

Technical Writer

Locker logo social
Reading Time: 9 minutes

Trong hướng dẫn này, bạn sẽ cài đặt và cấu hình Apache Kafka 2.8.2 trên Ubuntu 20.04.

Cài đặt Apache Kafka trên Ubuntu 20.04

Apache Kafka là một nền tảng trung gian phân phối thông điệp(distributed message broker) phổ biến, được thiết kế để xử lý khối lượng lớn dữ liệu theo thời gian thực. Một cụm Kafka có khả năng mở rộng cao và khả năng chịu lỗi tốt.

Nó cũng cung cấp thông lượng vượt trội hơn so với các hệ thống môi giới thông điệp khác như ActiveMQ và RabbitMQ. Mặc dù thường được sử dụng như một hệ thống nhắn tin kiểu xuất bản/đăng ký (publish/subscribe) nhưng nhiều tổ chức cũng triển khai Kafka để tổng hợp nhật ký, vì nó cung cấp khả năng lưu trữ bền vững cho các thông điệp đã xuất bản.

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

Chuẩn bị trước khi bắt đầu

Để thực hiện theo hướng dẫn, bạn cần:

  • Một máy chủ Ubuntu 20.04 với ít nhất 4 GB RAM và một tài khoản người dùng không phải root có quyền sudo.

Nếu bạn chưa có tài khoản người dùng không phải root thì có thể tham khảo hướng dẫn Thiết lập Máy chủ Ban đầu để cấu hình. Nếu hệ thống có ít hơn 4GB RAM thì có thể phát sinh lỗi khi khởi động dịch vụ Kafka.

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

Cài đặt Apache Kafka trên Ubuntu 20.04

Bước 1: Tạo tài khoản người dùng riêng cho Kafka

Do Kafka có khả năng xử lý các yêu cầu qua mạng nên bước đầu tiên bạn cần làm là tạo một tài khoản người dùng riêng biệt cho dịch vụ này. Điều này giúp giảm thiểu thiệt hại nếu máy chủ Kafka bị xâm nhập. Trong bước này, bạn sẽ tạo tài khoản người dùng kafka riêng biệt.

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

sudo adduser kafka

Làm theo hướng dẫn để đặt mật khẩu và hoàn tất bước tạo tài khoản 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 gói phụ thuộc của Kafka:

sudo adduser kafka sudo

Đã tạo xong tài khoản người dùng kafka. Giờ thì bạn hãy đăng nhập vào tài khoản kafka bằng lệnh su như sau:

su -l kafka

Sau khi có tài khoản người dùng riêng cho Kafka, bạn đã có thể 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 riêng biệt trong thư mục chính của người dùng kafka.

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

mkdir ~/Downloads

Sử dụng curl để tải 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

Tạo một thư mục có tên là kafka và chuyển vào thư mục đó. Bạn sẽ sử dụng thư mục này làm thư mục gốc cho cài đặt Kafka:

mkdir ~/kafka && cd ~/kafka

Giải nén tập tin lưu trữ đã tải xuống bằng lệnh tar:

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

Tham số --strip 1 được sử dụng để đảm bảo rằng nội dung của tập tin lưu trữ sẽ được giải nén trực tiếp vào thư mục ~/kafka/, thay vì nằm bên trong một thư mục con như ~/kafka/kafka_2.13-2.8.2/.

Sau khi tải xuống và giải nén các tập tin nhị phâ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 topic trong Kafka là tên danh mục, nhóm hoặc luồng mà các thông điệp được xuất bản vào. Tuy nhiên, theo cấu hình mặc định, Kafka không cho phép xóa topic. Để thay đổi hành vi này, bạn cần chỉnh sửa tập tin cấu hình, và việc này sẽ được thực hiện trong bước sau.

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

nano ~/kafka/config/server.properties

Đầu tiên, thêm một thiết lập cho phép xóa topic trong Kafka. Sau đó, thêm dòng sau vào cuối tập tin:

delete.topic.enable = true

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

log.dirs=/home/kafka/logs

Lưu và đóng tập tin lại.

Sau khi hoàn tất việc cấu hình Kafka, bạn có thể tạo các tập tin unit của systemd để khởi chạy và kích hoạt Kafka khi hệ thống khởi động.

Bước 4: Tạo các tập tin unit cho systemd và khởi động máy chủ Kafka

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

Kafka sử dụng Zookeeper để quản lý trạng thái cụm và cấu hình. Zookeeper được sử dụng trong nhiều hệ thống phân tán nên 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ẽ triển khai Zookeeper như một dịch vụ thông qua các tập tin unit.

Tạo tập tin unit cho zookeeper:

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

Nhập định nghĩa unit sau vào tập tin:

[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

Phần [Unit] khai báo rằng Zookeeper yêu cầu mạng và hệ thống tập tin sẵn sàng trước khi có thể khởi động.

Phần [Service] định nghĩa rằng systemd sẽ sử dụng các tập tin shell zookeeper-server-start.shzookeeper-server-stop.sh để khởi động và dừng dịch vụ. Đồng thời, nó cũng quy định rằng Zookeeper sẽ được khởi động lại nếu gặp sự cố bất thường.

Sau khi thêm nội dung trên, lưu và đóng tập tin.

Tiếp theo, tạo tập tin dịch vụ systemd cho Kafka:

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

Nhập định nghĩa unit sau vào tập tin:

[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ỉ ra rằng unit này phụ thuộc vào zookeeper.service, đảm bảo rằng Zookeeper sẽ được khởi động tự động khi Kafka khởi động.

Mục [Service] chỉ định rằng systemd nên sử dụng các file shell zookeeper-server-start.shzookeeper-server-stop.sh để khởi động và dừng dịch vụ. Nó cũng chỉ định rằng Zookeeper nên được khởi động lại nếu nó thoát một cách bất thường.

Lưu và đóng tập tin lại.

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

sudo systemctl start kafka

Để xác minh xem máy chủ đã khởi động thành công hay chưa, bạn hãy kiểm tra nhật ký hệ thống của Kafka:

sudo systemctl status kafka

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

● 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 tại cổng 9092, là cổng mặc định mà Kafka sử dụng.

Bạn đã khởi động dịch vụ Kafka nhưng nếu khởi động lại máy chủ, Kafka sẽ không tự động chạy lại. Để kích hoạt Kafka khởi chạy cùng hệ thống, bạn hãy chạy lệnh sau:

sudo systemctl enable zookeeper

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

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

Sau đó chạy tiếp lệnh sau:

sudo systemctl enable kafka

Phản hồi sẽ tương tự như sau:

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ụ KafkaZookeeper. Trong 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 việc cài đặt Kafka bằng cách xuất bản và đọc một thông điệp “Hello World” để đảm bảo rằng máy chủ Kafka đang hoạt động đúng như mong đợi.

Quá trình xuất bản thông điệp trong Kafka yêu cầu:

  • Một producer, chịu trách nhiệm xuất bản các bản ghi và dữ liệu vào các topic.
  • Một consumer, chịu trách nhiệm đọc thông điệp và dữ liệu từ các topic.

Đầu tiên, tạo một topic có tên là 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 bằng cách sử dụng script kafka-console-producer.sh. Script này yêu cầu khai báo hostname của máy chủ Kafka, cổng và tên topic làm đối số.

Sau khi thực thi lệnh, bạn sẽ nhận được phản hồi cho biết topic đã được tạo:

Created topic TutorialTopic.

Tiếp theo, xuất bản chuỗi "Hello, World" vào topic TutorialTopic:

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

Tiếp đến, tạo một consumer Kafka bằ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ẽ đọc thông điệp từ TutorialTopic. Lưu ý tùy chọn --from-beginning, cho phép đọc cả những thông điệp đượ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ó lỗi cấu hình, bạn sẽ nhận được thông điệp "Hello, World" xuất hiện trong terminal:

Hello, World

Script sẽ tiếp tục chạy, chờ các thông điệp mới được xuất bản. Để kiểm tra, bạn hãy mở một cửa sổ terminal mới và đăng nhập vào máy chủ. Lưu ý đăng nhập với người dùng kafka:

su -l kafka

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

echo "Hello World from Sammy at DigitalOcean!" | ~/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 ở terminal ban đầu nơi consumer đang chạy:

Hello, World
Hello World from Sammy at DigitalOcean!

Khi hoàn tất việc kiểm tra, nhấn tổ hợp phím CTRL+C để dừng script consumer trong terminal ban đầu.

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

Bước 6: Tăng cường bảo mật cho máy chủ Kafka

Sau khi hoàn tất cài đặt, bạn có thể loại bỏ quyền quản trị của người dùng kafka và tăng cường bảo mật cho máy chủ Kafka.

Trước khi thực hiện, bạn hãy đăng xuất khỏi phiên làm việc hiện tại và đăng nhập lại bằng một người dùng khác không phải root nhưng có quyền sudo. Nếu bạn vẫn đang sử dụng cùng một phiên shell bắt đầu từ đầu hướng dẫn, bạn hãy gõ:

exit

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

sudo deluser kafka sudo

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

sudo passwd kafka -l

Tùy chọn -l sẽ khóa chức năng thay đổi mật khẩu của người dùng thông qua lệnh passwd.

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

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, bạn hãy sử dụng lệnh passwd với tùy chọn -u:

sudo passwd kafka -u

Đến đây, bạn đã thành công giới hạn quyền quản trị của người dùng kafka. Bạn đã có thể bắt đầu sử dụng Kafka. Bạn cũng có thể thực hiện thêm bước tùy chọn tiếp theo để cài đặt KafkaT vào hệ thống của mình.

Bước 7: Cài đặt KafkaT (Tùy chọn)

KafkaT được phát triển nhằm cải thiện khả năng quan sát cụm Kafka và thực hiện một số tác vụ quản trị trực tiếp từ dòng lệnh. Vì KafkaT là một Ruby gem, bạn sẽ cần cài đặt Ruby để sử dụng. Ngoài ra, bạn cũng cần gói build-essential để biên dịch các gem phụ thuộc của KafkaT.

Cài đặt Ruby và gói build-essential thông qua apt:

sudo apt install ruby ruby-dev build-essential

Tiếp theo, cài đặt KafkaT bằng lệnh gem:

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

Tùy chọn CFLAGS=-Wno-error=format-overflow được sử dụng để bỏ qua các cảnh báo và lỗi trong quá trình cài đặt KafkaT có liên quan đến Zookeeper.

Khi quá trình cài đặt hoàn tất, bạn sẽ nhận được phản hồi xác nhận như sau:

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

KafkaT sử dụng tập tin cấu hình .kafkatcfg để xác định thư mục cài đặt và thư mục lưu log của máy chủ Kafka. Tập tin này cũng cần khai báo địa chỉ của instance Zookeeper đang sử dụng.

Tạo một tập tin mới có tên .kafkatcfg:

nano ~/.kafkatcfg

Thêm các dòng sau để khai báo thông tin cần thiết về máy chủ Kafka và Zookeeper:

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

Lưu và đóng tập tin lại. Bạn đã có thể sử dụng KafkaT.

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

kafkat partitions

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

[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]
...
...

Kết quả sẽ hiển thị topic TutorialTopic__consumer_offsets, một topic nội bộ mà Kafka sử 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 bằng __consumer_offsets.

Để tìm hiểu thêm về KafkaT, bạn hãy tham khảo kho mã nguồn chính thức trên GitHub.

Kết luận

Bạn đã triển khai thành công Apache Kafka và cấu hình bảo mật trên máy chủ Ubuntu. Giờ đây, bạn có thể tích hợp Kafka với ngôn ngữ lập trình ưa thích của mình thông qua các Kafka client.

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

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.

Đăng ký nhận Newsletter

Nhận các nội dung hữu ích mới nhất