背景
采购了大配置物理机,希望通过 LVS DR 模式负载 tomcat,但是发现 tomcat 实例数受限于物理机的个数,无法利用空闲的物理机资源扩容,也就是一台物理机只能有一个 tomcat 属于同一个 LVS 集群。
LVS DR 模式下,集群内的一个 RS 主机只能跑一个 tomcat ,无法通过新增 IP 扩容。首先 DR 模式要求前后端口一致,因此只能通过 IP 来区分服务了,但是新增 IP 又必须同时监听 VIP,而一个 RS 主机只能有1个 VIP,这必须导致新增的 tomcat 监听 VIP 冲突,因此一个 LVS 集群内的一台 RS 主机上只能跑一个 tomcat。
Clinet 和 RS 的通信
client 发起请求
[root@payun ~]# telnet 192.30.20.4 80
Trying 192.30.20.4...
Connected to 192.30.20.4.
Escape character is '^]'.
在 RS 上观察
可以在 RS 上观察到,Client 和 RS 上的 VIP 建立了连接,从这里了能说明一个 LVS 集群的 RS 上只能运行 1 个 tomcat。
[root@payun ~]# netstat -anp|grep 59|grep 80
tcp 0 0 ::ffff:192.30.20.4:80 ::ffff:192.30.17.59:56147 ESTABLISHED 4029/httpd
[root@payun ~]#
验证
如下是我用 httpd 做的验证。
httpd 只监听 VIP
只监听VIP,健康检查失败,无法转发请求到 RealServer。
# 192.30.20.15 的 /etc/httpd/conf/httpd.conf 修改配置为监听 VIP
Listen 192.30.20.4:80
# 192.30.20.15 restart服务
service httpd restart
# 192.30.20.11 keepalived 健康检查发现 192.30.20.15 服务 down 掉
[root@payun ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.30.20.4:80 rr persistent 7200
-> 192.30.20.16:80 Route 3 0 0
[root@payun ~]#
httpd 只监听主机 IP
只监听主机 IP,健康检查正常,RealServer 无法接收到包。
因为 DR 模式下 LVS 是通过 MAC 地址将包转发给 RealServer 的,不修改 IP 和 端口信息,包的目标 IP 还是 VIP,所以 RealServer 必须有 socket 监听 VIP 的端口,否则 Linux 内核会把包 drop 掉
# 192.30.20.15 的/etc/httpd/conf/httpd.conf 修改配置为监听主机 IP
Listen 192.30.20.15:80
# 192.30.20.15 restart服务
service httpd restart
# 192.30.20.11 keepalived 健康检查正常
[root@payun ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.30.20.4:80 rr persistent 7200
-> 192.30.20.15:80 Route 3 0 0
-> 192.30.20.16:80 Route 3 0 0
[root@payun ~]#
# Client 请求可以被转发,但是 RealServer 无法处理,如下在 192.30.20.13 上执行,因为请求转发到 RealServer 后,Linux 内核会将包送到应用的 socket 沲,但是 RealServer 并没有这个 socket,因为会报错
[root@payun ~]# curl http://172.30.20.4
curl: (7) couldn't connect to host
[root@payun ~]#
httpd 监听主机上的所有 IP
一切正常,实际上只需要 RealServer 的某个 instance 同时监听 主机IP 和 VIP 即可。
主机 IP 用于 keepalived 健康检查,VIP 用户实际的请求处理。
# 192.30.20.15 的 /etc/httpd/conf/httpd.conf 修改监听所有 IP
Listen 80