为了保障系统的高可用,我们需要针对重要的服务启动多个,这样当其中的一个服务出问题的时候,其他服务可以继续工作,系统就做到了高可用,这也就是负载均衡的应用。

什么是负载均衡

负载平衡(Load balancing)是一种电子计算机技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。

以上来自于维基百科,这个定义看起来有点绕。其实在我们互联网中,负载均衡其实就用利用多态服务器提供单一服务,这种方案有时也被称为服务器农场。

比如我们常见的DNS负载均衡,其实就是对一个域名配置多个IP主机,这样当一个有问题的时候,其他的IP主机也可以正常的提供服务

负载均衡有很多负载,比如可以按照地理位置,给用户分配离他最近为止的IP,这样可以加快用户的访问速度;也可以根据响应时间、连接数等因素来进行灵活的调度。

Caddy的负载均衡

只要定义了多个上游(upstream),Caddy的反向代理就会使用负载均衡的能力,比如我们上篇 Caddy实战(五)| 配置反向代理 文章中的示例,就是用了负载均衡,代码如下所示:

1
2
3
reverse_proxy /api/*  {
	to node1:80 node2:80 node3:80
}

以上这个配置,它的负载均衡策略(调度方式)默认是随机的,我们可以通过 lb_policy 来指定不同的负载均衡策略,比如:

1
2
3
4
reverse_proxy /api/*  {
	to node1:80 node2:80 node3:80
    lb_policy first
}

以上代码指定的是 first 的负责均衡策略,也就是选择第一个可用的上游。

负载均衡策略

除了 first 外,还有很多负载均衡策略以供我们选择,下面就为你分别介绍他们。

  1. first:选取第一个可用的上游
  2. random:随机选取一个可用的上游
  3. least_conn:选取当前请求数最少的上游,这个比较适合长连接的场景
  4. ip_hash:根据IP的Hash值选取一个固定的上游
  5. random_choose :随机选取2个或者更多个上游,然后再从中选择负载最小的,n通常为2
  6. header:这个是根据请求头的Hash选取一个固定的上游,和 ip_hash 很像,只不过它是根据指定的请求头的值进行Hash,然后选取上游的。所以这里的用法是 header <request_header_name> ,要指定一个请求头。
  7. uri_hash:这个也和 ip_hash 很像,只不过它是根据请求的URI进行Hash,然后选取一个上游。
  8. round_robin:这个策略是循环迭代,挨个使用一个个上游,每个上游都可以被用到,轮着来。
  9. cookie [ []] :如果你理解了以上几个基于Hash的负载均衡策略,那么这个 cookie 的也会很好理解,其实它就是通过cookie的值的hash来选取一个上游。在这里 name 表示要获取cookie值的 name ,默认是 lbsecret 是用于Hash的密钥,使用的是Hamc256算法。

以上是Caddy支持的9个负载均衡策略,除了常规的first、random、least_conn外,其他几个主要是根据特定的『值』进行Hash,然后根据Hash后的值,再选取一个固定的上游,如ip_hash、uri_hash甚至cookie都是此类,只是实现的方式不同。

重试等待时间

当你设置了多个上游主机,启用了负载均衡后,不可避免的会遇到上游服务不可用的情况,默认情况下,Caddy的处理是:当上游服务器不可用的时候,客户端的请求就没有可用的服务来相应,客户端就会报错。

当然除了立即响应服务不可用,Caddy还提供了负责均衡的重试功能,这就是 lb_try_duration ,他可以设置一个重试的时间,比如1000毫秒。

这是什么意思呢?如果你设置了lb_try_duration 为1000毫秒,那么Caddy的负载均衡在处理该客户端请求时,如果选用了一个不可用的上游服务,就会继续重试,一直到找到一个可用的上游或者到了设置的1000毫秒时间为止。

也就是,这个时间,就是Caddy的负载平衡器尝试查找可用的上游主机时,客户端将等待最长时间。

重试时间间隔

有了重试等待时间,肯定也有重试时间间隔,因为正常的逻辑上来讲,不能马上去重试,因为马上重试的话,很大概率拿到的也是个不可用的上游主机,所以需要一个重试时间间隔,来控制重试的节奏,在Caddy中,就是 lb_try_interval ,默认是重试间隔是250ms,250毫秒。

所以你可以看到, lb_try_interval 是结合着lb_try_duration 来使用的。lb_try_duration 是重试等待的总时间,而lb_try_interval 是在这段时间内,每隔多久重试一次。

示例

其实Caddy的负载均衡示例非常简单,按照配置写即可,这里为了便于理解,我也写下:

1
2
3
4
5
# 按照ip hash 负载均衡
reverse_proxy /api/*  {
	to node1:80 node2:80 node3:80
    lb_policy ip_hash
}

如果要设置等待时间的话,可以这样:

1
2
3
4
5
6
# 按照ip hash 负载均衡,重试等待时间为5秒
reverse_proxy /api/*  {
	to node1:80 node2:80 node3:80
    lb_policy ip_hash
    lb_try_duration 5s
}

小结

这篇文章主要介绍了Caddy的负载均衡,并且对负责均衡的策略、重试等待时间、重试时间间隔做了详细的介绍,相信你已经会使用了。

在这篇文章中,我一直很强调「可用的上游主机」,那么什么是可用的呢?下一篇我将会为你讲解Caddy的健康检查,欢迎关注公众号接收查看。

本文为原创文章,转载注明出处,欢迎扫码关注公众号flysnow_org或者网站asf http://www.flysnow.org/ ,第一时间看后续精彩文章。觉得好的话,请猛击文章右下角「好看」,感谢支持。

扫码关注