Nginx IP Hash+memcached-session-manager session共享

来源:互联网 发布:移动公司 网络监控 编辑:程序博客网 时间:2024/04/29 16:43

【背景说明】

        web系统访问数量增加时,web服务器集群用来分担负载是必要的,否则只有一台服务器访问量大了必然会挂。之前首先想到的是tomcat自带的cluster方式,配置简单,可以实现自动实时的session共享,这个方案是通过消息广播实现,官方文档也不建议集群中多于4个机器。剩下能想到的就是两种方案:

(1)nginx ip hash策略:访问请求根据ip被路由到特定机器,既然同一个客户端的请求都被转到同一个web服务器上,那就没有session问题了;

(2)memcached-session-manager (msm):https://code.google.com/p/memcached-session-manager/wiki/SetupAndConfiguration  这里是官方的说明,其实现原理大致就是web服务器session变化时将sessioin序列化并且保存到memcached中,等到某一个请求发到别的web服务器上时,发现session为空,则到memcached中获取并保存到web服务器中,保证session共享。此框架的优势:

   1、支持Tomcat6和Tomcat7
   2、操作粘性或不黏性Session
   3、没有单点故障
   4、Tomcat的故障转移
   5、Memcached的故障转移
   6、可插拔的Session序列化
   7、支持异步保存Session
   8、Sessions发送到Memcached如果他确实修改了
   9、JMX管理和监控


【解决方案】

        nginx ip hash 负载均衡的前提是不会有大量用户在同一个局域网中访问,我们的应用应该不会有这个问题,不过仅仅用ip hash还是不够,因为这样web服务器存在单点问题,其中一台挂了,session又没有备份的,那请求就失败了。接下来就考虑ip hash配合msm还是nginx轮询配合msm,轮询的话,那就是每次请求都在不同的web服务器上,那tomcat与memcached之间数据交互明显会多很多,所以还是决定用Nginx IP Hash+memcached-session-manager完成session共享,请求过来仅在特定的tomcat上执行,msm仅在某个tomcat挂了以后才发挥作用,用于session共享。

        (1)nginx配置 (注意ip hash就行)

user cloud1 cloud1 ;#启动进程worker_processes 5;#全局错误日志及PID文件error_log logs/error.log notice;pid logs/nginx.pid;#工作模式及连接数上限events {#工作模式有:select(标准模式),poll(标准模式),kqueue(高效模式,适用FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 and MacOS X),#epoll(高效模式,本例用的。适用Linux 2.6+,SuSE 8.2,),#/dev/poll(高效模式,适用Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+)use epoll;worker_connections 1024;}#设定http服务器,利用它的反向代理功能提供负载均衡支持http {#设定mime类型include mime.types;default_type application/octet-stream;#设定日志格式log_format main '$remote_addr - $remote_user [$time_local] ''"$request" $status $bytes_sent ''"$http_referer" "$http_user_agent" ''"$gzip_ratio"';log_format download '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" ' '"$http_range" "$sent_http_content_range"';#设定请求缓冲client_header_buffer_size 10k;large_client_header_buffers 4 4k;#开启gzip模块,要求安装gzip 在运行./config时要指定gzip on;gzip_min_length 1100;gzip_buffers 4 8k;gzip_types text/plain;output_buffers 1 32k;postpone_output 1460;#设定访问日志access_log logs/access.log main;client_header_timeout 3m;client_body_timeout 3m;send_timeout 3m;sendfile on;tcp_nopush on;tcp_nodelay on;keepalive_timeout 65;#设定负载均衡的服务器列表upstream backserver {ip_hash;#weigth参数表示权值,权值越高被分配到的几率越大#本例是指在同一台服务器,多台服务器改变ip即可server 10.0.9.199:8080 ;server 10.0.9.1:8080   ;server 10.0.9.2:8080   ;server 10.0.9.3:8080   ;}#Deny access to any host other than (www).4535.comserver {server_name _; #defaultreturn 404;}#设定虚拟主机,默认为监听80端口,改成其他端口会出现问题server {listen 80;server_name 10.8.21.248;charset utf8;#设定本虚拟主机的访问日志access_log logs/test.com.log main;#如果访问 /images/*, /js/*, /css/* 资源,则直接取本地文件,不用转发。但如果文件较多效果不是太好。location ~ ^/(images|js|css)/ {root /usr/local/testweb;expires 30m;}#对 "/" 启用负载均衡location / {proxy_pass http://backserver;proxy_redirect off;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;client_max_body_size 10m;client_body_buffer_size 128k;proxy_connect_timeout 90;proxy_send_timeout 90;proxy_read_timeout 90;proxy_buffer_size 4k;proxy_buffers 4 32k;proxy_busy_buffers_size 64k;proxy_temp_file_write_size 64k;}#设定查看Nginx状态的地址,在运行./config 要指定,默认是不安装的。location /NginxStatus {stub_status on;access_log on;auth_basic "NginxStatus";#是否要通过用户名和密码访问,测试时可以不加上。conf/htpasswd 文件的内容用 apache 提供的 htpasswd 工具来产生即可#auth_basic_user_file conf/htpasswd;}}}
        (2)msm配置,tomcat context.xml 文件
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:10.0.9.199:11212,n2:10.0.9.1:11212"failoverNodes="n1"requestUriIgnorePattern=".*/.(png|gif|jpg|css|js)$" sessionBackupAsync="false" sessionBackupTimeout="100"transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" copyCollectionsForSerialization="false"/>
       10.0.9.199这台机器作为n1,按照上述配置,n2机器上在上述配置中failoverNodes配置n2,其他不变。解释下含义,memcachedNodes指向memcached地址,failoverNodes表示平时数据不会存在这里,只有当另一个memcached挂了无法访问了,session才会保存到failoverNode上。 sessionBackupAsync 可选项,默认true, 指定Session是否应该被异步保存到Memcached中。 如果被设置为true,backupThreadCount设置起作用,如果设置false,通过sessionBackupTimeout,设置的过期时间起作用, copyCollectionsForSerialization  可选项,默认false。transcoderFactoryClass表明了用说明策略序列化,根据后面不用的策略需要用不同jar包,这里用的是Javolution

        之后启动nginx和tomat、memcached,可以尝试打开网页,然后依次关闭tomcat或memcached,只要各自还剩一个,session都不会丢失,关闭的重新启动后,请求又会回去,session也会相应复制回去。


【补充】
      (1)msm中需要用到一些jar包,可以到这里下载:http://pan.baidu.com/s/1kT7RnUJ ; 

      (2)msm中应用到的是粘性session(sticky session),非粘性的暂时没搞定,下次来弄,介绍一下概念:

                sticky session:同一个session的相关请求分发到同一个结点进行处理,这就是所谓的“粘性ssession”(sticky session)方式的负载均衡

                non-sticky session:session均匀散列在各个节点上的是非粘性

      (3)文中配置中总共应用4个tomcat,分布在4台机器上,2个memcached,分布在2台机器,这里tomcat可扩展,至于memcached如果扩展为3个,一个宕了,还不清楚是复制到另外两个还是复制到其中一个,还没试过,不过我想两个memcached足够了,也减少了tomcat到多个memcached中找session的次数。


0 0
原创粉丝点击