惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recorded Future
Recorded Future
S
Secure Thoughts
D
Docker
The GitHub Blog
The GitHub Blog
Y
Y Combinator Blog
雷峰网
雷峰网
T
The Blog of Author Tim Ferriss
D
DataBreaches.Net
F
Fortinet All Blogs
月光博客
月光博客
S
Security @ Cisco Blogs
AI
AI
IT之家
IT之家
P
Proofpoint News Feed
Stack Overflow Blog
Stack Overflow Blog
大猫的无限游戏
大猫的无限游戏
N
News and Events Feed by Topic
Hacker News: Ask HN
Hacker News: Ask HN
人人都是产品经理
人人都是产品经理
Recent Announcements
Recent Announcements
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Google Online Security Blog
Google Online Security Blog
K
Kaspersky official blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
P
Proofpoint News Feed
Latest news
Latest news
Webroot Blog
Webroot Blog
GbyAI
GbyAI
L
Lohrmann on Cybersecurity
T
Threat Research - Cisco Blogs
S
Schneier on Security
G
Google Developers Blog
N
News | PayPal Newsroom
C
Check Point Blog
T
Tenable Blog
L
LINUX DO - 最新话题
C
CERT Recently Published Vulnerability Notes
T
Troy Hunt's Blog
Know Your Adversary
Know Your Adversary
SecWiki News
SecWiki News
TaoSecurity Blog
TaoSecurity Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
爱范儿
爱范儿
W
WeLiveSecurity
Project Zero
Project Zero
M
MIT News - Artificial intelligence
H
Hacker News: Front Page
Apple Machine Learning Research
Apple Machine Learning Research
V
V2EX
C
Cyber Attacks, Cyber Crime and Cyber Security

郑文峰的博客

使用dify对接飞书多维表格 使用n8n对接飞书多维表格 服务启动时出现 OOM 一次服务升级时pg表DDL执行超时失败 Go语言高效IO缓冲技术详解 Go语言延迟初始化(Lazy Initialization)最佳实践 Go语言字符串拼接性能对比与优化指南 Go语言结构体内存对齐完全指南 Go语言空结构体:零内存消耗的高效编程 Go语言堆栈分配与逃逸分析深度解析 Go语言原子操作完全指南 Go语言内存预分配完全指南 Go语言不可变数据共享:无锁并发编程实践 Go语言零拷贝技术完全指南 Go语言遍历性能深度解析:从原理到优化实践 Go语言Interface Boxing原理与性能优化指南 Go协程池深度解析:原理、实现与最佳实践 使用etcd分布式锁导致的协程泄露与死锁问题 基于pre-commit的Python代码规范落地实践 初识 MCP Server pulsar阻塞导致logstash无法接入日志 django-prometheus使用及源码分析 kube-proxy源码分析 kubernetes service如何通过iptables转发 tcp缓存引起的日志丢失 django-apschedule定时任务异常停止 理解calico容器网络通信方案原理 理解flannel的三种容器网络方案原理 理解Linux IPIP隧道 理解VXLAN网络 理解Linux TunTap设备 快速了解iptables django rest_framework 分页 django后端服务、logstash和flink接入VictoriaMetrics指标监控 python中import原理 docker容器单机网络 手动实现docker容器bridge网络模型 mysql之MVCC原理 mysql之日志 使用java开发logstash的filter插件 使用python实现单例模式的三种方式 redis之缓存 redis之分片集群 redis之哨兵机制 redis之主从库同步 redis之持久化 redis之五种基本数据类型 go中如何处理error pod中将代码与运行环境分离 ddt源码分析 python装饰器的使用方法 读书笔记:如何阅读一本书 使用ddt实现unittest的参数化测试 使用kubeadm安装k8s 优化gin表单的错误提示信息 gin中validator模块的源码分析 go简单使用grpc python简单使用grpc k8s之PV、PVC和StorageClass k8s之StatefulSet k8s之DaemonSet k8s之Job和CronJob k8s之ConfigMap和Secret k8s之Service k8s之Pod k8s之Deployment 容器的本质 docker容器 python迭代器与生成器 python元编程 python垃圾回收机制 python上下文管理器 django rest_framework使用jwt django rest_framework异常处理 django rest_framework 自定义文档 django压缩文件下载 django rest_framework使用pytest单元测试 django restframework choice 自定义输出数据 django Filtering 使用 django viewset 和 Router 配合使用时报的错 django model的序列化 django中使用AbStractUser django.core.exceptions.ImproperlyConfigured Application labels aren't unique, duplicates users django 中 media配置 django 外键引用自身和on_delete参数 django 警告 while time zone support is active Flask使用flask_socketio实现websocket flask结合mongo tornado 文件上传 tornado 使用jwt完成用户异步认证 tornado 用户密码 bcrypt加密 tornado 结合wtforms使用表单操作 tornado finish和write区别 tornado 使用peewee-async 完成异步orm数据库操作 pyspark streaming简介 和 消费 kafka示例 使用hue创建ozzie的pyspark action workflow count的性能优化 django rest_framework Authentication django celery 结合使用 网站
kafka中listener和advertised.listeners的作用
zhengwenfeng · 2023-05-02 · via 郑文峰的博客

