动手撸个Caddy(六)| 反向代理中的负载均衡
为了保障系统的高可用,我们需要针对重要的服务启动多个,这样当其中的一个服务出问题的时候,其他服务可以继续工作,系统就做到了高可用,这也就是负载均衡的应用。
什么是负载均衡
负载平衡(Load balancing)是一种电子计算机技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。
以上来自于维基百科,这个定义看起来有点绕。其实在我们互联网中,负载均衡其实就用利用多态服务器提供单一服务,这种方案有时也被称为服务器农场。
比如我们常见的DNS负载均衡,其实就是对一个域名配置多个IP主机,这样当一个有问题的时候,其他的IP主机也可以正常的提供服务
负载均衡有很多负载,比如可以按照地理位置,给用户分配离他最近为止的IP,这样可以加快用户的访问速度;也可以根据响应时间、连接数等因素来进行灵活的调度。
Caddy的负载均衡
只要定义了多个上游(upstream),Caddy的反向代理就会使用负载均衡的能力,比如我们上篇 Caddy实战(五)| 配置反向代理 文章中的示例,就是用了负载均衡,代码如下所示:
|
|
以上这个配置,它的负载均衡策略(调度方式)默认是随机的,我们可以通过 lb_policy
来指定不同的负载均衡策略,比如:
|
|
以上代码指定的是 first
的负责均衡策略,也就是选择第一个可用的上游。
负载均衡策略
除了 first
外,还有很多负载均衡策略以供我们选择,下面就为你分别介绍他们。
- first:选取第一个可用的上游
- random:随机选取一个可用的上游
- least_conn:选取当前请求数最少的上游,这个比较适合长连接的场景
- ip_hash:根据IP的Hash值选取一个固定的上游
- random_choose :随机选取2个或者更多个上游,然后再从中选择负载最小的,n通常为2
- header:这个是根据请求头的Hash选取一个固定的上游,和
ip_hash
很像,只不过它是根据指定的请求头的值进行Hash,然后选取上游的。所以这里的用法是header <request_header_name>
,要指定一个请求头。 - uri_hash:这个也和
ip_hash
很像,只不过它是根据请求的URI进行Hash,然后选取一个上游。 - round_robin:这个策略是循环迭代,挨个使用一个个上游,每个上游都可以被用到,轮着来。
- cookie [ []] :如果你理解了以上几个基于Hash的负载均衡策略,那么这个
cookie
的也会很好理解,其实它就是通过cookie的值的hash来选取一个上游。在这里name
表示要获取cookie值的name
,默认是lb
,secret
是用于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的负载均衡示例非常简单,按照配置写即可,这里为了便于理解,我也写下:
|
|
如果要设置等待时间的话,可以这样:
|
|
小结
这篇文章主要介绍了Caddy的负载均衡,并且对负责均衡的策略、重试等待时间、重试时间间隔做了详细的介绍,相信你已经会使用了。
在这篇文章中,我一直很强调「可用的上游主机」,那么什么是可用的呢?下一篇我将会为你讲解Caddy的健康检查,欢迎关注公众号接收查看。
本文为原创文章,转载注明出处,欢迎扫码关注公众号
flysnow_org
或者网站asf http://www.flysnow.org/ ,第一时间看后续精彩文章。觉得好的话,请猛击文章右下角「好看」,感谢支持。