负载均衡 ip_hash

负载均衡 ip_hash

  • ip_hash 可以保证用户访问可以请求到上游服务中的固定的服务器,前提是用户ip没有发生更改。
  • 使用ip_hash的注意点:
    不能把后台服务器直接移除,只能标记 down .

If one of the servers needs to be temporarily removed, it should be marked with the down parameter in order to preserve the current hashing of client IP addresses

upstream tomcats { 
	ip_hash; 
	server 192.168.11.73:8080; 
	server 192.168.11.74:8080 down; 
	server 192.168.11.75:8080; 
}

参考:
http://nginx.org/en/docs/http/ngx_http_upstream_module.html#ip_hash

hash算法带来的问题

在这里插入图片描述
ip hash的话,它其实是有普通的哈希算法,它会有一个问题,在集群中都会出现。

假定我们现在的用户呢,他的IP是固定的,没有发生更改,这些用户有5678,他们都分别访问到我们特定的服务器了。

现在我们tomcat3也就是下标为2的这台服务器发生了问题,它宕机了,可能就没有了,这个时候我们的节点发生了更改,由3变为了2。

这个时候我们之前的这些所有的求模其实都应该要重新去计算了吧,原来是5模3,这个时候它就会变成5模2。它发生了更改,它取得的一个数值是1,所以这个时候这个5的话,它就会访问到图案tomcat2,它的下标为1了。

如果说是在真实环境中出现了这种问题的话,我们其实是在这里的前端用户,他的请求量是会有很多的。所有的一些请求都要重新的去进行计算他的一个后台服务器的一个集群可能不是三台,他有可能是几十台。发生这种更改的话,他都会去进行一个重新的全模运算。

当然我们现在是减少的一种情况,如果说我们的节点增加,节点增加的话,它其实也会发生这种问题。
不管是我们的服务器节点是增加还是减少,它的这个算法其实都会去进行一次重新的计算的,重新计算所带来的一个结果就是用户在原来的服务系统里面的会话都会丢失,并且我们在服务器里面所设置的一些相应的缓存,也会请求不到。

这样子的话就会造成用户在请求的时候,他的时间就会请求的会更大,比原先更多。

那么如何去解决普通的哈希算法呢?其实还会有一种新的算法,这个叫做一致性哈希算法,我们可以先来看一下。
在这里插入图片描述

首先我们呢有一条水平线或者说是一条直线,在一条直线的开头和结尾,我们分别定义为0和2的32次方减1。
在这里插入图片描述

这个的话其实就相当于是一个地址,或者说你可以把它们当做是一个门牌号。

对于这样的一条直线的话,就是我们可以把它给弯过来吧,弯过来了以后,其实它就组装成了一个环形,它是一个圆形的。这样子它从0到2的32次方减1。

这个时候其实从零到这个位置,其实就形成了一个闭环,随后呢我们就可以来根据我们的一个哈希算法去算了,如何去算呢?

假设我们现在有一些服务器,有第一台服务器,这台服务器经过哈希算法,这个时候它的一个节点1这个其实是我们服务器的一个IP,或者说是我们服务器的一个主机名,所有的哈希都是根据这样的一个规则去算的。

算好了以后,其实我们就可以把这一台服务器放到了我们这个环境里面去,就相当于是一个地址。

假设我们是把这个经过哈希值以后放到了这个位置,这个其实就是在0到2的32方减1,这里面的某一个特定的位置,它是固定在这个环上的。

这个计算机节点经过哈希制以后,它也是会固定在这个环上的某一个位置,随后同理,我们所有的节点,它会按照这个环的顺时针动向一个一个去放。现在其实我们总共是放了四个计算机节点,总共是有4台服务器,它都会有一个特定的位置的。

有了特定的位置以后,其实一定要注意,他们都是经过了哈希算法的,每一个哈希的算法要么是根据服务器的一个IP,要么是根据服务器的一个主机名,两者都可以,并且他们都是一个顺时针的方向。

随后这个时候会有一些用户,用户的话也是可以根据他的ID去算的,这个时候得到他的一个哈希值了以后,这个用户的话他也会存在于我们这一个环上的某一个地址。

假定这两个用户是存在在这个部位,由于我们的有一个规则,就是说每一个用户离着我们的某一个节点近的话,这个用户就去访问某一个节点,并且它是按照顺时针的方向。

现在我们这两个用户是在这个位置的,在这个位置的话,由于是顺时针,所以他们都会访问到节点1。现在我们又有两个用户进来,这两个用户的请求,他们经过哈希算法以后,是在这个位置,在这个位置了以后,按照我们的一个顺时针的方向。

这两个其实就应该访问到我们的节点2了吧。同理在后方我们出现的一个用户的话,这两个用户由于是顺时针就应该要访问到我们的节点3了之后,在这个位置又出现了一个用户的请求。

这个就是一次性哈希的算法。

它可以保证我们的用户可以访问到我们特定的一个服务器节点,并且他们相当于是一种就近原则。

然后我们再来看一下服务器减少的情况,服务器减少的话就相当于是服务器宕机,挂掉了,我们要去移除。

在这里插入图片描述

移除了以后你会发现这边多了两个用户,这两个用户现在他本来是访问节点3的,这个时候怎么办呢?

我们可以把这两个用户直接把他们的请求是放到了节点4,也就是这两个用户原来的会话,或者说原来请求的些缓存全部都丢失了,他们会访问到我们的节点4。

