论坛首页 Java企业应用论坛

基于nginx的tomcat负载均衡和集群(超简单)

浏览 181756 次
精华帖 (15) :: 良好帖 (13) :: 新手帖 (8) :: 隐藏帖 (1)
作者 正文
   发表时间:2010-05-28  
怎么不用lvs
0 请登录后投票
   发表时间:2010-05-28  
lnaigg 写道
jiopi 写道
前提:以下论述不包含 服务器 宕机 的有效处理

其实同步session只是为了保证一个用户在访问时,无论访问到哪台服务器,session都要一致,那为什么要让一个用户去访问1台以上的服务器呢?

ngnix做基于访问IP地址的分发策略 跟 session的策略不太一致,session 的 key一般是保存在cookie中,而 一个用户却可能改变IP,但cookie不变,session就应当保持

所以我做了nginx的基于cookie中某个值的分发策略,在基于IP的策略中,nginx可以保证IP相同的必定访问同一台机器,基于cookie中某个值的分发策略则可以保证只要cookie不丢,就可以访问同一台机器,避免因为同一用户可能在集群环境中访问多台服务器而必须考虑session共享的复杂问题


同意,基于IP分发的策略已经能解决绝大部分需求。


基于IP分发的策略 在用户IP变更后(比如断线重连),就存在访问 跟 前一台服务器 不同的 服务器的风险,这样session还是丢了的,nginx 可以配置成 基于 session-key 的 分发策略,保证只要 session-key不变,这个用户就访问同一台服务器,因此,只要 应用服务器不 宕机,就没问题

不过这个不是基于nginx提供的标准负载均衡做的,而是一种变通的做法
0 请登录后投票
   发表时间:2010-05-28  
jiopi 写道
lnaigg 写道
jiopi 写道
前提:以下论述不包含 服务器 宕机 的有效处理

其实同步session只是为了保证一个用户在访问时,无论访问到哪台服务器,session都要一致,那为什么要让一个用户去访问1台以上的服务器呢?

ngnix做基于访问IP地址的分发策略 跟 session的策略不太一致,session 的 key一般是保存在cookie中,而 一个用户却可能改变IP,但cookie不变,session就应当保持

所以我做了nginx的基于cookie中某个值的分发策略,在基于IP的策略中,nginx可以保证IP相同的必定访问同一台机器,基于cookie中某个值的分发策略则可以保证只要cookie不丢,就可以访问同一台机器,避免因为同一用户可能在集群环境中访问多台服务器而必须考虑session共享的复杂问题


同意,基于IP分发的策略已经能解决绝大部分需求。


基于IP分发的策略 在用户IP变更后(比如断线重连),就存在访问 跟 前一台服务器 不同的 服务器的风险,这样session还是丢了的,nginx 可以配置成 基于 session-key 的 分发策略,保证只要 session-key不变,这个用户就访问同一台服务器,因此,只要 应用服务器不 宕机,就没问题

不过这个不是基于nginx提供的标准负载均衡做的,而是一种变通的做法

基于session-key怎么做,请赐教!!
0 请登录后投票
   发表时间:2010-05-28  
  很感兴趣,来学习的
0 请登录后投票
   发表时间:2010-05-29  
ngnix是不是只有在Linux上用,有没有windows下的版本
0 请登录后投票
   发表时间:2010-05-29  
有的,http://nginx.org/en/download.html
0 请登录后投票
   发表时间:2010-06-02  
楼主有没有遇到这种情况:
使用 memcached-session-manager 后,tomcat之间的session值只会在第一次同步,当一个tomcat的session值变掉的话,不会同步到另一台

简单的两个测试页面:
set.jsp
引用

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>set page</title>
</head>
<body>

<br/>

<%
session.setAttribute("id", request.getParameter("id"));
%>

<%
System.out.println("set id to " + request.getParameter("id"));
%>

set id to <%=request.getParameter("id")%>

</body>
</html>


get.jsp
引用

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>get page</title>
</head>
<body>
get id is
<%=session.getAttribute("id")%>
<%
System.out.println(session.getAttribute("id"));
%>
</body>
</html>


先对一个tomcat打开set.jsp页面,跟上参数id=1 ,即 http://.../set.jsp?id=1
然后分别打开两个tomcat的get.jsp页面,即 http://.../get.jsp
可以看到session中的值是一样的

接着再对一个tomcat打开set.jsp页面,跟上参数id=2 ,即 http://.../set.jsp?id=2
然后分别打开两个tomcat的get.jsp页面,即 http://.../get.jsp
可以发现一个输出的是1,一个输出的是2

请问这种情况如何解决?
0 请登录后投票
   发表时间:2010-06-02  
181054867 写道
nginx在配置upstream时,有两个参数:
ip_hash(同一IP一直使用同一台server服务)
weight(server的使用权重,数值越大,nginx分发的请求越多)

通过配合这两个参数,能粗糙地解决session共享的问题。
对于一些不是太依赖session的应用,或者只有用户登录时保存,那么我认为可以用Cookies代替。
即使真的要Session共享,我认为手动写代码保存到Memcached比为Tomcat加插件好,这样能获得更好的可控性。
而且我不用Tomcat,用Resin,这个msm就用不上啦,不过我会按照我的思想实现session共享,呵呵,个人愚见!!

如果有多台nginx,可以确保每台都将同一个IP分配到同一个tomcat吗?
0 请登录后投票
   发表时间:2010-06-12  
changcheng_1982 写道
ngnix是不是只有在Linux上用,有没有windows下的版本
Linux上,效率更高。
0 请登录后投票
   发表时间:2010-08-06  
首先nginx用的是linux2.6内核的epoll,如果windows,那就不能用到epoll了,那么最大的性能优势就没有了,
楼主的这种配置方式是有效的,能在实际生产环境使用的。
并且可以做到web这部分的横向扩展能力
如果在数据库这部分在加上横向扩展能力,就更完善了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics