V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
whyorwhynot
V2EX  ›  宽带症候群

有同学知道这类流量负载均衡的现成方案吗?

  •  
  •   whyorwhynot · 2020-02-16 11:59:22 +08:00 · 3816 次点击
    这是一个创建于 1744 天前的主题,其中的信息可能已经有所发展或是发生改变。

    avatar 计算机 A 要访问 google,中间的数据包负载均衡到 B1、B2、B3 服务器,并发走三条线路,并在 C 服务器完成汇聚。 现实的场景就是公开的酸酸乳和挂掉的个人 vps,用途你懂的。

    楼主 google 了一堆关键词(链路聚合,流量汇聚等等)都没有找到,来 V2EX 求助啊
    
    62 条回复    2020-03-15 11:06:08 +08:00
    huayumo
        1
    huayumo  
       2020-02-16 12:32:57 +08:00
    牛逼,好思路
    whyorwhynot
        2
    whyorwhynot  
    OP
       2020-02-16 12:51:29 +08:00
    就差一个程序员了
    wtks1
        3
    wtks1  
       2020-02-16 12:54:11 +08:00 via Android
    好像之前在 V 站看到过有人搞出过这个,但似乎没有公开
    idhrwb01296
        4
    idhrwb01296  
       2020-02-16 12:55:39 +08:00 via Android
    加钱加到位,是不是机场都帮你做好了呢,比如中转、BGP
    optional
        5
    optional  
       2020-02-16 12:58:27 +08:00
    洋葱
    SaigyoujiYuyuko
        6
    SaigyoujiYuyuko  
       2020-02-16 12:59:28 +08:00
    意淫了个方案 不知道可不可行: A 和 B* 的机器组网 | B* + C 机器组网 然后 B* 和 C 机器上面 装 酸酸乳,A 机器添加组网后的 B*机器的酸酸乳连接,使用酸酸乳自带的负载均衡。
    DGideas
        7
    DGideas  
       2020-02-16 12:59:47 +08:00 via Android
    问题是既然楼主提到“负载均衡”,为啥还“并发”走三个服务器呢?

    先明确下需求
    sujin190
        8
    sujin190  
       2020-02-16 13:13:04 +08:00
    实现过一个,B1、B2、B3 中间机器开启端口转发,A 通过 B1、B2、B3 建立三条固定到 C 的 TCP 连接,A 通过轮询 B1、B2、B3 方式把所有数据包通过三条 TCP 连接发往 C,C 重新组包排序,A 和 C 之间多路复用实现代理转发请求
    whyorwhynot
        9
    whyorwhynot  
    OP
       2020-02-16 13:21:20 +08:00
    @optional 类似 tor,但是是走酸酸乳线路节点,类似的有 MPTCP
    whyorwhynot
        10
    whyorwhynot  
    OP
       2020-02-16 13:23:05 +08:00
    @idhrwb01296 机场不一定安全,这样做流量从自己的 vps 出,还可以充分利用 vps
    whyorwhynot
        11
    whyorwhynot  
    OP
       2020-02-16 13:24:51 +08:00
    @DGideas 一个链接的数据包分流到三个线路去走,最大化吞吐率
    whyorwhynot
        12
    whyorwhynot  
    OP
       2020-02-16 13:27:20 +08:00
    @SaigyoujiYuyuko 貌似酸酸乳的负载均衡是基于连接的吧
    SaigyoujiYuyuko
        13
    SaigyoujiYuyuko  
       2020-02-16 13:29:24 +08:00
    @whyorwhynot 好像是的
    whyorwhynot
        14
    whyorwhynot  
    OP
       2020-02-16 13:37:27 +08:00
    @sujin190 我的想法差不多,不过不是端口映射,是直接本地搞个客户端通过 B1、B2、B3 的酸酸乳暴露在本地的多个 socks5 代理连接 vps 服务端,服务端程序负责组包
    zlkent
        15
    zlkent  
       2020-02-16 13:38:16 +08:00
    没太看懂,现成的不是 haproxy 就能实现了? passwall 和 kool 的 ss 插件都带这个功能了。
    whileFalse
        16
    whileFalse  
       2020-02-16 13:40:42 +08:00
    可以看看 Speedify
    whyorwhynot
        17
    whyorwhynot  
    OP
       2020-02-16 13:50:05 +08:00
    @zlkent haproxy 应该还是基于连接做的负载均衡,单个 TCP 连接还是走的一条线路,我的想法是通过增加一个 vps 实现数据包的远端组包,一个连接的数据包可以走不同的链路
    opengps
        18
    opengps  
       2020-02-16 13:54:31 +08:00 via Android
    套娃🐰
    Archeb
        19
    Archeb  
       2020-02-16 13:58:58 +08:00
    一个鸡肋套娃方案
    套娃,用 B1B2B3 的三个代理来连接 C 上的 VPN ( VPN over SOCKS5 )
    然后 A 上出来三个接口,C 上也出来三个接口
    直接两端对这三个接口做链路聚合即可( NIC Bonding )

    如果需要实用方案的话还是自己造轮子吧
    whyorwhynot
        20
    whyorwhynot  
    OP
       2020-02-16 14:03:55 +08:00
    @whileFalse 这个貌似是支持多链路的,原理差不多,轮子的自由 door 貌似也是
    digimoon
        21
    digimoon  
       2020-02-16 14:04:50 +08:00
    @whyorwhynot 假设你一个文件三等分,中间的那份特别慢,头和尾不还是要等中间的到了才能组合?

    还是说你想一个文件同时走三个网络,取最快返回结果的那个?
    whyorwhynot
        22
    whyorwhynot  
    OP
       2020-02-16 14:06:51 +08:00
    @Archeb 直连可能被 ban 或者速度慢,分成多线连接,看起来似乎可以提速,效果还得实测。。
    whyorwhynot
        23
    whyorwhynot  
    OP
       2020-02-16 14:13:46 +08:00
    @digimoon 是前者,数据包的实时分流,增大带宽,的确会有慢的线路,如果真要做会对线路质量做测评。
    laminux29
        24
    laminux29  
       2020-02-16 14:20:14 +08:00   ❤️ 3
    你这不是负载均衡,而是智能路由。

    不仅需要拆包并发,还要实现瓶颈管理(优质线路满载时计算转发到劣质线路是否划算)、延时预算(走一条还是走多条,只走优质还是优劣并走)、重发管理(如果接收端存活,则缺失片段需要一直寻找不同线路重发)等等。

    这一套东西,是真正的科研,弥补了现有协议与路由运作方式的不足,这可不便宜,更别说免费了。
    whyorwhynot
        25
    whyorwhynot  
    OP
       2020-02-16 14:20:25 +08:00
    @opengps 想白 piao 公共节点做加速
    whyorwhynot
        26
    whyorwhynot  
    OP
       2020-02-16 14:24:11 +08:00
    @laminux29 考虑的因素多了的确很复杂,toy 就可以了。。。
    Love4Taylor
        27
    Love4Taylor  
       2020-02-16 14:52:12 +08:00 via Android
    MPTCP
    ericbize
        28
    ericbize  
       2020-02-16 14:57:03 +08:00
    太复杂了,根本不需要这样子
    MiaRunis
        29
    MiaRunis  
       2020-02-16 15:29:33 +08:00
    @ericbize 有必要的,因为跨境链路这一节不稳定,随时可能被墙,这是高可用性的最佳实践
    MiaRunis
        30
    MiaRunis  
       2020-02-16 15:35:50 +08:00
    目前公开 /免费的负载均衡方案都没有直接并发的,直接并发的都没有高可用,
    不想付钱的话目前效果最好的只有 haproxy 真 https 检测模式+CDN 海量随机节点。
    自动剔除被 ISP 限流或墙掉的 ip,可以确保高可用,不能保证大流量和低延迟。
    whyorwhynot
        31
    whyorwhynot  
    OP
       2020-02-16 16:15:53 +08:00
    @MiaRunis 3ks,机场和自建的都在用,就是宅久了,想尝试些新玩意
    runshine
        32
    runshine  
       2020-02-16 17:22:34 +08:00 via Android
    TCP 乱序得问题很难解决
    GM
        33
    GM  
       2020-02-16 17:34:38 +08:00
    看你对通信品质的要求了。
    如果没要求,那很容易。
    如果对实时性要求比较高,那很难,很难,很难。

    多个节点的通信延迟是不一样的,A、C 每次都必须等待所有包都送达才能完成一次完整的通讯。延迟起码高 3 倍。
    whyorwhynot
        34
    whyorwhynot  
    OP
       2020-02-16 18:53:01 +08:00
    @GM 没有这么悲观吧,看个 youtube,三条线路同时走,会受限于延迟最高的那条线路
    whyorwhynot
        35
    whyorwhynot  
    OP
       2020-02-16 18:57:26 +08:00
    @runshine 只要考虑传递的流量数据的重排序就可以了吧
    Moofish
        36
    Moofish  
       2020-02-16 19:31:44 +08:00
    OpenWRT 有现成的方案,不过好的节点跑 8K 已经很轻松了,负载平衡其实意义不大
    whyorwhynot
        37
    whyorwhynot  
    OP
       2020-02-16 20:00:25 +08:00
    @Moofish 求问,Openwrt 的现成方案是啥
    hicdn
        38
    hicdn  
       2020-02-16 20:43:22 +08:00
    这不就是 CDN 吗?
    whyorwhynot
        39
    whyorwhynot  
    OP
       2020-02-16 21:11:18 +08:00
    @hicdn no,cdn 做不了数据包层级的分流和汇总
    Moofish
        40
    Moofish  
       2020-02-16 21:16:07 +08:00
    @whyorwhynot 某工具内嵌了负载平衡,可以同时用多个节点的,甚至你多 WAN 都可以指定哪个节点走哪条宽带
    ik
        41
    ik  
       2020-02-16 21:18:32 +08:00 via iPhone
    嫌机场不安全可以 在自建代理上套机场,是不是省事些
    whyorwhynot
        42
    whyorwhynot  
    OP
       2020-02-16 21:18:59 +08:00
    @Moofish 这个工具应该还是基于连接做的负载均衡吧,没办法将一个连接的数据包做分流的。并不是真的同时,只在多连接的情况下有效
    whyorwhynot
        43
    whyorwhynot  
    OP
       2020-02-16 21:25:20 +08:00   ❤️ 1
    @ik 其实更多的是想要利用公共资源(捡垃圾做出高性能的东西,图拉丁垃圾佬的梦想),和这种方案到底能够达到何种程度的加速
    hicdn
        44
    hicdn  
       2020-02-16 21:40:31 +08:00
    @whyorwhynot CDN 在特殊场景是可以做流量的汇总。比如在 vps 做个反向代理,然后用 CDN 加速,aria2c 利用多个 CDN 节点多源下载。速度叠加很明显,大概是 1+1+1=2。
    whyorwhynot
        45
    whyorwhynot  
    OP
       2020-02-16 21:50:18 +08:00
    楼主目前找到了 VPN Bonding、openmptcprouter、MLVPN、overthebox 貌似有希望。。。
    whyorwhynot
        46
    whyorwhynot  
    OP
       2020-02-16 21:53:19 +08:00
    @hicdn 这个还是基于连接的速度叠加,对单个连接无法加速。基于连接的酸酸乳和 haproxy 都可以做吧
    hicdn
        47
    hicdn  
       2020-02-16 21:57:25 +08:00
    @whyorwhynot 如果基于单个连接的加速搞出来,路由器多播叠加宽带就用着很爽了。等你好消息。
    akira
        48
    akira  
       2020-02-16 23:11:37 +08:00
    这个不就是 tor 么
    deorth
        49
    deorth  
       2020-02-16 23:16:45 +08:00
    v2ray 的负载均衡,不过我这里始终达不到带宽叠加的效果
    kennylam777
        50
    kennylam777  
       2020-02-17 00:10:43 +08:00
    同意 @laminux29 所說的
    如果是多條性能相同的媒介, Bonding/ECMP 就可以做到封包級別的分發, 看來很簡單。

    但殘酷的現實問題就是每條線路性能不同, 還真的是科研級別的東西,
    MiaRunis
        51
    MiaRunis  
       2020-02-17 00:13:32 +08:00   ❤️ 1
    @whyorwhynot 大佬你做成了记得发出来,至少给我们提个思路谢谢。最怕那种问题挂着结果提问的人只写个“解决了”的,想打人
    totoro625
        52
    totoro625  
       2020-02-17 01:56:22 +08:00 via iPhone
    @ik #41 搭车问一下,是使用前置代理的功能么?
    iOS 端似乎没法实现
    charslee013
        53
    charslee013  
       2020-02-17 03:28:37 +08:00
    最简单的就是用 ssh 转发 C 机器的端口到 B1 B2 B3

    Example : ssh -CfNg -R <目标端口>:127.0.0.1:<转发机器端口> root@<目标 IP>

    不过这种不敢保证可用性,建议在 crontab 添加定时任务保证挂掉之后能重启

    又或者买个域名挂在 cloudflare 上走 CDN 通道 (移动网络不推荐
    GM
        54
    GM  
       2020-02-17 09:17:58 +08:00   ❤️ 1
    @MiaRunis 哈哈哈哈,简直不能再同意,每次搜问题碰到这种人,真想顺着网线爬过去打他一顿。
    ik
        55
    ik  
       2020-02-17 09:57:14 +08:00 via iPhone
    @totoro625 我差不多也就是这个意思吧,但是没有这样弄过。
    linux 用 proxychain-ng + python 版 ssr ,测试可以实现
    missdeer
        56
    missdeer  
       2020-02-17 10:36:43 +08:00
    如果我理解没错的话,3 个 B 上是酸酸乳?那么有 2 个现成的方案:
    1. haproxy,tcp 负载均衡,要求 3 个 B 上的设置完全相同
    2. https://github.com/cloudwu/mptun,原理是 https://blog.codingnow.com/2015/07/mptun.html
    linvon
        57
    linvon  
       2020-02-17 10:42:58 +08:00
    这种会不会对实际网络环境有过于理想化的依赖?
    yankebupt
        58
    yankebupt  
       2020-02-17 11:40:28 +08:00   ❤️ 1
    @whyorwhynot 這個是犧牲穩定性做代價的。
    假設每條線路 95%穩定性,差不多 5%波動
    三條聚合,如果流量波動特性相互獨立的話
    95%三次方大概 85.73%的穩定性...差不多 15%的波動...
    線路質量會差很多。
    除非冗餘...比如同時發包或者各種糾錯碼…
    但是流量要錢的
    ghjexxka
        59
    ghjexxka  
       2020-02-17 15:50:47 +08:00
    公开 ssr 开启负载均衡和连接 C 的客户端开启前置代理到 ssr 的 socks5/http 吗?模式就选低错误优先好了😂
    chijiao
        60
    chijiao  
       2020-02-17 23:32:03 +08:00
    有一种可能,就是基于数据包的负载均衡,就是说第一个包走节点 1,第二个包走节点 2,但是还是没办法把带宽增加,因为包是连续的。这个用 iptables 就可以实现。
    whyorwhynot
        61
    whyorwhynot  
    OP
       2020-02-20 22:56:12 +08:00
    楼主自己抽空用 python 写了个蹩脚的聚合 socks5,socks 代理节点搞了 5 个都是内网的,聚合节点也是内网的,speedtest 测速结果才 3Mbps,也是服了。。不过 github 找到了一个 PoorMansBonding 项目,让 tun 流量走多条 tcp 连接,在 vps 汇聚,配合路由器上开个透明代理,自动负载均衡将 tcp 链接分配到多个链路,也算是实现了想法了 😃 😃
    whyorwhynot
        62
    whyorwhynot  
    OP
       2020-03-15 11:06:08 +08:00
    rabbit-tcp 配合 haproxy 负载均衡也类似
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3758 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 10:42 · PVG 18:42 · LAX 02:42 · JFK 05:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.