Nginx负载均衡策略
轮询(默认)
每个web请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
1 | upstream nginxDemo{ |
最少链接
web 请求会被转发到连接数最少的服务器上。
1 | least_conn; |
weight 权重
指定轮询几率,weight和访问比率成正比,weight默认是1。
服务器A和服务器B的访问比例为:2-1,比如有3个请求,前两个会访问A,第三个访问B,其他的规则和轮询一样。
1 | upstream nginxDemo{ |
ip_hash
每个请求按访问ip的hash值分配,这样客户端连续的Web请求都会被分配到同一服务器进行处理,可以解决session的问题。当后台服务器宕机时,会自动跳转到其他服务器。
1 | upstream nginxDemo{ |
基于weight的负载均衡和基于 ip_hash 的负载均衡器可以组合在一起使用。
url_hash(第三方)
url_hash 是nginx的第三方模块,nginx本身不支持,需要引入第三方组件。
nginx 按访问 url 的hash 结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存服务器,文件服务器,静态资源服务器时比较有效。
缺点:当后端服务器宕机时,url_hash 不会自动跳转到其他缓存服务器,而返回给用于一个503错误。
1 | upstream nginxDemo{ |
fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配
1 | upstream nginxDemo{ |
负载均衡后 Session 管理
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复制给一个指定的备份节点。Session 共享
session共享的实现方式有很多种,比人们 memcached,Redis,DB等。其核心思想是修改 tomcat 的session存储机制,使之能够session序列化,然后存放到memcached中。
实现方式: Tomcat+Nginx+MSM+memcached相关jar包放到tomcat/lib目录下:
Java memcached客户端:spymemcached.jar
MSM:- 核心包,memcached-session-manager-{version}.jar
- Tomcat版本对应的jar包:memcached-session-manager-tc{tomcat-version}-{version}.jar
序列化工具包:可选kryo(据说效率比较快),javolution,xstream等,不设置时使用jdk默认序列化。
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"/>