nginx开新坑

Nginx负载均衡策略

  1. 轮询 (round-robin)
    轮询为负载均衡中较为基础也较为简单的算法,它不需要配置额外参数。假设配置文件中共有 M 台服务器,该算法遍历服务器节点列表,并按节点次序每轮选择一台服务器处理请求。当所有节点均被调用过一次后,该算法将从第一个节点开始重新一轮遍历。
    特点:由于该算法中每个请求按时间顺序逐一分配到不同的服务器处理,因此适用于服务器性能相近的集群情况,其中每个服务器承载相同的负载。但对于服务器性能不同的集群而言,该算法容易引发资源分配不合理等问题。

  2. 加权轮询
    为了避免普通轮询带来的弊端,加权轮询应运而生。在加权轮询中,每个服务器会有各自的 weight。一般情况下,weight 的值越大意味着该服务器的性能越好,可以承载更多的请求。该算法中,客户端的请求按权值比例分配,当一个请求到达时,优先为其分配权值最大的服务器。
    特点:加权轮询可以应用于服务器性能不等的集群中,使资源分配更加合理化。
    Nginx 加权轮询源码可见:ngx_http_upstream_round_robin.c,源码分析可参考:关于轮询策略原理的自我理解。其核心思想是,遍历各服务器节点,并计算节点权值,计算规则为 current_weight 与其对应的 effective_weight 之和,每轮遍历中选出权值最大的节点作为最优服务器节点。其中 effective_weight 会在算法的执行过程中随资源情况和响应情况而改变。较为核心的部分如下:

  3. IP 哈希(IP hash)
    ip_hash 依据发出请求的客户端 IP 的 hash 值来分配服务器,该算法可以保证同 IP 发出的请求映射到同一服务器,或者具有相同 hash 值的不同 IP 映射到同一服务器。
    特点:该算法在一定程度上解决了集群部署环境下 Session 不共享的问题。

    Session 不共享问题是说,假设用户已经登录过,此时发出的请求被分配到了 A 服务器,但 A 服务器突然宕机,用户的请求则会被转发到 B 服务器。但由于 Session 不共享,B 无法直接读取用户的登录信息来继续执行其他操作。

    实际应用中,我们可以利用 ip_hash,将一部分 IP 下的请求转发到运行新版本服务的服务器,另一部分转发到旧版本服务器上,实现灰度发布。再者,如遇到文件过大导致请求超时的情况,也可以利用 ip_hash 进行文件的分片上传,它可以保证同客户端发出的文件切片转发到同一服务器,利于其接收切片以及后续的文件合并操作。

  4. 其他算法
    URL hash
    url_hash 是根据请求的 URL 的 hash 值来分配服务器。该算法的特点是,相同 URL 的请求会分配给固定的服务器,当存在缓存的时候,效率一般较高。然而 Nginx 默认不支持这种负载均衡算法,需要依赖第三方库。

    最小连接数(Least Connections)
    假设共有 台服务器,当有新的请求出现时,遍历服务器节点列表并选取其中连接数最小的一台服务器来响应当前请求。连接数可以理解为当前处理的请求数。

怎么判断某个点是否存在于三角形内

  1. 计算由该点划分出的三个三角形面积之和是否等于大三角形面积
    三角形面积根据海伦公式计算:
    $
    S = \sqrt{p(p-a)(p-b)(p-c)}
    $
    ,其中
    $
    p = a + b + c /2
    $

  2. 向量叉乘
    设点为M,三角形三个点分别为A,B,C,那么分别计算$\vec{MA} \cdot \vec{MB}$ 和 $\vec{MB} \cdot \vec{MC}$ 和$\vec{MC} \cdot \vec{MA}$是否为同号,同号说明在三角形内

  3. 射线法
    从点向三角形任意方向引出一条射线来判断交点,若为1则说明在三角形内


nginx开新坑
http://example.com/2024/05/01/nginx开新坑/
作者
李凯华
发布于
2024年5月1日
许可协议