# listener

listener配置是用来绑定BrokerIP+端口地址​的,也就是只有通过绑定的地址才能够访问到该Broker。除了绑定地址之外,还可以配置该监听地址的认证协议,也就是使用该地址连接Broker时需要指定使用何种协议方式进行连接。

如下配置:

listeners: INTERNAL://172.17.0.10:9092,EXTERNAL://172.17.0.10:9094
kafka_listener_security_protocol_map: "INTERNAL:SASL_PLAINTEXT,EXTERNAL:SASL_PLAINTEXT"

1
2

连接该Broker的客户端只能通过172.17.0.10:9092​和172.17.0.10:9094​这两个地址访问kafka,并给前一个地址设置listener名称为INTERNAL​,后一个为EXTERNAL

kafka_listener_security_protocol_map​配置中设置listener所使用的通信协议,INTERNAL设置的是SASL_PLAINTEXT​,这也是常见的用户名和密码认证协议,EXTERNAL​设置也是该协议。

最终,kafka 客户端连接该kafka broker,需要通过172.17.0.10:9092​或172.17.0.10:9094​地址进行连接,并且都需要使用用户名和密码进行认证。

# advertised.listeners

该配置指定Kafka Broker对外公开的网络IP和端口,用于告知客户端如何连接到Kafka Broker。公开的方式是通过存储在zookeeper中进行共享数据的。

如下配置:

listeners: INTERNAL://172.17.0.10:9092,EXTERNAL://172.17.0.10:9094
advertised_listeners: INTERNAL://172.17.0.10:9092,EXTERNAL://公网IP:端口
kafka_listener_security_protocol_map: "INTERNAL:SASL_PLAINTEXT,EXTERNAL:SASL_PLAINTEXT"

1
2
3

listeners​和kafka_listener_security_protocol_map​的配置和上面讲的一样,而advertised_listeners​的配置和listeners​配置含义基本一致,但是它会保存在zookeeper中/brokers/ids/0​的endpoints里。

...
"endpoints":["INTERNAL://172.17.0.10:9092","EXTERNAL://172.17.0.10:9094"]
...

1
2
3

kafka客户端连接kafka broker时,会先获取所有brokers的元数据信息,获取到endpoints的信息,然后再通过其中的endpint进行对broker进行连接操作。

问题来了,我都知道了kafka broker的IP地址+端口了,为什么还需要advertised.listeners?

在需要代理才能连接kafka broker时,在这种场景时,需要将advertised.listeners​设置为代理的地址。

在公有云场景下部署kafka集群,公网IP不是在本节点网卡上的,所以无法通过listener进行绑定,所以只能通过0.0.0.0进行绑定。但是在集群外部时,kafka客户端进行连接,它是需要有能力访问kafka的每一个broker节点的,所以需要在advertised.listeners中配置公网IP,并存储在zookeeper中,这样kafka客户端就能拿到所有broker节点的公网IP并进行访问。

# 内外网分流

在公有云场景下,我们希望在集群内部客户端访问时不需要认证,而外部客户端访问时需要走认证加密访问。配置如下:

listeners: INTERNAL://0.0.0.0:9092,EXTERNAL://0.0.0.0:9094
advertised_listeners: INTERNAL://内网IP:9092,EXTERNAL://公网IP:9094
kafka_listener_security_protocol_map: "INTERNAL:PLAINTEXT,EXTERNAL:SASL_PLAINTEXT"

1
2
3

listeners都设置成对0.0.0.0进行监听也就是监听所有的网卡,但它们的端口不同,9092端口使用PLAINTEXT协议,而9094端口走的是SASL_PLAINTEXT协议

advertised_listeners,内网IP使用PLAINTEXT协议,公网IP使用SASL_PLAINTEXT协议。

当内网客户端访问时,会先获取到所有brokers的advertised_listeners信息,然后通过PLAINTEXT协议走内网IP访问kafka集群。

当公网客户端访问时,会先获取到所有brokers的advertised_listeners信息,然后通过SASL_PLAINTEXT走公网IP进行访问。

# 参考链接

  • https://www.finclip.com/news/f/30226.html
  • https://juejin.cn/post/6893410969611927566