通过iptables做本地端口分流实现高性能服务

发布时间 2023-07-19 14:35:55作者: 七彩代码

根据以往经验,在高配置服务器上部署Java服务,建议部署多个JVM实例,以提升JVM示例内存回收效率;
此时面临负载分发问题,常规想法是通过Nginx或者Apache做负载分流。然而在高并发情况下无论外置负载还是本机负载,都需要处理TCP端口占用问题,处理起来并不简单。

近期在做一个高性能测试时候,一位同学提供了不一样的思路,通过iptables为本机端口做负载分流,效果箱单不错。

iptables端口转发规则

两个端口实例:
iptables -t nat -I PREROUTING 1 -p tcp --dport 80 -m statistic --mode nth --every 2 --packet 0 -j REDIRECT --to-port 9000
iptables -t nat -I PREROUTING 2 -p tcp --dport 80 -m statistic --mode nth --every 1 --packet 0 -j REDIRECT --to-port 9001

四个端口实例:
iptables -t nat -I PREROUTING 1 -p tcp --dport 80 -m statistic --mode nth --every 4 --packet 0 -j REDIRECT --to-port 9000
iptables -t nat -I PREROUTING 2 -p tcp --dport 80 -m statistic --mode nth --every 3 --packet 0 -j REDIRECT --to-port 9001
iptables -t nat -I PREROUTING 3 -p tcp --dport 80 -m statistic --mode nth --every 2 --packet 0 -j REDIRECT --to-port 9002
iptables -t nat -I PREROUTING 4 -p tcp --dport 80 -m statistic --mode nth --every 1 --packet 0 -j REDIRECT --to-port 9003

dport是监听端口,可以理解为负载端口
toport是负载端口
every可以理解为步长或权重