工作中遇到上百台机器向一个集群环境(大约10台机器)上传文件的场景,想到了使用LVS来做ftp服务器的负载均衡。

但是NAT模式下请求、响应报文都要经过Director Server,在高负载的场景下Director Server的就会成为瓶颈。而虽然DR模式和TUN模式下响应报文是不经过Director Server的,但是对应大数据量的文件上传任务来说主要,瓶颈主要在于请求报文带来的大流量,怎么能将请求报文中的大流量分散到集群各节点?

想到使用FTP被动模式下的数据链路ip地址跳转功能,对于vsftp来说对应参数pasv_address。将该地址配置为LVS集群的real server的ip地址(ftp服务器的本机地址)。这样ftp客户端通过21端口经过LVS的Director Server连通控制链路后,会使用real server的ip地址连通数据链路。

因为数据链路不经过LVS的Director Server,而是直接通过数据链路链接各个集群的节点的FTP服务器,所以不论执行上传下载任务都可以实现负载均衡的目的。

注意点:因为vsftp对于数据链接和控制链路中报文中目的IP地址不一致的情况校验,会直接向FTP客户端返回RST消息终止数据链路的连接,对这种情况可以通过iptables修改数据链路中到达real server的报文中的目的IP为Director Server,以实现躲避校验的目的:

iptables -t nat -A PREROUTING -p tcp -dport ${pasv_min_port}:${pasv_max_port} -j DNAT --to_destination ${VIP}