当前位置: 首页 > news >正文

VPC网络架构下的网络上数据采集

介绍

        想象这样一个场景,一开始在公司里,所有的部门的物理机、POD都在一个经典网络内,它们可以通过 IP 访问彼此,没有任何限制。因此有很多系统基于此设计了很多点对点 IP 直连的访问,比如中心控制服务器 S 会主动访问物理机上的 Agent 从而拉取信息下发配置,假设调用频率很高,数据量很大。

        现在由于各种原因,各个部门之间的网络不再被允许互通,而是出现了隔离:

  1. 每个部门有自己专用的物理机,每个部门的POD只能部署到本部门的物理机
  2. POD 与物理机的网络是隔离的
  3. 同一个部门的物理机是网络互通的,不同部门的物理机是网络隔离的
  4. 同一个部门的POD是网络互通的,不同部门的POD的网络是隔离的
  5. 允许给为应用申请 VIP,而该 VIP 可以被所有 VPC 访问

        相当于对于每个部门来说,物理机处于一个单独的 VPC 内,POD 处于另外一个单独的 VPC 内,默认情况下 VPC 与 VPC 之间是网络隔离的。

        这里我们先假设所有部门的物理机和 POD 的 IP 依旧不会重复,从而先简化问题的讨论。

        上述只是我创造的一个虚拟场景,实际并不是这样的,但也不影响问题讨论。

        由于网络隔离的出现它会导致:

  1. 部署在每台物理机上的Agent(Daemonset形式)无法访问我们的中心控制服务器S
  2. 中心控制服务器S无法主动访问每台物理机上的 Agent 拉取信息下发配置

        我们的系统严格依赖上述2点,因此网络隔离的出现导致我们的系统连基本功能都用不了。我们并不想为每个部门单独部署一套我们的系统(运维成本高),而是想使用一套系统服务所有部门。

解法

        面对该问题考虑了如下解法:

  1. 改造系统架构,变成 “拉取配置”, "推送信息"
  2. 基于反向代理的网络访问
  3. 每个部门单独部署一套我们的系统

        解法1需要将点对点访问变成边缘 Agent 对中心控制服务器 S 的访问,一般来说 Agent 访问哪台 S 都是可以的,因此可以给 S 挂一个 VIP,让 Agent 去访问该 VIP 即可。

        但这涉及整个系统架构大改,暂时不考虑。

基于反向代理的网络访问

        解法2的来源是想到如果每台 Agent、中心控制服务器 S 能找一个第三方组成一个 VPN 网络,那么每个成员都会有一个新的虚拟 IP,使用该新的虚拟 IP 就可以实现原来的点对点IP直连访问。而我们要做的是在访问时,查询一下原始IP对应的新的虚拟IP,然后访问该 IP 即可。

        但是组 VPN 了解不够,并且只有一台VPN服务器也是不够的,应该是需要VPN集群,这对我来说就更难了。

        后来经过一些调研,发现有一个技术叫做“反向代理”,相关的软件参考了 frp https://github.com/fatedier/frp

反向代理介绍

        假设有如下4个角色:

        A: 处于 VPC 1 内

        R: 处于 VPC 1 内 (R 也可以就是 A 自身)

        S: S代表一组服务器,处于 VPC 2 内; 并且它配置了一个 VIP, VIP 可以被 VPC 1 里的成员访问

        B: 处于 VPC 2 内 (B 也可以就是 S 自身)

        此时 VPC 1 与 VPC 2 网络不通,仅 VPC 1 的成员可以通过 S 的 VIP 访问到 S。

        A 向 S 的 VIP 发起反向代理请求 (R IP, R port),S 的某个成员 S' 收到了反向代理请求 (R IP, R port),S' 为反向代理请求分配一个随机端口 S' port (也可以是固定端口,不过在我们这个场景下随机更好)。

        此后,B 就可以通过 (S' IP, S' port) 访问到 (R IP, R port)。

        

        因此,如果你有一个公网IP,那么你就可以把你某个内网的端口通过该公网IP做反向代理暴露出去。经常折腾软路由的人应该对此了解较深。

引入反向代理

        假设我们在中心引入一个 proxy server (简称PS)的角色,让每台 Agent、中心控制服务器 S 通过 VIP 找到任意一台中心 PS 服务器建立反向连接,建立反向连接后可以得到一条反向链路:(某PS的IP,某PS的端口,某Agent的IP,某Agent的端口),以下简称反向连接4元组.

        当我们要访问(某Agent的IP,某Agent的端口)时, 换成去访问(某PS的IP,某PS的端口)就可以了。

        当每台 PS 服务器建立反向连接时,它会将该反向连接4元组记录在某个地方供后续查询。当然销毁反向连接时也要记得删除4元组。

