使用iptables OUTPUT规则实现负载均衡

目的:希望本机服务在发出调用请求的时候,可以负载均衡到不同的目的地址。

这个目的看似有些诡异,一般的负载均衡场景都是服务端在收到请求时,在服务端前段的网关上做负载均衡。但是确实存在这样的场景:在微服务治理场景中,没有了全局的负载均衡器,依赖本地代理实现负载均衡算法,如果某个客户端未连接到注册中心,或者其他场景下和注册中心失联,需要手工配置到目的路由,如改下/etc/hosts文件中,加入目的服务ip地址和服务名的对应关系。这种场景下,如果希望实现负载均衡可以使用iptables。

客户端在发出请求时,利用OUTPUT链,改下目标服务器的IP地址。

iptables -t nat -A OUTPUT -p tcp --dport 8090 -m state --state NEW -m statistic --mode nth --every 2 --packet 0 -j DNAT --to-destination 192.168.1.202:8090
iptables -t nat -A OUTPUT -p tcp --dport 8090 -m state --state NEW -m statistic --mode nth --every 2 --packet 1 -j DNAT --to-destination 192.168.1.203:8090

-m state --state NEW 表示只有在新建连接的时候才进行负载均衡,否则如果一个报文比较长,可能第一个分片发给A服务器,第二个分片发给B服务器,可能会导致重传,或者无法还原报文(未验证)。加上-m state --state NEW 使得只有新建连接时进行负载均衡,正常通行中的报文不处理

--mode nth --every 2 --packet 0 表示使用轮询的算法,每2个包,第一个包发给202,第二个包发给203。

连续测试发现:第1个包发给了202,第2个包发给了203,第三个包发给了204,第4个包不经过负载均衡,发送失败。

经过网上搜索解决方案:

https://bbs.archlinux.org/viewtopic.php?id=123653

kawi but I figured out what the problem was. In the old days before nth was part of the statistics module --every 2 --packet 0....--every 2 --packet 1 would have been correct. Now there is no global counter and it is reset per rule. So, I needed to do --every 2 --packet 0.... --every 1 --packet 0 instead. Now it works perfectly. I'm still unclear whether the connection marking was really necessary (it worked either way) other than for the restoremark policy, will have to look at that closer tomorrow.

是因为每个规则的计数器不一致导致的,测试的CentOS7.0:

改用:

iptables -t nat -A OUTPUT -p tcp --dport 8090 -m state --state NEW -m statistic --mode nth --every 2 --packet 0 -j DNAT --to-destination 192.168.1.202:8090
iptables -t nat -A OUTPUT -p tcp --dport 8090 -m state --state NEW -m statistic --mode nth --every 1 --packet 0 -j DNAT --to-destination 192.168.1.203:8090

后,连续测试,效果正常。

 

补充:有的方案可以指定counter,如:

iptables -t nat -A OUTPUT -p tcp --dport 8090 -m state --state NEW -m statistic --mode nth --every 2 --counter 1 --packet 0 -j DNAT --to-destination 192.168.1.202:8090
iptables -t nat -A OUTPUT -p tcp --dport 8090 -m state --state NEW -m statistic --mode nth --every 2 --counter 1 --packet 1 -j DNAT --to-destination 192.168.1.203:8090

但是测试环境提示不支持此参数:
iptables v1.4.21: unknown option "--counter"

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值