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的次数。
- Nginx IP Hash+memcached-session-manager session共享
- Nginx+Tomcat+memcached-session-manager(MSM)集群session共享
- memcached-session-manager 教程实现session共享
- memcached-session-manager 实现 tomcat session共享
- nginx+tomcat+memcached session共享
- nginx+tomcat+memcached session共享
- nginx+tomcat7+memcache集群,使用memcached-session-manager实现session共享方案
- memcached-session-manager(MSM) + Tomcat集群session共享
- memcached session manager 解决tomcat集群session共享
- Windows7 + Nginx + Memcached + Tomcat 集群 session 共享
- Nginx + Memcached + Tomcat 集群 session 共享
- Nginx+Tomcat+Memcached集群Session共享
- Nginx+Tomcat+Memcached集群Session共享(windows)
- Nginx+Tomcat+Memcached集群Session共享
- Nginx+Tomcat+Memcached集群Session共享 .
- NGINX + TOMCAT7 + MEMCACHED 实现SESSION 共享
- Nginx+Tomcat+Memcached集群Session共享
- Nginx+Tomcat+Memcached集群Session共享
- mave的依赖范围
- VC获取本机IP地址
- Android开发屏幕自适应方法
- uml学习笔记和rose正反工程、power designer的rqm、cdm、pdm、oom模型
- Android 输入法键盘的隐藏和显示
- Nginx IP Hash+memcached-session-manager session共享
- VC获取IP控件中填写的IP数据
- 对C++中动态内存分配的认识
- Linux静态IP设置
- 论 反射机制 二
- 近段时间android错误总结
- VC点击按键弹出文件路径选择对话框
- java多线程之线程状态
- HDU 1047 -- Integer Inquiry(Java)