LVS 是基于linux内核开发的负载均衡技术,工作在 TCP/IP 第四层
在拿到客户端Syn报文之后,即在hash表中维护连接的socket记录
它会从Web后端服务器池中挑选一个服务器,然后利用NAT技术改写目标地址和端口,将客户端发过来的TCP报文转发过去;返回的时候,将利用ip隧道技术,web服务器将直接将数据转发到web客户端;
它有几种负载算法
a. round robin轮询 + 加权权重
b. 随机 + 加权权重
c. hash负载均衡(根据请求参数里的某个值,把这个固定的值算一个hash,就固定路由到那台服务器上去),这种比较适合后端缓存服务,比如redis缓存集群
d. 动态反馈负载均衡算法,根据连接数量和接口耗时动态计算
LVS 有以下几种模式设置:
I. Virtual Server via NAT
II. Virtual Server via IP Tunneling
III. Virtual Server via Direct Routing
上面我们说过,LVS 通过一个hash表维护了 Linux virtual server 与客户端socket的连接,超时任务会从hash表中剔除,那它是怎么做的呢?
在最开始的linux版本中,是通过为每一个连接建立一个定时器;但是大量的定时器会带来极高的cpu负载;
后来的版本优化了,采用多个时间轮timeWheel,原理与kafka一致;
我们大概描述一下 时间轮的工作原理:
每个时间轮都是一个数组,数组中每个元素放了一个任务列表(TimerTaskList), TimerTaskList是一个双向链表,小轮和大轮都在不停的走表,例如kafka是1ms,小轮带大轮,在走的过程中,会有任务加入,如果超过小轮的范围,则把任务放到大轮;当时间走到大轮某个元素的时候,它会把里面任务移动到小轮中去;这样等小轮走到时候,就可以执行任务了;
在互联网大型架构中,我们经常能见到 LVS + ngnix
那么ngnix 与LVS有什么区别呢?
ngnix是工作在Http第七层网络协议上的,针对Http文本协议进行的负载、路由、转发
而LVS是工作在TCP第四层协议,在linux内核对tcp包转发
NAT就是Network Address Translation,也就是网络地址转换,LVS利用NAT技术实现负载功能