闲谈v2ray的负载均衡

由于Oracle之前推出了always free(虽不知这个always会是多久)的云服务器,带宽限制在单台45Mbps左右,在白天电信国际出口不怎么拥塞的时候,还算是不错的一个选择,可以用来节省自己bwg cn2 gia线路为数不多的500G流量(按双向计费的规则来算,实则只有250G)。

由于我在外地是以vmess普通协议接入家中的软路由,软路由上的v2ray再中转统一走ws+tls的方式去科学上网,由于Oracle的机器有两台的免费额度,因此如果能并发用起来,效果应该还是不错的。

然而根据周末的测试结果来看,在软路由上,分别测试Oracle两台机器往家里软路由打的带宽总是超不过50Mbps,这让我觉得有点诡异,思考其中原因,应该是:

由于我的软路由性能一般,且pppoe拨号后,使得网卡的rss机制实际上是无法工作的,因为报文有一层pppoe封装,使得网卡无法看到pppoe里ppp封装的ip报文,因而无法进行多queue处理,查了内核rps的功能,似乎也没有这个功能。因而所有入方向即通常我们从外网的下载流量,都只能由单个cpu核心处理,如果没有做好cpu隔离的话,就会影响到性能

基于这个思考,且考虑到家里的电信支持多拨,马上在软路由上拨出来别外一个ppp接口,将另外一台云服务器的路由配置到此ppp接口上去。果不其然,并发流量直接搞到了100Mbps,这样从家里内网使用Oracle线路下载文件时,会被v2ray负载分担到两条云主机上,且通过不同的ppp接口出去,下载速度自然会dobule,实为物尽其用也。

写到这些,也谈谈我对负载均衡的理解,我觉得,负载均衡实际上来自于对于一个业务的拆解,比如从http协议的角度来说,http本身的处理,渲染页面实际是比较占cpu的,那么,通过前置一个4层proxy,让这个proxy主要负责tcp的报文中转,就可以将一堆http服务器置于这个proxy的后面,由于proxy只需要处理tcp报文中转,是可以实现比较高的性能的,并且可以通过硬件能力堆上去来scale up提高处理性能,而proxy则可以通过多台scale out来实现匹配到proxy的转发能力,从而提高整体集群的处理能力。

当然,如果在proxy前,再放一台三层交换机,来做下三层的ecmp,这样就又可以实现proxy一层的scale out,整个集群的能力就越来越强了。

附:

1、v2ray的负载均衡文档见:https://toutyrater.github.io/routing/balance2.html 这是该文档作者后来更新的负载均衡版本,先前他给出的方案并不好用,所以作者用了v2ray提供的新方案,我自己也是用这个模式配置的。

2、看起来这内核的维护者似乎也意识到ppp这种封装使得rps无效了?http://vger.kernel.org/~davem/davem_spain10.pdf

《闲谈v2ray的负载均衡》有3个想法

  1. 您好,想请问下,下载速度double服务端是怎么配置的策略呢?
    我看官方和其他开发者提供的信息,好像目前v2ray core提供的负载均衡策略只有简单的随机选择,这种策略目前基本上是不能实际运用的,因为会造成频繁跳IP,导致触发部分网站的风控策略。

    1. 看起来你的需求是避免跳ip,这和我的需求有一定区别,我只需要家里的不同设备,能够把两个服务器尽可能的占满,像你的需求,可能要根据用户的一些特征,如源ip,或者访问的域名这些做组合,来进行负载分担,这个可能v2ray还不一定能满足你的需求。

  2. 跳IP是个副作用,既不能提升网速,还要跳IP,如果能提升网速的话,跳IP也可以一定程度上接受,哈哈。
    我昨天又谷歌了一圈,大概懂网速double的原理是怎么回事了,但是还没弄懂您是怎么配置的,如果通过路由器多拨的话,怎么让v2ray同时向2个服务器发流量请求的呢,我看官方的均衡负载2说明中的outbounds,selector只能支持随机选择一个。

发表评论

您的电子邮箱地址不会被公开。