用iptables做负载均衡实现高并发

根据以往经验,在高配置服务器上部署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可以理解为步长或权重

基于此重负载方式,高配硬件/多JVM(服务)实例/进程内缓存,单机单接口可以实现50k+ TPS。

posted @ 2023-07-19 14:28  七彩代码  阅读(421)  评论(0)    收藏  举报