LVS负载均衡之DR模式原理介绍
LVS基本原理
流程解释:
- 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间
- PREROUTING 链首先会接收到用户请求,判断目标 IP 确定是本机 IP,将数据包发往 INPUT 链
- IPVS 是工作在 INPUT 链上的,当用户请求到达 INPUT 时,IPVS 会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时 IPVS 会强行修改数据包里的目标 IP 地址及端口,并将新的数据包发往 POSTROUTING 链
- POSTROUTING 链接收数据包后发现目标 IP 地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器
对LVS基本概念不太了解的,先维基百科或者参考:Linux负载均衡LVS理论以及算法概要
LVS 的组成
LVS 由 2 部分程序组成,包括 ipvs 和 ipvsadm。
- ipvs(ip virtual server):一段代码工作在内核空间,叫 ipvs,是真正生效实现调度的代码。
- ipvsadm:另外一段是工作在用户空间,叫 ipvsadm,负责为 ipvs 内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器 (Real Server)
LVS 和 Keepalived
在 lvs+keepalived 环境里面,lvs 主要的工作是提供调度算法,把客户端请求按照需求调度在 real 服务器,keepalived 主要的工作是提供 lvs 控制器的一个冗余,并且对 real 服务器做健康检查(是不是还能提供服务?),发现不健康的 real 服务器,就把它从 lvs 集群中剔除,real 服务器只负责提供服务。具体操作是存活信号通常以一定的时间间隔发出,若一端在信号发出后未收到回复,则可判定数据链路离线并将之后的数据包重新路由到其他链路,直到旧链路重新上线为止。存活信号也可表示保留连接状态。若无存活信号,启用网络地址转换的路由器将于超时后中断连接。
keepalived运行原理
keepalived 通过选举(看服务器设置的权重)挑选出一台热备服务器做 MASTER 机器,MASTER 机器会被分配到一个指定的虚拟 ip,外部程序可通过该 ip 访问这台服务器,如果这台服务器出现故障(断网,重启,或者本机器上的 keepalived crash 等),keepalived 会从其他的备份机器上重选(还是看服务器设置的权重)一台机器做 MASTER 并分配同样的虚拟 IP,充当前一台 MASTER 的角色。
keepalived选举策略
选举策略是根据 VRRP 协议,完全按照权重大小,权重最大(0~255)的是 MASTER 机器,下面几种情况会触发选举
- keepalived 启动的时候
- master 服务器出现故障(断网,重启,或者本机器上的 keepalived crash 等,而本机器上其他应用程序 crash 不算)
- 有新的备份服务器加入且权重最大
keepalived 的配置文件说明
Keepalived 是运行在 lvs 之上, 它的主要功能是实现 RealServer(真实服务器)的故障隔离及 Director(负载均衡器)间的 FailOver(失败切换).
- keepalived 是 lvs 的扩展项目, 因此它们之间具备良好的兼容性
- 对 RealServer 的健康检查, 实现对失效机器 / 服务的故障隔离
- 负载均衡器之间的失败切换 failover
LVS负载均衡之DR模式
DR模式示意图:
流程解释:
重点将请求报文的目标 MAC 地址设定为挑选出的 RS 的 MAC 地址,当RS接收到这个数据包之后,将源MAC替换成自己的MAC,目标MAC地址为客户端地址。
(1) 当用户请求到达 Director Server,此时请求的数据报文会先到内核空间的 PREROUTING 链。 此时报文的源 IP 为 CIP,目标 IP 为 VIP,MAC地址一次为各自的MAC地址。
(2) PREROUTING 检查发现数据包的目标 IP 是本机,将数据包送至 INPUT 链。
(3) IPVS 比对数据包请求的服务是否为集群服务,若是,将请求报文中的源 MAC 地址修改为 DIP 的 MAC 地址,将目标 MAC 地址修改 RIP 的 MAC 地址,然后将数据包发至 POSTROUTING 链。 此时的源 IP 和目的 IP 均未修改,仅修改了源 MAC 地址为 DIP 的 MAC 地址,目标 MAC 地址为 RIP 的 MAC 地址。
(4) 由于 DS 和 RS 在同一个网络中,所以是通过二层来传输。POSTROUTING 链检查目标 MAC 地址为 RIP 的 MAC 地址,那么此时数据包将会发至 Real Server。
(5) RS 发现请求报文的 MAC 地址是自己的 MAC 地址,就接收此报文。处理完成之后,将响应报文通过 lo 接口传送给 eth0 网卡然后向外发出。 此时的源 IP 地址为 VIP,目标 IP 为 CIP,并且将源MAC地址改为自己的MAC,目标MAC改为客户端MAC。
(6) 响应报文最终送达至客户端
LVS/DR 模型的特性
- 特点 1:保证前端路由将目标地址为 VIP 报文统统发给 Director Server,而不是 RS
- RS 可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对 RIP 进行直接访问
- RS 跟 Director Server 必须在同一个物理网络中
- 所有的请求报文经由 Director Server,但响应报文必须不能进过 Director Server
- 不支持地址转换,也不支持端口映射
- RS 可以是大多数常见的操作系统
- RS 的网关绝不允许指向 DIP(因为我们不允许他经过 director)
- RS 上的 lo 接口配置 VIP 的 IP 地址
- 缺陷:RS 和 DS 必须在同一机房中
特点 1 的解决方案:
- 在前端路由器做静态地址路由绑定,将对于 VIP 的地址仅路由到 Director Server
- 存在问题:用户未必有路由操作权限,因为有可能是运营商提供的,所以这个方法未必实用
- arptables:在 arp 的层次上实现在 ARP 解析时做防火墙规则,过滤 RS 响应 ARP 请求。这是由 iptables 提供的
- 修改 RS 上内核参数(arp_ignore 和 arp_announce)将 RS 上的 VIP 配置在 lo 接口的别名上,并限制其不能响应对 VIP 地址解析请求。
DR(Direct Routing 直接路由模式)此模式时 LVS 调度器只接收客户发来的请求并将请求转发给后端服务器,后端服务器处理请求后直接把内容直接响应给客户,而不用再次经过 LVS 调度器。LVS 只需要将网络帧的 MAC 地址修改为某一台后端服务器 RS 的 MAC,该包就会被转发到相应的 RS 处理,注意此时的源 IP 和目标 IP 都没变。RS 收到 LVS 转发来的包时,链路层发现 MAC 是自己的,到上面的网络层,发现 IP 也是自己的,于是这个包被合法地接受,RS 感知不到前面有 LVS 的存在。而当 RS 返回响应时,只要直接向源 IP(即用户的 IP)返回即可,不再经过 LVS。
注意
(1) 确保前端路由器将目标 IP 为 VIP 的请求报文发往 Director:
(a) 在前端网关做静态绑定;
(b) 在 RS 上使用 arptables;
(c) 在 RS 上修改内核参数以限制 arp 通告及应答级别;
arp_announce
arp_ignore
(2) RS 的 RIP 可以使用私网地址,也可以是公网地址;RIP 与 DIP 在同一 IP 网络;RIP 的网关不能指向 DIP,以确保响应报文不会经由 Director;
(3) RS 跟 Director 要在同一个物理网络;
(4) 请求报文要经由 Director,但响应不能经由 Director,而是由 RS 直接发往 Client;
(5) 此模式不支持端口映射;
DR模式缺点
唯一的缺陷在于它要求 LVS 调度器及所有应用服务器在同一个网段中,因此不能实现集群的跨网段应用。
DR模式优点
可见在处理过程中 LVS Route 只处理请求的直接路由转发,所有响应结果由各个应用服务器自行处理,并对用户进行回复,网络流量将集中在 LVS 调度器之上。