但是我们在此之前,其余的用户除了这两个用户以外的其他所有的用户,他们的一个访问没有变化,还是照旧,他们的会话,他们的缓存等等信息,其实全部都会保留在他原来的一些服务器节点里面是不会被丢失的。

这个其实就是一致性哈希算法。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
最近学习Nginx+tomcat实现 负载均衡。 首先大家注意: 本文章中没有session共享,关于session共享我会在下一篇中讲解,先实现Nginx+tomcat负载均衡再实现session共享。 从网上查了好多资料,多走了很多弯路,现在把自己成功的方法拿出来与大家分享。 Window7 我是在Win7上做的。不是什么Linux,网上好多资料,特别麻烦。 Nginx Nginx 比较好找到,直接去网上下载 网址: http://nginx.org/en/download.html 版本不作要求了,(比如1.2.9版本),都有。 JDK JAVA的各种环境都要有。 版本不要求 Tomcat 这里我给大家提供tomcat6 Tomcat各种版本的下载地址我也提供给大家:http://tomcat.apache.org/download-60.cgi 大家可以先用我tomcat6 学会了,在下载自己需要的版本。 词条科普 另外我把实现过程中遇到的知识点都总结好了,一起提供给大家学习。 步骤: 注:本例程以一台win7机器为例子,即同一台机器上装一个nginx和2个Tomcat。 且安装了JDK。 便于管理将用到的资料放在一个文件夹下 我在D盘 创建 server 文件夹 . 1. Nginx 下载直接解压缩到server,点nginx.exe 执行 安装后如果可用,可在任务管理其中找到如图类似,并且在浏览器中输入 http://localhost/ 浏览器显示如下两个图 说明成功 2.Tomcat 同样将自己下载的或者我提供的tomcat 放到D盘的server下不过要复制成两份或者多份。 命名如:(便于区别 我们只用两个来讲解 ,多个tomcat和两个原理是一样的) 1、server.xml配置 我们需要在一台机器上跑 2 个不同的 tomcat ,避免出现端口被占用的情况,为了规范统一,我们修改全部tomca端口。分别找到tomcat6的1和2 的conf下的 server.xml。 修改Server端口 找到Server将: 改为 XXXX 在这里表示不同的端口:我的两个 tomcat 分别使用 8005和8006; 2.1.2、修改Connector端口 找到Connector将: 改为 XXXX 在这里表示不同的端口:我的两个 tomcat 分别使用 8081和8082; 2.1.3、修改Engine端口 找到Engine将: 改为 tomcatX 在这里表示不同的tomcat,我的两个 tomcat 分别使用 tomcat1和tomcat2;来区分。 这个设置是主要用以tomcat的集群。 如果看不懂可以去看我提供的tomcat我已经改好了。 启动tomcat服务 分别到两个tomcat下,直接双击D:\server\apache-tomcat-6.0.39_1\bin\startup.bat启动tomcat1 D:\server\apache-tomcat-6.0.39_2\bin\startup.bat启动tomcat2 出现以下页面表示启动成功 在浏览器中输入 http://localhost:8081 http://localhost:8082 出现 标示成功 3、Nginx+Tomcat负载均衡配置 首先创建两个文件,这两个文件 我来提供,将这两个文件拷入Nginx的conf文件夹下 1.proxy.conf 文件内容 #负责代理转发 proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_
`ip_hash`是Nginx的一种负载均衡算法,它基于客户端的IP地址来确定将请求转发给哪个后端服务器。使用`ip_hash`算法,相同IP地址的客户端将始终被分配到同一个后端服务器,这有助于保持会话的一致性。 要配置Nginx使用`ip_hash`算法进行负载均衡,可以按照以下步骤进行: 1. 打开Nginx的配置文件。通常在Linux系统中,配置文件位于`/etc/nginx/nginx.conf`或`/etc/nginx/conf.d/default.conf`。 2. 在`http`块内添加一个`upstream`块,定义要进行负载均衡的服务器列表。示例代码如下: ```nginx http { upstream backend { ip_hash; server backend1.example.com; server backend2.example.com; server backend3.example.com; } ... } ``` 在上面的示例中,我们使用`ip_hash`指令在`upstream`块中启用了IP哈希负载均衡算法,并列出了要进行负载均衡的服务器。 3. 在Nginx的配置文件中,找到你要使用负载均衡的位置(如`location`块),并将其代理到上面定义的`backend`服务器组。示例代码如下: ```nginx http { upstream backend { ip_hash; server backend1.example.com; server backend2.example.com; server backend3.example.com; } server { ... location / { proxy_pass http://backend; } ... } } ``` 在上面的示例中,我们使用`proxy_pass`将请求代理到名为`backend`的服务器组。 4. 保存配置文件并重新加载Nginx配置。在终端中执行以下命令: ```shell sudo nginx -t # 检查配置文件语法是否正确 sudo systemctl reload nginx # 重新加载Nginx配置 ``` 这样配置后,Nginx将使用`ip_hash`算法将请求分发给后端服务器。相同IP地址的客户端将被分配到同一个后端服务器上,从而保持会话的一致性。 请注意,`ip_hash`算法适用于基于客户端IP地址的负载均衡,并且要求Nginx编译时启用了`--with-http_upstream_ip_hash_module`模块。确保你的Nginx版本支持此功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Escape2022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值