使用代理服务器屏蔽反向连接的细节

        考虑到还有其他应用也会访问物理机上的Agent,我们可以将该4元组的查询做成服务或者SDK供其他应用使用。但是这种方式对这些应用有一定侵入性,他们不一定愿意接入。

        我们还可以使用 socks5 代理技术来简化其他应用访问物理机上的Agent的流程。

        我们实现一个 socks5 server 的角色,对外提供一个 VIP:port 供其他应用连接,其他应用要做的仅仅只是在它们发网络请求的地方配置 socks5 代理(socks5 代理的支持很普遍的)。这个 socks5 server 的实现就是根据目标 IP 去查 4 元组,然后将请求转发到对应的 (PS IP,PS port) 上。

        如果你的Agent提供的是 HTTP 服务,那么你可以提供 HTTP 代理服务器而非 socks5,那应该会更简单一些。

性能问题

  • 每个反向连接会消耗一台 PS 的一个 port, 因此每台 PS 最多贡献6万个 反向连接, 保守点估算成5万. (我们假设 VIP 会尽量使得连接均匀分配到后端)
  • 所有的网络流量需要经过 VIP, 它本身有带宽限制, 比如 10Gb/s; 关于这一点我们可以想办法可以PS server 挂多个 VIP, 然后再申请一个域名, 将A记录设置为这多个VIP, 应该就可以起到一个负载均衡的效果
  • 如果你实现了 socks5 或 http 代理服务器, 那么它的 VIP 也是性能瓶颈
  • 当 PS 故障时,一些反向连接会在短时间内不可用; 我们可以要求每个 Agent 往 PS 建立 2 个连接(并且要想办法尽可能保证2个连接落在不同的PS实例上), 每个反向连接信息里可以维护一个心跳时间, 如果一个挂了, 那么流量都走另外一个.
  • 反向建连4元组脏了, 在一个非常繁忙的系统中 (S' IP, S' port) 可能被复用, 如果此时4元组数据脏了, 可能你想连到 (C IP, C port) 但实际却是连到 (D IP, D port); 关于这一点可以让每个 PS 手动维护 S' port 的分配, 在分配之前检查是否有脏数据残留; 或者可以在业务层的协议加入一个目标IP, 当Agent 收到请求时检查一下是否确实是发给自己的请求, 如果不是则报错(对业务有侵入性).

安全问题

        一般来说,公司之所以要引入 VPC 网络架构,就是为了隔离各部门的网络,属于有意为之。而我们的这种做法无疑是打破了这种隔离。但好在我们打破的范围仅仅局限在我们系统的业务 POD 之间,并不涉及其他业务 POD(虽然说我们确实有这个能力)。所以我的这种做法目前是可以被接受的。

相关文章:

VPC网络架构下的网络上数据采集

介绍 想象这样一个场景,一开始在公司里,所有的部门的物理机、POD都在一个经典网络内,它们可以通过 IP 访问彼此,没有任何限制。因此有很多系统基于此设计了很多点对点 IP 直连的访问,比如中心控制服务器 S 会主动访问物…...

模拟算法(模拟算法 == 依葫芦画瓢)万字

模拟算法 基本思想引入算法题替换所有的问号提莫攻击Z字形变换外观数列数青蛙 基本思想 模拟算法 依葫芦画瓢解题思维要么通俗易懂,要么就是找规律,主要难度在于将思路转换为代码。 特点:相对于其他算法思维,思路比较简单&#x…...

QtApplets-SystemInfo

QtApplets-SystemInfo ​ 今天是2024年1月3日09:18:44,这也是2024年的第一篇博客,今天我们主要两件事,第一件,获取系统CPU使用率,第二件,获取系统内存使用情况。 ​ 这里因为写博客的这个本本的环境配置不…...

vue3防抖函数封装与使用,以指令的形式使用

