Kafka内外网访问
本文介绍了Kafka内外网访问的设置。
kafka的两个配置listeners和advertised.listeners
listeners
kafka监听的网卡的ip,假设你机器上有两张网卡,内网192.168.0.213和外网101.89.163.1 如下配置
listeners=PLAINTEXT://192.168.0.213:9092
那么kafka只监听内网网卡,即只接收内网网卡的数据,如果你不能把外网网卡流量转发到内网网卡(为什么要强调这一点,下面说),那么kafka就接收不到外网网卡数据。如果配置成外网ip同理。当然你可以配置成0.0.0.0,监听所有网卡。
advertised.listeners
我们观察kafka的配置文件server.properties,会发现里面记录了zookeeper集群的各个节点的访问地址,但是并没有记录kafka兄弟节点的地址。kafka节点启动后,会向zookeeper注册自己,同时从zookeeper中获取兄弟节点的地址,以便与兄弟节点通信。
同样,我们使用客户端连接kafka后,kafka返回给客户端的是集群各节点的访问地址,这个地址也是上面说的从zookeeper中获得的地址。
这个地址哪里来,就是kafka节点向zookeeper注册时提供的advertised.listeners。如果没有,就会使用listeners。
三种情景,搭配使用这两个配置
只需要内网访问kafka
listeners=PLAINTEXT://192.168.0.213:9092
只需要内网访问kafka
你肯定想到了最简单的一个方法,listeners使用外网ip
listeners=PLAINTEXT://101.89.163.1:9092
需要外网访问
如果宿主机有外网网卡,这么配当然没问题。如果没有(ifconfig看不到外网ip的网卡,基本上就不存在这个外网网卡),很可能和我使用的的宿主机一样是通过NAT映射或者啥办法搞出来的外网ip,此时kafka无法监听这个外网ip(因为不存在,启动就会报错)。
这时候就是advertised.listeners真正发挥作用的时候了。使用如下配置:
listeners=PLAINTEXT://192.168.0.213:9092
advertised.listeners=PLAINTEXT://101.89.163.1:9092
此时一个完整的kafka客户端访问服务端的流程:
- 客户端访问101.89.163.1:9092,被kafka宿主机所在环境映射到内网192.168.0.213:9092,访问到了kafka节点,请求获得kafka服务端的访问地址
- kafka从zookeeper拿到自己和其他兄弟节点通过advertised.listeners注册到zookeeper的101.89.163.1:9092等外网地址,作为kafka的服务端访问地址返回给客户端
- 客户端拿这些地址访问kafka集群,被kafka宿主机所在环境映射到各kafka节点的内网ip,访问到了kafka服务端......完美循环
你可能会问已经配置了访问地址,为什么还要在第一次访问的时候请求获得kafka的访问地址。因为如果是kafka集群,你可以选择只给客户端配置一个kafka节点的地址(这样是不推荐的),但是客户端必须要访问集群中的每一个节点,所以必须通过这个节点获得集群中每一个节点的访问地址。
如果不配置advertised.listeners=PLAINTEXT://101.89.163.1:9092,你会发现虽然你给kafka客户端配置的访问地址是101.89.163.1:9092,但是kafka客户端访问时报错,报错原因是Connection to node -1[192.168.0.213:9092] could not be established. Broker may not be available.。这就是因为不配置advertised.listeners则advertised.listeners默认使用listeners配置的地址,客户端拿到的就是listeners配置的内网地址
内外网分流
上面说的有外网ip的情况,直接配置外网ip有没有问题呢?
如果既要内网访问,又要外网访问,本来可以走内网的流量都走外网网卡,显然不合适;而且有的环境可能被配置成这些kafka宿主机是没有外网访问权限的,即虽然他可以访问自己的外网ip,但是访问不了兄弟节点的外网ip。这时候就要配置内外网。
配置1:
{{< codes 配置1 配置2>}}
{{}}
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
listeners=INTERNAL://192.168.0.213:9092,EXTERNAL://192.168.0.213:19092
advertised.listeners=INTERNAL://192.168.0.213:9092,EXTERNAL://101.89.163.9:19092
inter.broker.listener.name=INTERNAL
{{}}
{{}}
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
listeners=INTERNAL://192.168.0.213:9092,EXTERNAL://101.89.163.9:19092
advertised.listeners=INTERNAL://192.168.0.213:9092,EXTERNAL://101.89.163.9:19092
inter.broker.listener.name=INTERNAL
{{}}
{{}}
注意这两的区别是listeners的EXTERNAL使用的ip不一样,一个使用内网ip,一个使用外网ip。
- 如果你的kafka宿主机有外网网卡,只能用外网ip,若使用配置1,kafka通过
listeners监听的两个端口都是内网网卡的数据,无法接收到外网网卡数据; - 如果你的kafka宿主机外网ip是映射来的,只能使用内网ip,原因也是上面说过的,不存在外网网卡,kafka启动监听就会报错,而使用内网ip有环境配置好的转发,可以接收到外网ip的数据。
Kafka内外网访问的更多相关文章
- 解决ArcGIS API for Silverlight 加载地图的内外网访问问题
原文:解决ArcGIS API for Silverlight 加载地图的内外网访问问题 先上一个类,如下: public class BaseClass { public static string ...
- docker kafka 外网访问不到
linux虚拟机中的kafka docker 容器外网显示: 原因: kafka的外网IP端口配置参数设置错误. 原-->设置了容器的IP端口. 改-->设置宿主机的ip以及宿主机上的端口 ...
- 综合练习2 设置访问权限,Easy-IP访问外网,内外网访问
实验拓扑图: 实验要求: 1.pc.路由.交换基本配置,vlan间路由互通. 2.vlan20.vlan30可以访问FTP,VLAN10不允许访问FTP. 3.AR1通过easy-ip方式实现私网地址 ...
- kafka配置内外网访问
使用docker简单部署测试 zookeeper mkdir data conf chmod 777 data 启动命令 docker run -itd -p 2181:2181 -e ALLOW_A ...
- kafka内外网集群配置
linux下配置使用以第一台为例(先配置好jdk环境)1.解压kafka:2.10-0.10.1.12.修改zookeeper.properties 新增配置:maxClientCnxns=0 tic ...
- Openstack(十六)实现内外网结构
类似于阿里云ECS主机的内外网(双网卡不通网段)的结构,最终实现内外网区分隔离. https://www.aliyun.com/product/ecs/?utm_medium=text&utm ...
- openstack内外网ip实现
类似于阿里云ECS主机的内外网(双网卡不通网段)的结构,最终实现内外网区分隔离. https://www.aliyun.com/product/ecs/?utm_medium=text&utm ...
- Flume消费内外网分流配置的Kafka时遇到的坑
网上有铺天盖地的文章,介绍如何将Kafka同时配置成公网地址.内网地址,以实现内外网分流,看着都很成功. 但我们通过Flume消费一个配置了内外网分流的Kafka(版本0.10.1)集群时遇到了坑,却 ...
- kafka的advertised.host.name参数 外网访问配置
kafka的server.properties文件 ```host.name```开始只绑定在了内部IP上,对外网卡无法访问. 把值设置为空的话会kafka监听端口在所有的网卡上绑定.但是在外网访问时 ...
随机推荐
- tomcat与springmvc 结合 之---第20篇 springmvc 对于加载的bean对象存储在哪里
是
- canvas点阵函数波动,类似飘带或水波
canvas动画利用函数波动特点制作水波动画 <canvas id="myCanvas" width="500" height="400&quo ...
- JBoss JMXInvokerServlet 反序列化漏洞
poc地址:https://cdn.vulhub.org/deserialization/DeserializeExploit.jar
- JVM的内存管理机制-转载
JVM的内存管理机制 一.JVM的内存区域 对于C.C++程序员来说,在内存管理领域,他们既拥有每一个对象的"所有权",又担负着每一个对象生命开始到终结的维护责任. 对Java程序 ...
- 使用js实现全选功能。(全选,全不选,反选)
作业210721 提交代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- .Netcore HttpClient源码探究
源码搜索与概述 搜索HttpClient源码 https://source.dot.net/#System.Net.Http/System/Net/Http/HttpClient.cs 1.HttpC ...
- MIPS汇编学习
MIPS汇编学习 mips汇编不同于x86汇编,属于精简指令集,常见于路由器等一些嵌入式设备中. mips汇编没有对堆栈的直接操作,也就是没有push和pop指令,mips汇编中保留了32个通用寄存器 ...
- 040_Spring注解开发
目录 Spring注解开发 bean注册到Spring容器中 applicationContext.xml添加包扫描注解 实体类添加注解@Component 属性注入 属性添加注解@Value(&qu ...
- Python实现AI图像识别-身份证识别
图像识别说白了就是把一张照片上面的文字进行提取,提供工作效率 需求分析 身份证识别主要是把一张身份证照片上面的文字信息进行提取,不用再使用人工去手动抄写了,下面给大家说的这个身份识别主要是使用pyth ...
- 披着羊皮的Neo-reGeorg
混迹 Web 安全行业许久,查杀网站后门已是家常便饭.时间久了,养"马"场也见的多了,Neo-reGeorg 算得上是同类中战斗力超群的"野马"了,也深受黑客和 ...