网关
负载均衡
- 第一层,DNS轮询,扩展多个lvs节点,实现负载均衡
- 第二层lvs层, 做四层负载均衡,通过 keepalived 实现高可用
- 第三层,NGINX,做7层负载均衡(也支持4层)
- 第四层,应用服务器
负载均衡算法
- 随机
优点: 简单,无状态 缺点: 无法根据请求内容做负载均衡,比如cookie, 请求头等,性能的机器
加权随机
轮询(Round Robin)\ 优点
- 简单易实现:轮询算法不需要复杂的计算和存储,因此可以快速实现。
- 均衡负载:它将请求均匀地分配给各个服务器,避免某些服务器负载过高而导致性能下降。
- 具有预测性:轮询算法的请求分配是有规律的,因此可以预测下一次请求分配到哪台服务器上。
缺点
- 无法应对不同服务器性能差异:轮询算法无法考虑服务器的实际负载情况和性能差异,可能导致某些服务器负载过高或过低。
- 不能适应动态变化的负载:例如服务器故障或网络异常,轮询算法无法适应这些情况。
- 长连接可能导致负载不均衡:如果客户端使用长连接方式访问服务器,轮询算法可能会导致某些服务器的连接数过高,从而影响负载均衡。
变种
- 完全轮询(Complete Round Robin)
- 权重轮询(Weight Round Robin)
平滑加权轮询(Smooth Weight Round Robin)
一致性hash
- 将请求的key通过hash算法计算出一个hash值
- 找到这个hash值在hash环上的位置
- 顺时针找到第一个节点,就是这个请求应该路由到的节点
如果多台服务器所“控制”的区域很小,或者有时候其中一台服务器宕机了,那么这个区域的请求就会被分配到另一台服务器上,就可能导致hash倾斜。 像这种情况可以加入虚拟节点,将每个真实节点映射到多个虚拟节点,这样就可以解决hash倾斜的问题。
优点: 同一个key,固定映射到同一个节点,适合缓存场景
- 源地址哈希(Source Hash)
目标地址哈希(Destination Hash)
最小连接数(Least Connections)