面试官问:HTTP 的负载均衡你了解么?你不是说了你们用的Nginx么?说一下把。

Posted Java极客技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试官问:HTTP 的负载均衡你了解么?你不是说了你们用的Nginx么?说一下把。相关的知识,希望对你有一定的参考价值。

点击蓝色“Java极客技术”关注我哟

加个“星标”,一起快乐成长



这是 Java 极客技术的第 275 篇原创文章


之前我讲了关于 HTTP 的安全性问题,本篇文章将会从一个朋友的面试题入手,来说一下关于 HTTP 的重定向和负载均衡。

1.HTTP 重定向

1.1 重定向是什么

重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置(如:网页重定向、域名的重定向、路由选择的变化也是对数据报文经由路径的一种重定向)。

上面是百度百科的解释,其实我在想到重定向的时候,第一反应是 Java 中的转发和重定向,其实道理差不多。听我来分析一波。

其实 HTTP 的重定向也算是 URL 的重定向,而URL 重定向,也称为 URL 转发,是一种当实际资源,如单个页面、表单或者整个 Web 应用被迁移到新的 URL 下的时候,保持(原有)链接可用的技术。HTTP 协议提供了一种特殊形式的响应—— HTTP 重定向(HTTP redirects)来执行此类操作,该操作可以应用于多种多样的目标:网站维护期间的临时跳转,网站架构改变后为了保持外部链接继续可用的永久重定向,上传文件时的表示进度的页面。

面试官问:HTTP 的负载均衡你了解么?你不是说了你们用的Nginx么?说一下把。

1.2 为什么要进行重定向

  • 可靠地执行 HTTP 事务;

  • 最小化时延;

  • 节约网络带宽;

出于这些原因,Web 内容通常分布在很多地方。这么做是出于可靠性的考虑。这样,如 果一个位置出问题了,还有其他的可用;如果客户端能去访问较近的资源,就可以更快地 收到所请求的内容,以降低响应时间;将目标服务器分散,还可以减少网络拥塞。

1.3负载均衡的部署方式

负载均衡有三种部署方式:路由模式、桥接模式、服务直接返回模式。路由模式部署灵活,约60%的用户采用这种方式部署;桥接模式不改变现有的网络架构;服务直接返回(DSR)比较适合吞吐量大特别是内容分发的网络应用。约30%的用户采用这种模式。

1、路由模式(推荐)

2、桥接模式

桥接模式配置简单,不改变现有网络。负载均衡的WAN口和LAN口分别连接上行设备和下行服务器。LAN口不需要配置IP(WAN口与LAN口是桥连接),所有的服务器与负载均衡均在同一逻辑网络中。由于这种安装方式容错性差,网络架构缺乏弹性,对广播风暴及其他生成树协议循环相关联的错误敏感,因此一般不推荐这种安装架构。

3、服务直接返回模式

2.常见的软件负载均衡技术

1、基于DNS的负载均衡

2、反向代理负载均衡(如Apache+JK2+Tomcat这种组合)

该种代理方式与普通的代理方式不同,标准代理方式是客户使用代理访问多个外部Web服务器,之所以被称为反向代理模式是因为这种代理方式是多个客户使用它访问内部Web服务器,而非访问外部服务器。

3、基于NAT(Network Address Translation)的负载均衡技术(如Linux VirtualServer,简称LVS)

3.负载均衡算法(重点)

1、轮询法

轮询法,就是将用户的请求轮流分配给服务器,就像是挨个数数,轮流分配。这种算法比较简单,他具有绝对均衡的优点,但是也正是因为绝对均衡它必须付出很大的代价,例如它无法保证分配任务的合理性,无法根据服务器承受能力来分配任务。

其实说白了就是将请求按顺序轮流地分配到每个节点上,不关心每个节点实际的连接数和当前的系统负载。

这种方式的优点很明显缺点也同样的明显。

  • 优点:简单高效,易于水平扩展,每个节点满足字面意义上的均衡,它无需记录当前所有连接的状态,所以它是一种无状态调度。
  • 缺点:没有考虑机器的性能问题,根据木桶最短木板理论,集群性能瓶颈更多的会受性能差的服务器影响。

给大家个最简单的图:

面试官问:HTTP 的负载均衡你了解么?你不是说了你们用的Nginx么?说一下把。

给大家展示一下简单的代码处理:

public static void main(String[] args) {
int[] arr = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
int index = 4; // 索引:指定起始位置
for (int i = 0; i < 17; i++) {
int nextIndex = (index + 1) % arr.length;
index = nextIndex;
System.out.println(arr[index] + " ,index=" + index);
}
}

2、随机法

随机法,是随机选择一台服务器来分配任务。它保证了请求的分散性达到了均衡的目的。同时它是没有状态的不需要维持上次的选择状态和均衡因子[5]。但是随着任务量的增大,它的效果趋向轮询后也会具有轮询算法的部分缺点。

其实随机法的优缺点和轮训法的优缺点差不多,不做太多的叙述了。

算法伪代码:

private static Map<String, Integer> serviceWeightMap = new HashMap<String, Integer>();

static {
serviceWeightMap.put("192.168.1.100", 1);
serviceWeightMap.put("192.168.1.101", 1);
serviceWeightMap.put("192.168.1.102", 4);
serviceWeightMap.put("192.168.1.103", 1);
}

public static String testRandom() {

// 重新创建一个map,避免出现由于服务器上线和下线导致的并发问题
Map<String, Integer> serverMap = new HashMap<String, Integer>();
serverMap.putAll(serviceWeightMap);

//取得IP地址list
Set<String> keySet = serverMap.keySet();
ArrayList<String> keyList = new ArrayList<String>();
keyList.addAll(keySet);

Random random = new Random();
int randomPos = random.nextInt(keyList.size());

String server = keyList.get(randomPos);

return server;
}

3、最小连接法

最小连接法,将任务分配给此时具有最小连接数的节点,因此它是动态负载均衡算法。一个节点收到一个任务后连接数就会加1,当节点故障时就将节点权值设置为0,不再给节点分配任务。

最小连接法适用于各个节点处理的性能相似时。任务分发单元会将任务平滑分配给服务器。但当服务器性能差距较大时,就无法达到预期的效果。因为此时连接数并不能准确表明处理能力,连接数小而自身性能很差的服务器可能不及连接数大而自身性能极好的服务器。所以在这个时候就会导致任务无法准确的分配到剩余处理能力强的机器上。

本文我就给大家先说这三种算法,下一篇文章我将完整的给大家展示其他的负载均衡算法和关于 HTTP 国际化的一些知识呦,敬请期待!

我是懿,一个正在被打击却努力前进的码农。


以上是关于面试官问:HTTP 的负载均衡你了解么?你不是说了你们用的Nginx么?说一下把。的主要内容,如果未能解决你的问题,请参考以下文章

面试官:负载均衡的算法你了解不?

京东面试官问我什么是负载均衡,我这么说怼翻他

面试官:说说你知道的几种负载均衡分类

手把手教你写出 6 种负载均衡算法!

面试官问:什么是负载均衡?跟他扯了40分钟

你了解多少种负载均衡呢?