utils/debounce.js /*** 防抖函数* param {*} fn 函数* param {*} delay 暂停时间* returns */ export function debounce(fn, delay 500) {let timer nullreturn function (...args) {// console.log(arguments);// const args Array.from(arguments)if (timer) {clearTim…...

Hive学习(13)lag和lead函数取偏移量

hive里面lag函数 在数据处理和分析中,窗口函数是一种重要的技术,用于在数据集中执行聚合和分析操作。Hive作为一种大数据处理框架,也提供了窗口函数的支持。在Hive中,Lag函数是一种常用的窗口函数,可以用于计算前一行…...

Centos Unable to verify the graphical display setup

ERROR: Unable to verify the graphical display setup. 在Linux下安装Oracle时 运行 ./runInstaller 报错 ERROR: Unable to verify the graphical display setup. This application requires X display. Make sure that xdpyinfo exist under PATH variable. No X11 DISPL…...

Java 说一下 synchronized 底层实现原理?

Java 说一下 synchronized 底层实现原理? synchronized 是 Java 中用于实现同步的关键字,它保证了多个线程对共享资源的互斥访问。底层实现涉及到对象头的 Mark Word 和锁升级过程。 synchronized 可以用于方法上或代码块上,分别对应于方法…...

nginx访问路径匹配方法

目录 一:匹配方法 二:location使用: 三:rewrite使用 一:匹配方法 location和rewrite是两个用于处理请求的重要模块,它们都可以根据请求的路径进行匹配和处理。 二:location使用: 1:简单匹配…...

偌依 项目部署及上线步骤

准备实验环境,准备3台机器 1.作为前端服务器,mysql,redis服务器--同时临时作为代码打包服务器 192.168.2.65 nginx-server 2.作为后端服务器 192.168.2.66 java-server-1 192.168.2.67 java-server-2 安装nginx/mysql #安装nginx [rootweb-nginx ~]…...

PHP特性知识点扫盲 - 上篇

概述 之前在分析thinkphp源码的时候,对依赖注入等等php高级的特性一直想做一个梳理和总结,一直没有时间,好不容易抽一点时间对技术的盲点做一个扫盲和总结。 特性 1.命名空间 命名空间是在PHP5.3中引入,是一个很重要的工具&am…...

Docker一键极速安装Nacos,并配置数据库!

1 部署方式 1.1 DockerHub javaedgeJavaEdgedeMac-mini ~ % docker run --name nacos \ -e MODEstandalone \ -e JVM_XMS128m \ -e JVM_XMX128m \ -e JVM_XMN64m \ -e JVM_MS64m \ -e JVM_MMS64m \ -p 8848:8848 \ -d nacos/nacos-server:v2.2.3 a624c64a1a25ad2d15908a67316d…...

交换机04_远程连接

通过远程管理方式连接交换机 1、telnet简介 telnet 是应用层协议 基于传输层TCP协议的,默认端口:23 采用的是明文密码方式 不是很安全,一般用于内网管理。 2、ssh协议简介 ssh 是应用层的协议,基于传输层的TCP协议&#x…...

ES6定义一个类(函数内部定义属性,,原型定义方法 ), 实现继承?

ES6中使用class关键字定义一个类,使用extends关键字实现继承。下面是一个示例: class Animal {constructor(name) {this.name name;}sayHello() {console.log(Hello, my name is ${this.name});} }class Dog extends Animal {constructor(name, breed)…...

使用 Process Explorer 和 Windbg 排查软件线程堵塞案例分享

目录 1、问题说明 2、线程堵塞的可能原因分析 3、使用Windbg和Process Explorer确定线程中发生了死循环 4、根据Windbg中显示的函数调用堆栈去查看源码,找到问题 4.1、在Windbg定位发生死循环的函数的方法 4.2、在Windbg中查看变量的值去辅助分析 4.3、是循环…...

“智慧”千里眼助力水泵站

泵站是为水提供势能和压能,解决无自流条件下的排灌、供水和水资源调配问题的唯一动力来源,在工农业用水、防洪、排涝和抗旱减灾等方面发挥着重要作用。一旦出现异常,对经济生产将造成难以估量的损失,给水利安全管理造成负担。因此…...

C++多态性——(5)运算符重载(第二节)

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 身先才能率人,律己才能服人…...

ES -极客学习

Elasticsearch 简介及其发展历史 起源 Lucene 于 Java 语言开发的搜索引擎库类创建于 1999 年,2005 年成为 Apache 顶级开源项目Lucene 具有高性能、易扩展的优点Lucene 的局限性 只能基于 Java 语言开发类库的接口学习曲线陡峭原生并不支持水平扩展原生并不支持水…...

【大厂秘籍】系列 - Java多线程面试题

Java多线程面试题 友情提示,看完此文,在Java多线程这块,基本上可以吊打面试官了 线程和进程的区别 进程是资源分配的最小单位,线程是CPU调度的最小单位 线程是进程的子集,一个进程可以有很多线程,每条线…...

vue实现画笔回放,canvas转视频播放功能

示例图&#xff1a; 一、vue2版本 <template><div class"canvas-video"><canvasref"myCanvasByVideo"class"myCanvas"id"myCanvasByVideo":width"width":height"height"></canvas><d…...

Docker中镜像的相关操作

1.辅助操作 docker version&#xff1a;用查看docker客户端引擎和server端引擎版本信息。 docker info&#xff1a;用来查看docker引擎的详细信息。 docker --help&#xff1a;用来查看帮助信息。 2.镜像Image docker images&#xff1a;查看当前本地仓库中存在哪些镜像。 …...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...