负载均衡的常见几种算法
我们不管是使用nginx还是使用分布式架构下的路由组件都一定会遇到负载均衡的问题,因为在分布式架构下,一般都不会中提供一个单独的数据服务结点,而是通过若干个服务集群的形式保证系统的高可用。
下面我们来谈一谈负载均衡的一些常见的算法。
说到这里很多可能心里很疑惑说自己使用了gateway,也使用过zuul这种路由组件,可是从来没有配置或者声明过负载均衡的策略呀,其实这都来源于约定大于配置的一个原则,也就是说没有配置便是最好的配置,因为他们都给我们了默认配置好了,当然不管是gateway还是zuul,其默认的策略均是轮询策略。
轮询
每次的请求到达时,对每个服务器都轮询访问,保证每个服务器命中概率相同,实现简单但无法解决不同服务器之间性能差异问题
下面我们看看在nginx中如何实现这种轮训策略。
location '^~/api/'{
proxy_pass http://testgroup/api/;
}
上面的这个配置相信小伙伴们都比较熟悉,当我们请求后缀中含有/api的时候,就会把请求转发到http://testgroup/api/,如:我们请求:http://192.168.1.2:8081/api/time,那么该请求则会被转发到‘http://testgroup/api/time’
# 轮询(默认策略)ABAB...
upstream testgroup{
server 192.168.1.69:8082;
server 192.168.1.79:8082;
}
加权轮询
权重高的服务器请求命中的概率更高,根据不同服务器的性能调整权重比可以降低服务器性能差异带来的问题。
算法实现上可以将所有的服务器连接对象放到一个list中,按权重比例放不同数量的连接对象到list,比如有三台服务器权重比是,13,list中的连接对象数量数可以是1,2,3,轮询访问这个list即可
#ABBABB...
upstream testgroup{
server 192.168.1.69:8082 weight=1;
server 192.168.1.79:8082 weight=2;
}
热备策略
# AAA... ->A突然宕机了->BBB...
upstream testgroup{
server 192.168.1.69:8082 ;
server 192.168.1.79:8082 backup;
}
随机
所有服务器随机访问,实现简单,服务器的命中概率取决于随机算法,无法解决不同服务器之前性能差异问题
加权随机
实现上可以参照加权轮询,生成的随机数作为list列表的索引值,也可以降低服务器性能差异带来的问题
IP Hash
对请求的ip地址用hash算法映射到服务器上,保证一个客户端的所有请求都命中到一台服务器上,适合服务端保存客户端的状态,开启session会话的情况,但是不能跨服务器会话,如果服务器有新上线,下线,重启等导致服务器序号发生改变时会导致此种策略异常。
# nginx会根绝访问ip的hash分配结果,让相同客户端的ip请求相同的服务器
upstream testgroup{
server 192.168.1.69:8082 ;
server 192.168.1.79:8082 ;
ip_hash;
}
URL Hash
对url请求使用hash映射到指定服务器,可以配合缓存使用,在各服务器不共享缓存的情况下,对需要缓存的请求都打到一台服务器上避免其他服务器重复缓存
一致性Hash
一致性hash最初是用来解决分布式缓存中节点查找问题,由于缓存是多节点部署的,这些节点都存储了不同的数据(每个节点可以是主备部署,实时同步),那我们在取数据的时候怎么取,通过hash算法可以定位到一个缓存节点,但是,当一个节点挂掉或者新增一个几点,节点的位置序号发生变动时,普通hash算法的定位就不准确了,于是一致性hash算法应运而生。
构造一个长度为2^ 32 的整数环 (这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 2^ 32 -1])将服务器节点放置在这个Hash环上,然后根据数据的Key值计算得到其Hash值(其分布也为[0, 2^32 -1]),接着在Hash环上顺时针查找距离这个Key值的Hash值最近的服务器节点,完成Key到服务器的映射查找。
这种算法解决了普通余数Hash算法伸缩性差的问题,可以保证在上线、下线服务器的情况下尽量有多的请求命中原来路由到的服务器。
Everything have two sides,一致性Hash算法比普通Hash算法更具有伸缩性,但是同时其算法实现也更为复杂
特点
数据容错性和可扩展性:当我们删除或新增其中一个节点,影响的只是这个节点之前的数据,其他节点并未受影响
数据倾斜问题解决:几个缓存节点在圆上的分布可能并不是对称的,但我们可以增加虚拟的对称节点来解决
其他: 最小连接 最小时延等
最小连接和最小时延都是要统计服务器一段时间的客户端连接数和请求响应平均耗时,来确定下一次请求到来时选择当前最小连接数的服务器或者响应最快的服务器连接数和响应时长需要动态调整,比较复杂。
Nginx支持
nginx可以支持轮询(默认),加权轮询,IP_Hash算法
像最小连接 最小时延这种智能的fair方式以及URL_Hash方式都需要第三方插件支持。
还没有评论,来说两句吧...