应用服务器负载均衡有两个步骤:
1.根据负载均衡策略选择真实服务端,常见策略有轮询、加权轮询、ip_hash、cookie、url_hash等;
2.把请求转发到真实服务器,转发方式有二到七层负载均衡。
请求转发方式
二层负载均衡
二层负载均衡,是指在数据链路层修改mac地址进行负载均衡。
real server直接响应数据给client,响应过程不经过load balance,这种负载均衡方式呈三角传输,也被称为直接路由模式(DR模式)。
load balance跟real server的ip需要配置成一致,否则请求数据包的目标地址,与响应数据包的源地址不一致。
三层负载均衡
三层负载均衡,是指在网络层修改目标ip地址(DNAT协议)进行负载均衡,实际上,还用到了SNAT协议修改源ip地址。
NAT(network address translation, 网络地址转换)包含SNAT和DNAT
SNAT修改源地址,DNAT修改目标地址
步骤1,client请求load balance的外网ip地址。
步骤2,load balance通过负载均衡策略选中192.168.1.1为真实的目标服务器,为了让请求数据包发到目标服务器,需要修改目标ip为192.168.1.1。另外,为了让目标服务器的响应数据包能发回load balance,需要修改源ip为192.168.1.0。
步骤3,目标服务器响应数据,发给load balance。
步骤4,load balance响应数据给client,需要修改目标ip为client ip,修改源ip为114.100.80.10。
四层负载均衡
感觉跟三层负载均衡几乎一毛一样,不知道有啥区别。。。有高人路过求指点
七层负载均衡
七层负载均衡,即应用层负载均衡,通常以反向代理的方式实现(最常见的是nginx)。
client向load balance发起http请求,load balance向real server发起http请求,再把real server的响应返回给client。
由于需要重发http请求,七层负载均衡性能较差,但是更智能和安全,因为应用层可以获取甚至修改请求的真实内容(即应用数据),比如cookie、url等,可以做一些智能的操作,比如根据cookie/url转发请求,也可以做一些安全操作,比如过滤特定报文、防止SYN Flood攻击等。
负载均衡策略
常见的负载均衡策略,有轮询、加权轮询、ip_hash、cookie、url_hash,根据服务器响应时间转发、根据最少连接转发等等。
nginx可以安装第三方插件,使用第三方实现的策略
轮询:按服务器列表顺序转发请求,轮询是nginx默认的策略,本策略适合服务器配置相当、请求无状态(即不依赖session)的场景
加权轮询:如果不同服务器配置不同,可以为配置高的服务器增加权重
ip_hash:根据ip哈希结果转发,可以实现同一用户持续请求同一服务器(即会话保持),适合有状态(即依赖session)的场景,对png、jpg、js、css等静态资源的请求,不适合使用本策略
cookie:根据特定cookie转发请求,一般也是用于实现会话保持,比如第一次请求时,为服务器A、B分别种上service-flag=a、service-flag=b的cookie,后续请求根据cookie转发
可以参考haproxy实现会话保持
url_hash:根据url哈希结果转发,同一个接口始终请求同一台服务器,一般配合缓存使用,可以提高缓存命中率
根据服务器响应时间转发:优先转发到响应时间较快的服务器
根据最少连接转发:优先转发到连接数较少的服务器