Nginx负载均衡策略

Nginx负载均衡策略

轮询(默认)

每个web请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

1
2
3
4
upstream nginxDemo{
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}

最少链接

web 请求会被转发到连接数最少的服务器上。

1
2
3
least_conn;
server 127.0.0.1:8081;
server 127.0.0.1:8082;

weight 权重

指定轮询几率,weight和访问比率成正比,weight默认是1。
服务器A和服务器B的访问比例为:2-1,比如有3个请求,前两个会访问A,第三个访问B,其他的规则和轮询一样。

1
2
3
4
upstream nginxDemo{
server 127.0.0.1:8081 weight=2;
server 127.0.0.1:8082;
}

ip_hash

每个请求按访问ip的hash值分配,这样客户端连续的Web请求都会被分配到同一服务器进行处理,可以解决session的问题。当后台服务器宕机时,会自动跳转到其他服务器。

1
2
3
4
5
upstream nginxDemo{
ip_hash;
server 127.0.0.1:8081 weight=2;
server 127.0.0.1:8082 ;
}

基于weight的负载均衡和基于 ip_hash 的负载均衡器可以组合在一起使用。

url_hash(第三方)

url_hash 是nginx的第三方模块,nginx本身不支持,需要引入第三方组件。
nginx 按访问 url 的hash 结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存服务器,文件服务器,静态资源服务器时比较有效。
缺点:当后端服务器宕机时,url_hash 不会自动跳转到其他缓存服务器,而返回给用于一个503错误。

1
2
3
4
5
upstream nginxDemo{
server 127.0.0.1:8081;
server 127.0.0.1:8082;
hash $request_url
}

fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配

1
2
3
4
5
upstream nginxDemo{
server 127.0.0.1:8081;
server 127.0.0.1:8082;
fair;
}

负载均衡后 Session 管理

  1. tomcat
    tomcat 本身已支持该功能。但这种处理方式,不建议在大的集群中使用。
    tomcat 的会话复制为两种:

    1
    2
    3
    <Manager className="org.apache.catalina.ha.session.BackupManager" expireSessionsOnshutdown="false" notifyListenersOnReplication="true" mapSendOptions="6">

    <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnshutdown="false" notifyListenersOnReplication="true" mapSendOptions="6">

    全局复制(DeltaManager):复制会话中的变更信息到集群中的所有其他节点。
    非全局复制(BackupManger):它会吧session复制给一个指定的备份节点。

  2. Session 共享
    session共享的实现方式有很多种,比人们 memcached,Redis,DB等。其核心思想是修改 tomcat 的session存储机制,使之能够session序列化,然后存放到memcached中。
    实现方式: Tomcat+Nginx+MSM+memcached

    1. 相关jar包放到tomcat/lib目录下:
      Java memcached客户端:spymemcached.jar
      MSM:

      1. 核心包,memcached-session-manager-{version}.jar
      2. Tomcat版本对应的jar包:memcached-session-manager-tc{tomcat-version}-{version}.jar
        序列化工具包:可选kryo(据说效率比较快),javolution,xstream等,不设置时使用jdk默认序列化。
    2. Tomcat文件tomcatconfcontext.xml添加:

      • 黏性处理方式:

        1
        2
        3
        <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.2.61:11211,n2:192.168.2.66:11211" requestUriIgnorePattern=".*.(ico|png|gif|jpg|css|js)$"
        transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
        />
      • 非黏性处理方式:

        1
        <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.2.61:11211,n2:192.168.2.66:11211" sticky="false" lockingMode="auto" requestUriIgnorePattern=".*.(ico|png|gif|jpg|css|js)$" sessionBackupAsync= "false" sessionBackupTimeout= "100" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>

参考资料

Nginx+Tomcat 配置负载均衡集群