Nginx反向代理Kafka集群

前言

kafka集群的网络没法被客户端直接访问,中间需要有个代理。正常网络情况下,kafka会给客户端返回所有的broker地址,如果客户端无法访问到broker就会报错,所以kafka给客户端返回的地址需要是客户端能访问的代理服务器地址。

本文的测试环境中,使用nginx来反向代理kafka集群。nginx和kafka部署在同一台机器上,使用firewalld确保只开放8000端口,拒绝机器外访问kafka的端口。

  • nginx版本:1.28,IP:192.168.0.41,使用8000端口代理kafka集群
  • kafka版本:2.13-3.9.1,使用kraft组单点集群, IP:192.168.0.41。搭建过程见我的另一篇博客 使用KRaft部署单点kafka集群
  • 客户端IP:192.168.0.108

kafka配置

因为使用的是kraft,所以修改 config/kraft/server.properties配置文件,只需要修改advertised.listeners的配置。如下,PLAINTEXT指的是客户端访问地址,CONTROLLER因为是kafka内部集群通信才用到,所以只需要修改PLAINTEXT为nginx代理地址即可。PLAINTEXT试了需要写成hostname,而不能是ip地址,否则客户端还是会报错。

properties 复制代码
# 旧配置,PLAINTEXT为Kakfa broker的监听地址
# advertised.listeners=PLAINTEXT://192.168.0.41:9092,CONTROLLER://192.168.0.41:19092

# 新配置,PLAINTEXT为Nginx代理服务器的地址
advertised.listeners=PLAINTEXT://kafka-cluster:8000,CONTROLLER://192.168.0.41:19092

kafka 机器的/etc/hosts添加配置192.168.0.41 kafka-cluster(不确定到底要不要配置,懒得再测了,感兴趣的可以自行尝试)

配置修改完成后,重启kafka所有节点。

nginx配置

nginx需要有编译参数--with-stream才能支持TCP/UDP的反向代理,如何编译可自行搜索相关文档。

  1. 修改nginx/conf/nginx.conf的配置,导入conf.d目录下所有*-stream.conf的配置文件。如果配置很少,也可以直接写在nginx.conf文件里面。

    stream {
    include conf.d/*-stream.conf;
    }

  2. 编辑nginx/conf/conf.d/kafka-stream.conf

    upstream kafka-endpoints {
    server 192.168.0.41:9092;
    server 192.168.0.41:9093;
    server 192.168.0.41:9094;
    }

    server {
    listen 8000;
    proxy_pass kafka-endpoints;
    }

  3. 测试并重加载nginx配置

bash 复制代码
nginx -t
nginx -s reload

firewalld配置

  1. 安装firewalld
bash 复制代码
sudo apt install -y firewalld
  1. 设置默认zone为drop,即拒绝所有入站流量
bash 复制代码
sudo firewall-cmd --set-default-zone=drop
  1. 添加放行入站端口
bash 复制代码
sudo firewall-cmd --add-port=22/tcp --add-port=80/tcp --add-port=443/tcp --add-port=8000/tcp --permanent --zone=drop
  1. 重加载
bash 复制代码
sudo firewall-cmd --reload
  1. 在客户端测试能否访问其它端口。结果不为0即访问失败。
bash 复制代码
timeout 1 bash -c "cat < /dev/null > /dev/tcp/192.168.0.41/9092" > /dev/null 2>&1;echo $?

客户端配置

  1. 修改/etc/hosts,添加配置

    192.168.0.41 kafka-cluster

  2. 使用kafka自带工具启动生产者

bash 复制代码
./bin/kafka-console-producer.sh --broker-list kafka-cluster:8000 --topic testtopic
  1. 在另一个终端启动消费者
bash 复制代码
./bin/kafka-console-consumer.sh --bootstrap-server kafka-cluster:8000 --topic testtopic --from-beginning
  1. 在生产者终端随便输入点字符,如果消费者终端也能看到,说明nginx代理成功。
相关推荐
functionflux9 小时前
kafka-python:Python 生态中最成熟的 Kafka 客户端
分布式·python·其他·kafka
成为你的宁宁13 小时前
【Prometheus Operator监控K8S Nginx】
nginx·kubernetes·prometheus
q210306337214 小时前
kafka启动几秒后挂了,重启多次无果
分布式·kafka
abcy07121315 小时前
centos7 nginx代理kafka集群
nginx
難釋懷15 小时前
Nginx对上游服务器使用keepalive
服务器·nginx·github
abcy07121316 小时前
在Python 中使用Celery和Kafka进行消息队列的生产者和消费者实现
python·kafka
2401_834636991 天前
Nginx 从入门到实战:静态 / 动态站点、PHP 部署与反向代理全解析
运维·nginx·php
回忆2012初秋1 天前
【Nginx】优雅地走进高性能 Web 服务器世界(1)
服务器·前端·nginx
難釋懷1 天前
Nginx-KeepAlive
运维·nginx
2401_834636991 天前
Keepalived + LVS (DR) + Nginx + NFS 高可用 Web 集群部署实战手册
前端·nginx·lvs