闲谈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 kitsunebi客户端与iptables dnat转发

因为手机是不限量套餐,故而在杭州我一直主用自己的电信套餐来做为日常上网的方法,亦无需开通宽带了,然而电信在浙江的漫游策略则是漫游至南京的GGSN设备以便出互联网(江苏移动就比较好,可以直接从浙江本地出去),而该GGSN的上网ip,访问我的科学上网服务器因为中间有跳电信202.97的路由器,从而无法体现我科学上网服务器全程CN2 GIA线路的特质,而我家里电信则可以享用到双程CN2 GIA线程的特质,故而我决定在家里路由器通过iptables dnat直接转发下,这样在杭州可以先连回江苏家中,从而再走国内,这样跨境仍利用我家的双程CN2 GIA线程,效果预计会更好些。

然而在家中路由器直接开启dnat却无法让我直接使用,直到抓包才发现,由于我采用了Caddy做为https来反向代理websocket方式的v2ray服务端,而kitsunebi直接将我家中路由器ddns绑定的域名做为tls 1.2协商所用的sni,而Caddy服务器绑定的域名则是另外一个,这样就导致服务器tls协商不成功,从而无法正常加速。

而kitsunebi这样就要么在android手机上做个dns代理,仍用原来的域名,但通过dns代理为我家里路由器的ip,而这样的玩法较为复杂,而改kitsunebi的android代码,我也觉得较为费功夫;因而或可考虑再在家中的路由器再部署一个https代理来再代理一次,但这样亦较为复杂。

后来经查询发现,原来v2ray自己就有转发模式,这样可以直接在家中路由器开启vmess做为接入协议,出口则去连科学上网服务器的ws+tls服务,这样kitsunebi就可以直接通过vmess接入家中,快速部署了一下,果然成功解决。

实际测试发现下载带宽性能大约能够提升40%,油管更加顺畅,开心看视频去也。