Địa chỉ quảng cáo Kafka (Advertised Kafka Address) là gì
Khám phá địa chỉ quảng cáo Kafka (Advertised Kafka Address) - khái niệm quan trọng giúp các lập trình viên kết nối và truyền dữ liệu vào cụm Kafka một cách hiệu quả. Bài viết cung cấp cái nhìn chi tiết về cách thiết lập và gỡ rối cho địa chỉ này trong môi trường Docker và Kubernetes.
Khái niệm cơ bản về địa chỉ kafka và địa chỉ quảng cáo kafka
Bắt đầu từ những điều cơ bản. Sau khi khởi động thành công cụm Redpanda hoặc Apache Kafka, bạn sẽ muốn ngay lập tức truyền dữ liệu vào nó. Bất kể bạn chọn công cụ và ngôn ngữ nào, bạn sẽ ngay lập tức được yêu cầu cung cấp danh sách các máy chủ khởi động để khách hàng (client) của bạn có thể kết nối vào cụm.
Máy chủ khởi động này chỉ dùng để khách hàng bắt đầu kết nối với một trong các máy chủ (broker) trong cụm, sau đó nó sẽ cung cấp cho khách hàng các bộ dữ liệu metadata ban đầu. Metadata này thông báo cho khách hàng về các máy chủ hiện có và máy chủ nào là leader cho từng phân vùng, được lưu trữ bởi máy chủ nào, để khách hàng có thể bắt đầu kết nối trực tiếp với tất cả các máy chủ một cách riêng lẻ. Biểu đồ dưới đây sẽ giúp bạn hình dung rõ hơn.
Khách hàng sẽ xác định nơi để truyền dữ liệu dựa trên thông tin được cung cấp. Tùy thuộc vào số lượng các phân vùng và nơi chúng được lưu trữ, khách hàng của bạn sẽ đẩy hoặc kéo dữ liệu từ các phân vùng đến hoặc từ máy chủ lưu trữ của nó.
Cả địa chỉ Kafka và địa chỉ quảng cáo Kafka đều cần thiết. Địa chỉ Kafka được sử dụng để các máy chủ Kafka tìm kiếm lẫn nhau, còn địa chỉ quảng cáo được khách hàng sử dụng để tìm thấy chúng.
Trong bài viết này, chúng tôi sẽ giúp bạn hiểu về địa chỉ quảng cáo Kafka, cách sử dụng nó trong Docker và Kubernetes (K8s), và cách gỡ rối cho nó.
Khi nào sử dụng địa chỉ kafka và địa chỉ quảng cáo kafka
Khi khởi động cụm Redpanda của bạn, Địa chỉ Kafka được sử dụng để liên kết dịch vụ Redpanda với máy chủ của nó và sử dụng điểm cuối đã thiết lập để bắt đầu chấp nhận yêu cầu.
** LISTENER_NAME **:// HOST_NAME :* PORT *
Máy chủ sử dụng địa chỉ quảng cáo Kafka trong metadata, do đó khách hàng của bạn sẽ lấy địa chỉ này để tìm kiếm các máy chủ khác.
Để thiết lập nó, hãy sử dụng --kafka-addr và --advertise-kafka-addr với RPK hoặc kafka_api hoặc advertised_kafka_api bên trong /etc/redpanda/redpanda.yaml cho mỗi máy chủ.
Cho đến nay, mọi thứ có vẻ rất rõ ràng. Và, bạn có thể bắt đầu tự hỏi liệu địa chỉ Kafka và địa chỉ quảng cáo Kafka có thực sự không cần thiết không. Mọi chuyện bắt đầu trở nên phức tạp khi khách hàng của bạn không thể nhìn thấy được máy chủ cụm, và nếu bạn truyền cùng một địa chỉ nội bộ cho khách hàng, nó sẽ không thể giải quyết được. Vì vậy, chúng ta cần phải chỉnh sửa địa chỉ quảng cáo Kafka để cho phép khách hàng Kafka hiểu và có khả năng tiếp cận từ bên ngoài (tức là địa chỉ IP bên ngoài).
Cách sử dụng địa chỉ kafka và địa chỉ quảng cáo kafka trong docker (container)
Một vấn đề khác thường gặp phải là khi chạy các máy chủ Redpanda trong Docker (container). Điều này cũng áp dụng cho các cấu trúc mạng phức tạp khác. Nhưng đừng lo lắng, bạn đã biết cơ chế vận hành. Tất cả những gì bạn cần làm là đặt địa chỉ chính xác cho khách hàng đang ở các nơi khác nhau.
Khi chạy container Docker, nó mặc định tạo ra mạng riêng của mình, nhưng trong trường hợp bạn cần có nhiều container giao tiếp với nhau, bạn sẽ cần thiết lập một mạng (đôi khi là nhiều lớp mạng) bằng cách liên kết chúng lại với nhau. Chúng ta biết rằng địa chỉ Kafka được sử dụng để liên kết với máy chủ, chúng ta sẽ chỉ sử dụng 0.0.0.0 vì nó sẽ liên kết với tất cả các giao diện trên máy chủ và bất kỳ cổng nào bạn muốn (đừng sử dụng cổng đã bị chiếm dụng).
Một ví dụ có thể là 0.0.0.0:9092 và 0.0.0.0:9095 cho mỗi máy chủ đang chạy trong container Docker, bạn sẽ đăng ký một tên trong mạng, nếu khách hàng của bạn đang cố gắng truy cập máy chủ trong mạng, tất cả những gì bạn cần làm là thiết lập địa chỉ quảng cáo Kafka cho tên đã đăng ký trong mạng. Ví dụ, nếu container Redpanda đầu tiên của bạn đăng ký tên của nó là Building-A, bạn có thể thiết lập địa chỉ quảng cáo Kafka thành Building-A:9092.
Đối với khách hàng bên ngoài mạng Docker, nơi họ không có quyền truy cập vào bảng định tuyến của mạng, địa chỉ quảng cáo Kafka sẽ cần được thiết lập thành máy chủ nơi các container Docker đang chạy, để khách hàng có thể tìm thấy nó. Và đừng quên rằng bạn cũng cần phải mở cổng và liên kết nó với máy chủ.
Nhưng, điều gì xảy ra nếu bạn có khách hàng muốn truy cập cụm đồng thời? Đơn giản thôi, hãy thêm nhiều máy nghe! Mỗi máy nghe sẽ trả về một bộ địa chỉ quảng cáo Kafka cho khách hàng trong một môi trường khác nhau.
Sử dụng địa chỉ kafka và địa chỉ quảng cáo kafka trong k8s
Vì Kubernetes là một nền tảng điều phối container, khái niệm rất giống với việc chạy container Docker, nhưng quy mô lớn hơn. Trong một cụm Redpanda điển hình, bạn sẽ muốn cài đặt một máy chủ Redpanda duy nhất trong một nút công nhân cá nhân.
Tất cả các pod chạy trong K8s đều được gán một địa chỉ nội bộ, chỉ có thể nhìn thấy bên trong môi trường Kubernetes, nếu khách hàng đang chạy bên ngoài Kubernetes, họ sẽ cần một cách để tìm thấy các máy chủ. Vì vậy bạn có thể sử dụng NodePort để mở cổng và sử dụng địa chỉ IP công cộng của nút công nhân đang lưu trữ.
Đối với địa chỉ Kafka, như thường lệ, chỉ cần liên kết nó với container địa phương. Ví dụ, 0.0.0.0:9092 và 0.0.0.0:9095. Đối với địa chỉ quảng cáo Kafka, chúng ta sẽ cần thiết lập hai máy nghe: một cho kết nối nội bộ, và một cho bên ngoài.
Đối với khách hàng nội bộ, chúng ta có thể đơn giản sử dụng tên dịch vụ nội bộ đã tạo, ví dụ, nếu tên dịch vụ của bạn được thiết lập là Building-A, địa chỉ quảng cáo Kafka sẽ là internal://Building-A:9092. Đối với máy nghe bên ngoài, sử dụng địa chỉ IP công cộng (hoặc tên miền) của nút công nhân chứa cổng mở trong NodePort, nơi bạn sẽ được gán một cổng mới. Ví dụ, nếu nút công nhân đầu tiên của bạn có địa chỉ IP công cộng (Tên miền) là XXX-Blvd, và cổng mới được gán là 39092, bạn có thể thiết lập địa chỉ quảng cáo Kafka thành external://XXX-Blvd:39092.
Làm thế nào để gỡ rối địa chỉ quảng cáo kafka
Khi bạn có thể kết nối với cụm của mình bằng Redpanda Keep (rpk) và khách hàng của bạn gặp phải lỗi như "ENOTFOUND". Kiểm tra xem advertised_kafka_api đã được thiết lập chính xác hay chưa, với một địa chỉ có thể được giải quyết bởi khách hàng của bạn.
> curl localhost:9644/v1/node_config "advertised_kafka_api":[ "name":"internal","address":"0.0.0.0","port":9092 , "name":"external","address":"192.186.0.3","port":19092 ]....
Nếu bạn đang chạy Docker, tìm ra cổng 9644 đã được mở ra từ Docker.
> docker port redpanda-0 8081/tcp -> 0.0.0.0:18081 9644/tcp -> 0.0.0.0:19644 18082/tcp -> 0.0.0.0:18082 19092/tcp -> 0.0.0.0:19092
Và cURL.
> curl localhost:19644/v1/node_config "advertised_kafka_api":[ "name":"internal","address":"redpanda-0","port":9092 , "name":"external","address":"localhost","port":19092 ]....
Nếu bạn đang chạy Kubernetes, tìm ra cổng quản trị nào được mở ra.
> kubectl get svc redpanda-external -n redpanda NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) redpanda-external NodePort 10.100.87.34 <none> 9644:31644/TCP,9094:31092/TCP,8083:30082/TCP,8084:30081/TCP 3h53m > kubectl get pod -o=custom-columns=NAME:.metadata.name,STATUS:.status.phase,NODE:.spec.nodeName -n redpanda NAME NODE redpanda-0 ip-1-168-57-208.xx.compute.internal redpanda-1 ip-1-168-1-231.xx.compute.internal redpanda-2 ip-1-168-83-90.xx.compute.internal >kubectl get nodes -o=custom-columns='NAME:.metadata.name,IP:.status.addresses[?(@.type=="ExternalIP")].address' NAME IP ip-1.us-east-2.compute.internal 3.12.84.230 ip-1.us-east-2.compute.internal 3.144.255.61 ip-1.us-east-2.compute.internal 3.144.144.138
Và cURL.
> curl 3.12.84.230:31644/v1/node_config "advertised_kafka_api":[ "name":"internal","address":"redpanda-1.redpanda.redpanda.svc.cluster.local.","port":9093 , "name":"default","address":"3.12.84.230","port":31092 ].....
Cuối cùng, kiểm tra xem bạn có đang kết nối đến máy nghe (Cổng) đúng không. Và bạn đã hoàn thành xong!
Kết Luận
Nếu bạn đã theo dõi đến đây, bạn nên đã có một hiểu biết tốt hơn về địa chỉ quảng cáo Kafka cũng như cách bạn có thể sử dụng nó trong Docker và K8s.
Để tìm hiểu thêm về Redpanda, hãy xem qua tài liệu của chúng tôi và duyệt qua blog Redpanda để tìm hiểu các hướng dẫn và bài hướng dẫn về cách tích hợp dễ dàng với Redpanda. Để có cách tiếp cận thực hành hơn, hãy thử phiên bản Community miễn phí của Redpanda!