nginx负载均衡怎么保证高可用,使用虚ip+keepalived技术,虚ip是指,两台nginx对外的ip是同一个

nginx是在应用层(第七层做反向代理):比如

根据url地址做对应的转发,比如html转发到静态服务器,.php结尾的url转发到动态服务器

 

if ($request_uri ~* \.html$) {                   #这段放在location里面
proxy_pass http://htmlservers;
}
if ($request_uri ~* \.php$) {
proxy_pass http://phpservers;
}
}


lvs负载昀衡是在第4层做,第4层是根据ip地址和端口做转发

负载均衡方案:随机,轮询,静态权重轮询,动态权重轮询,ip_hash,一致性哈希

怎么解决session的问题,比如同一个用户,第一次请求落到了服务器a,第二次请求有可能会落到服务器b,怎么保证也要落到服务器a :

答:1 .用ip_hash就能保证同一个ip过来的请求会落到同一台服务器上面,

ip_hash属于第四层一致性hash,也有在第七层,比如以用户uid为一致性hash,

2 把session不保存在webserver端,而是保存在cache,或者数据库里面,一般是存在cache里面,因为缓存性能更好

一般大项目都选择第2种方案,因为一般在分布式架构系统中,webserver是无状态的,

 

一般nginx每秒钟可以坑1万的请求,如果业务超过1万,到了5万呢

那么在上游再加一层lvs负载昀衡,一般lvs可以坑5万,如果5万并发还是不满足了

那么就可以加dns轮循,dns轮循可以无限横向扩层多个ip,理论上面来讲可以坑住无限的请求。

请看图:

 

 这是一套终极解决方案,

这里注意一下,如果你的系统不是高可用架构,那么dns轮循是有缺陷,应该哪个ip挂,dns换ip是需要延迟几分钟失效的,如果你的系统架构是高可用的,那么就没有哪人ip不可用的问题

再注意一下,上面这个方面nginx和tomcat都不用做高可用了,因为他的上层,lvs或者nginx会自动踢除坏掉的服务.

问:为什么不是lvs直接连tomcat,而是lvs连nginx,nginx再连tomcat?

答:

第一:lvs是同步转发:一个请求过来,lvs选择一个后台服务器,然后客户端直接与后台服务器连接,后台服务器响应返回数据直接给客户端,nginx是异步转发:客户端请求过来,nginx选择一个后台服务器,发起一个新的请求给后台服务器,后台服务器返回响应数据到nginx,nginx再把数据返回给客户端,所以当后端服务器很多时,nginx有可能会有网络频颈。

第二:lvs选择一个后台服务器,客户端与后台服务器交互,一旦这个后端服务器出现了问题,那么这次请求就失败了,当nginx选择一台后端服务器时,当这个后台服务器失败时,会转发到另外一台服务器做处理。

所以一般会采用lvs+nginx的方案.

posted on 2020-10-28 16:12  一天的PHP之路  阅读(259)  评论(0)    收藏  举报