一、lvs介绍
LVS,是Linux Virtual Server的简称,也就是Linux虚拟服务器,
是一个由国人章文嵩博士发起的自由软件项目。
中文站点:http://zh.linuxvirtualserver.org/
LVS有很多模式,我们主要用DR模式,来做四层负载均衡,可以用作四层代理数据库,也可以用作四层代理七层负载均衡
简述:硬件负载均衡(F5、Array)、LVS、Haproxy、NGINX的区别
nginx:胜在功能多,性能还够用,配置简单 haproxy:性能比nginx强一点,可以haproxy做四层--------》nginx七层----》代理web服务器 lvs性能堪比硬件负载均衡,可以用来四层代理数据库,或者四层代理七层负载均衡 硬件负载均衡,团队能力不足,花钱搞定,团队能力上来了还是lvs更省一些
应用场景
中小规模,日PV小于1000w,一般比流行的方案 1、四层:haproxy 2、七层:nginx 3、数据库层: 方案举例 mysql一主多从+MHA+(lvs+keepalived方案) MHA作用: 1、MHA会监控主库挂掉后,选出一个新主,然后其他从都像新主同步数据 2、MHA会使用脚本来维护一个写入操作用的vip,在选出新主后,写入操作的vip会自动偏移到新主上 lvs+keepalived作用: 1、维护一个读操作的vip 2、lvs四层负载均衡所有的数据库,包括主库+多个从库,主库用来接收写请求,但肯定也能接着读 总结:该方案提供一个写操作的vip、一个读操作的vip,然后应用程序自己实现读写分离 也可以不用lvs+keepalived,可以引入数据库中间件如mycat、atlas Atlas拥有的功能----》你访问atlas的ip地址,它帮你实现 1.读写分离 2.从库负载均衡 应用程序不需要自己实现读写分离,你也不需要用lvs去代理数据库了,中间件帮你做了 规模再大一些,四层会换成lvs,后端的数据库也要换架构方案,甚至mysql都会换成其他数据库
注意:何时引入何种技术,一定是要结合网站规模的增长来看,大致可以分为三个阶段
- 第一阶段:利用Nginx或HAProxy进行单点的负载均衡,这一阶段服务器规模刚脱离开单服务器、单数据库的模式,需要一定的负载均衡,但是仍然规模较小没有专业的维护团队来进行维护,也没有需要进行大规模的网站部署。这样利用Nginx或HAproxy就是第一选择,此时这些东西上手快, 配置容易,在七层之上利用HTTP协议就可以。这时是第一选择。
- 第二阶段:随着网络服务进一步扩大,这时单点的Nginx已经不能满足,这时使用LVS或者(硬件负载均衡F5、Array)就是首要选择,Nginx此时就作为LVS或者硬件负载均衡(F5、Array)的节点来使用,具体是用软件LVS还是硬件负载均衡?需要根据公司规模和预算来选择,但是一般来说这阶段相关人才跟不上业务的提升,所以购买商业硬件负载均衡已经成为了必经之路。
- 第三阶段:这时网络服务已经成为主流产品,此时随着公司知名度也进一步扩展,相关人才的能力以及数量也随之提升,这时无论从开发适合自身产品的定制,以及降低成本来讲开源的LVS,已经成为首选,这时LVS会成为主流。
最终形成比较理想的基本架构为:
- 四层:硬件负载均衡(F5或Array)/LVS
- 七层:Nginx/Haproxy
- 服务层:AppServer
对软件实现负载均衡的几个软件,从性能和稳定上还是LVS最牛,基本达到了F5硬件设备的60%性能,其他几个10%都有点困难。 不过就因为LVS忒牛了,配置也最麻烦了,而且健康检测需要另外配置Ldirector,其他HAPROXY和NGINX自己就用,而且配置超级简单。 所以建议,如果网站访问量不是门户级别的用HAPROXY或者NGINX就OK了,到了门户级别在用LVS+DR吧.
二、lvs构成
LVS 由于两部分构成
1、ipvs:ipvs负责核心的转发工作,工作于内核中netfilter INPUT钩子上,效率非常高,高于工作于用户态的nginx
2、ipvsadm:工作在用户空间的命令行工具,用于管理集群服务定义规则
详细点说说: 1、“IPVS通过在Netfilter框架中的不同位置(LOCAL_IN/FORWARD/LOCAL_OUT)注册自己的处理函数来捕获数据包, 并根据与IPVS相关的信息表对数据包进行处理,按照IPVS规则中定义的不同的包转发模式,对数据包进行不同的转发处理。” 2、现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前, 使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无 需给内核打任何补丁,可以直接使用LVS提供的各种功能
3、LVS的核心ipvs在k8s的svc中也是在用它,效率很高
三、lvs的特点
七层负载可以做的 URL 解析等工作,LVS 无法完成,它支持到四层
接下来有两个问题
- 1、为何lvs -DR模式明明是改二层的mac,或改三层的ip,但是却叫四层负载均衡呢?
因为lvs的一些负载均衡算法,比如最小链接调度,链接是传输层的概念是基于ip和端口的
所以你不能单看lvs怎么改数据包的去判定它的层!而应该综合来看,他要识别与后端rs服务器的链接,那就是要工作到四层才可以
要综合他所有的环节,取一个它可以处理到的最大层 - 2、四层负载比七层要快一些,那为何不干脆再低 一层,解析到三层然后做负载均衡呢?
简而言之:总结一句话就是,看你的需求,我们需求是要负载均衡http请求,http请求是基于tcp连接的,最低也就到四层了 - 详解的说:
- (1)因为用户的一次访问必须先与服务端建立连接后、才能交换数据包,如果在第三层也就是网络层做负载均衡,那么将失去「连接」的语义
(2)软件负载均衡面向的对象应该是 一个已经建立连接的用户,而不是一个孤零零的 IP 包。
(3)后面还会看到,实际上 LVS 的机器代替真实的服务器与用户通过 TCP 三次握手建立了连接,所以 LVS 是需要关心「连接」级别的状态的。
四、LVS的工作模式
LVS 的工作模式主要有 4 种
- DR(效率最高)
- NAT
- TUN
- Full-NAT
DR与NAT模式都限制主机必须在一个局域网里,为了打破这个限制才有TUN方案,但是TUN方案效率不如DR模式高
要详细了解下述lvs各个模式,有一个形象的比喻
1、数据包的发送过程—->寄快递
2、沿途的网络设备——>快递站、快递小哥
3、ip地址————->一个区域的地址
4、mac地址————>某个区域中、目标节点的具体地址
五、LVS的专业术语
节点角色简称
- DS:director server,即LVS负载均衡器
BDS:backup director server,为了保证负载均衡器的高可用衍生出的备份.
- RS:real server 真实的提供服务的server
不同作用的IP地址的简称
- CIP:Client IP
- VIP:向外部直接面向用户请求,作为用户请求的目标的ip地址。
- DIP: Director IP,配置在负载均衡器上、用于和内部服务器通讯的ip地址。
- RIP: Real Server IP,即真实的提供服务的server的IP地址
六、DR模式(性能最强,只扎一次心)
作图地址:https://www.processon.com/diagraming/58959fb0e4b0c87c63e760d1
配置示例:https://egonlin.com/?p=9312
lvs四层–代理数据库:real server是数据库
lvs四层–代理七层负载均衡nginx—代理web服务器:real server是七层负载均衡nginx,需要在它的lo上配置vip
在使用LVS(Linux Virtual Server)的Direct Routing(DR)模式下,实际运行的情况是这样的: 1、LVS的DR模式:在DR模式下,请求首先到达LVS, LVS根据配置的负载均衡算法选择一个后端服务器,并且将请求转发到这个后端服务器。在这种模式下,数据包的目的地IP不变,即VIP。 2、后端服务器:在这个配置中,被选中的后端服务器应该是配置有VIP的服务器,因为它们需要接收到这个VIP的流量。在使用Nginx作为七层负载均衡器的场景下,意味着Nginx服务器(作为real server)会拥有VIP。 3、Nginx的角色:这些Nginx服务器会根据七层的负载均衡规则来处理请求,可能包括基于HTTP头部、URL等的决策。然后Nginx将请求代理传递给实际的Web服务器。 4、Web服务器:最终的Web服务器只处理它们收到的来自Nginx的请求,而不直接暴露在VIP上。 因此,在这种DR模式下配合Nginx和Web服务器的设置中,真正配置VIP的“real servers”应该是承担七层负载均衡功能的Nginx服务器。Web服务器不需要以及也不应该配置VIP,而是只响应来自七层负载均衡Nginx的请求。这样做可以确保请求和响应的流程是连贯的,而网络拓扑的结构和流量管理可以根据LVS的DR模式正常工作
七、NAT模式(来回扎两次心)
特点简述
1.请求与响应都走负载均衡
2.所有rs必须把网关指向负载均衡才行,否则无法回包,因为回包时的源ip是rs服务器自己,目标ip是客户端的ip所以必须有网关转发才行
细说:
NAT(Network Address Translation)是一种外网和内网地址映射的技术。
NAT 模式下,网络报的进出都要经过 LVS 的处理。LVS 需要作为 RS 的网关。
当包到达 LVS 时,LVS 做目标地址转换(DNAT),将目标 IP 改为 RS 的 IP。RS 接收到包以后,仿佛是客户端直接发给它的一样。
RS 处理完,返回响应时,源 IP 是 RS IP,目标 IP 是客户端的 IP。
这时 RS 的包通过网关(LVS)中转,LVS 会做源地址转换(SNAT),将包的源地址改为 VIP,这样,这个包对客户端看起来就仿佛是 LVS 直接返回给它的。客户端无法感知到后端 RS 的存在。
配置示例:https://egonlin.com/?p=9315
八、TUN模式
- IP Tunnel(ip隧道)解决DR模式下RS和DS处于同一网段的问题。ip隧道可以理解为IP in IP, 即发送方在IP头的外部再包装一个IP头,接收方先解出第一层IP头,然后再按照正常流程处理剩下的的IP数据包。
- 具体流程为: 1)给数据包添加新的IP头,重新封装数据包然后选路将数据包发送给Real Server 2)RS发现请求报文的IP地址是自己的eth0的IP地址,就剥掉IP隧道包头 3)RS发现请求报文的IP地址是自己的lo的IP地址,就接收此报文,处理请求后正常发送响应报文(源IP是VIP,目的IP是ClientIP),将响应报文通过lo接口传送给eth0网卡然后向外发出
- lo:系统内部接收和发送数据包 127.0.0.1 eth0:网卡 MAC:网卡的物理地址 inet addr:网卡ip地址
- 特点为:1)DS添加了IP头,但是不修改传输层数据,故TUN不支持端口映射 2)只要IP可达,RS完全可以分布到不同的机房和网段 3)RS需要绑定VIP到lo,避免映射混乱 4)会存在MTU的问题,如果一个数据包已经达到了mtu的大小,ip隧道添加一个ip头之后,包的大小就会超过MTU(解决方案为支持PMTUD协议或减小RS的MSS) 5)解决了RS的部署和扩展问题,但是DS的扩展问题无法解决,只能做主备高可用
九、Full-NAT模式
无论是 DR 还是 NAT 模式,不可避免的都有一个问题:LVS 和 RS 必须在同一个 VLAN 下,否则 LVS 无法作为 RS 的网关。
这引发的两个问题是:
1、同一个 VLAN 的限制导致运维不方便,跨 VLAN 的 RS 无法接入。
2、LVS 的水平扩展受到制约。当 RS 水平扩容时,总有一天其上的单点 LVS 会成为瓶颈。
Full-NAT 由此而生,解决的是 LVS 和 RS 跨 VLAN 的问题,而跨 VLAN 问题解决后,LVS 和 RS 不再存在 VLAN 上的从属关系,可以做到多个 LVS 对应多个 RS,解决水平扩容的问题。
Full-NAT 相比 NAT 的主要改进是,在 SNAT/DNAT 的基础上,加上另一种转换,转换过程如下:
在包从 LVS 转到 RS 的过程中,源地址从客户端 IP 被替换成了 LVS 的内网 IP。
内网 IP 之间可以通过多个交换机跨 VLAN 通信。
当 RS 处理完接受到的包,返回时,会将这个包返回给 LVS 的内网 IP,这一步也不受限于 VLAN。
LVS 收到包后,在 NAT 模式修改源地址的基础上,再把 RS 发来的包中的目标地址从 LVS 内网 IP 改为客户端的 IP。
Full-NAT 主要的思想是把网关和其下机器的通信,改为了普通的网络通信,从而解决了跨 VLAN 的问题。采用这种方式,LVS 和 RS 的部署在 VLAN 上将不再有任何限制,大大提高了运维部署的便利性。
10、所有模式对比
11、ipvs调度算法
ipvs默认的调度算法是wlc,总共有八种调度算法如下所示
- rr:Round Robin,轮询
- wrr:Weight,加权轮询
- lc:最少连接数调度(least-connection),IPVS表存储了所有活动的连接。LB会比较将连接请求发送到当前连接最少的RS
- wlc:加权最少连接数调度,(active256+inactive)/weighed,权重越大连接数越少,则连接至此rs
- lblc:基于本地的最少连接数调度(locality-based least-connection):将来自同一个目的地址的请求分配给同一台RS,此时这台服务器是尚未满负荷的。否则就将这个请求分配给连接数最小的RS,并以它作为下一次分配的首先考虑
- lblcr:基于本地带复制功能的最少连接;对于已建立的请求,分配到同一台服务器;对于新请求,分配到连接数少的server
- dh:destination hash目标地址hash,功能类似于sh,但应用场景不同
- sh:source hash,源地址hash,根据hash表将来自同一IP请求发送至同一Real Server,这样在一定程度上破坏了负载均衡的效果;主要使用在电商网站,实现session affinity(会话绑定)