一、什么是负载均衡?
背景:我们一般会将我们的服务做集群部署(多机器),用来应对高并发流量,但是我们的入口都是同一个(如www.baidu.com
可能指向ip255.1.1.1
,也可能指向ip255.2.2.2
),具体如何将用户请求分发到集群中不同的机器上就是由负载均衡做的
负载均衡(Load Balance),意思是将负载(工作任务、访问请求)进行平衡,分摊到多个操作单元(服务器、组件)上执行,是解决高性能、单点故障(高可用)、扩展性(水平伸缩)的最终解决方案。
二、负载均衡分为哪几种?
以下是OSI七层模型,分为包括:
- 应用层:第七层
- 表示层
- 会话层
- 传输层:第四层
- 网络层:第三层
- 数据链路层:第二层
- 物理层
1、二层负载均衡(数据链路层)
负载均衡服务器向外提供一个虚拟IP(VIP),集群中不同的机器使用相同的IP地址,但是机器的MAC地址不一样。当负载均衡服务器收到请求之后,通过改写报文的MAC地址转发到对应的机器上。
2、三层负载均衡(网络层)
和二层负载均衡类似,也是提供一个虚拟IP(VIP),但是集群中不同的机器采用的是不同的IP地址。当负载均衡服务器收到请求之后,通过负载均衡算法转到到不同的机器上。
3、四层负载均衡(传输层-常用)
传输层中有TCP/UDP协议,数据包含了IP地址、端口号。当负载均衡服务器收到请求之后,通过修改数据包的IP地址+端口号从而转发到目标机器上。
我们一般会用LVS来做四层负载均衡。
4、七层负载均衡(应用层-常用)
应用层中有http、dns等协议,除了使用IP地址+端口号外,还可以根据七层中的URL等字段进行负载均衡。
我们一般会用DNS、Nginx、HAProxy来做七层负载均衡。
三、负载均衡有哪些常见算法?
负载均衡是通过负载均衡算法来决定请求要转发到哪台服务器上,负载均衡算法大致可以分为静态负载均衡算法和动态负载均衡算法。
其中比较常见的负载均衡算法有:
- 随机法:每次请求都随机转发到某一台服务器上(缺点是可能有些服务器经常被访问,有些服务器没有被访问)
- 轮询法:按照轮询的方式顺序转发到每一台服务器上,确保每台服务器被访问的次数都差不多一致
- 一致性hash法:通过hash方式计算转发到哪一台服务器上(也就是同参数的请求会落到同一台服务器上)
- 最小连接法:优先转发给连接数最少的服务器(可以最大程度保证请求分配合理化,提高服务器利用率,但是实现比较复杂)
- …
四、Q&A
1、什么是反向代理?
反向代理就是由原先客户端直接请求服务端改为中转了一层代理服务器,由代理服务器去做负载均衡和安全防护等。
反向代理和正向代理有什么区别呢?:
- 正向代理用于解决访问限制问题(如翻墙),反向代理用于解决负载均衡、安全防护等问题
- 正向代理服务端并分辨不出真实的客户端(以为代理服务器就是客户端),反向代理客户端并分辨不出真实的服务端(以为代理服务器就是服务端)
- 正向代理一般在客户端实现(如VPN),反向代理一般在服务端实现(如Nginx)