博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2.基于memcached-session-manager的负载均衡
阅读量:4048 次
发布时间:2019-05-25

本文共 10463 字,大约阅读时间需要 34 分钟。

环境CentOS 6.5,Nginx 1.7.2 ,Memcached 1.4.20

一.导出lib

1.利用maven,构建并导出基于kryo-serializer的lib,可以将下面的依赖版本和配置如下

1.8.2
2.11.4
0.11
1.04
1.2
1.01
3.2
de.javakaffee.msm
memcached-session-manager
${memcached-session-manager.version}
net.spy
spymemcached
com.couchbase.client
couchbase-client
com.google.code.findbugs
jsr305
com.google.code.findbugs
annotations
de.javakaffee.msm
memcached-session-manager-tc7
${memcached-session-manager.version}
com.google.code.findbugs
jsr305
com.google.code.findbugs
annotations
net.spy
spymemcached
${spymemcached.version}
de.javakaffee.msm
msm-kryo-serializer
${memcached-session-manager.version}
com.google.code.findbugs
jsr305
com.google.code.findbugs
annotations
de.javakaffee
kryo-serializers
${kryo-serializers.version}
com.googlecode
kryo
${kryo.version}
com.googlecode
minlog
${minlog.version}
com.googlecode
reflectasm
${reflectasm.version}
asm
asm
${asm.version}

 

2.执行下面的命令下载lib

mvn dependency:copy-dependencies -DoutputDirectory=./target/lib

 lib就会被自动下载到/target/lib目录下,内容如下图。

 

 

 

二.配置tomcat

配置方式主要见https://code.google.com/p/memcached-session-manager/wiki/SetupAndConfiguration

 

1.拷贝LIB

将上面导出的lib拷贝到 $CATALINA_HOME/lib/ 目录下

 

2.配置$CATALINA_HOME/conf/context.xml

以下两种配置选择其中一种,推荐第二种

第一种: sticky sessions + kryo

 

...

注意:

(1) sticky模式时,配置jvmroute参数,每台tomcat的jvmroute参数都不能一样 (测试这种配置方式不适用于多台Servlet容器,或适用于反向代理服务器可以把相同来源的请求映射到同一台容器上的情况下,不推荐;另网上看到该配置修改transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" 未验证)

$CATALINA_HOME/conf/server.xml

 

(2) 必须启动两个Memcached实例,比如

/usr/local/memcached/bin/memcached -d -m 256 -u root -p 11211 -c 128 -P /tmp/memcached1.pid     /usr/local/memcached/bin/memcached -d -m 256 -u root -p 11212 -c 128 -P /tmp/memcached2.pid

 

 

第二种:non-sticky sessions + kryo

...

 

3.可选配置$CATALINA_HOME/conf/logging.properties

如果需要调试日志,可以在logging.properties中添加如下内容

 

de.javakaffee.web.msm.level=FINE

 

4. 多台Tomcat配置 需要注意下面内容

1) 修改http访问端口(默认为8080端口)

2) 修改Shutdown端口(默认为8005端口) 

3) 修改AJP 访问端口(默认为8009端口) 

4) 修改http访问(默认 Connector port="8080"),添加 URIEncoding="UTF-8"

 

三.配置Nginx

 

 Nginx安装方式在这:http://sgq0085.iteye.com/blog/2089266

 

修改配置文件 /usr/local/nginx/conf/nginx.conf

下面是Nginx 1.7.2完整事例

#user  nobody;user gqshao;worker_processes  1;#error_log  logs/error.log;#error_log  logs/error.log  notice;#error_log  logs/error.log  info;#pid        logs/nginx.pid;events {    // windows系统下不要 use epoll    use epoll;    worker_connections  1024;}http {    include       mime.types;    default_type  application/octet-stream;    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '                      '$status $body_bytes_sent "$http_referer" '                      '"$http_user_agent" "$http_x_forwarded_for"';    access_log  logs/access.log  main;    sendfile        on;    #tcp_nopush     on;    #keepalive_timeout  0;    keepalive_timeout  65;    #gzip  on;    gzip  on;    gzip_types       text/javascript text/plain text/css application/xml application/x-javascript;    gzip_disable "MSIE [1-6].";    # 配置tomcat服务器    upstream web_server {        #ip_hash;        server 192.168.158.131:8080 max_fails=3  fail_timeout=30s;        server 192.168.158.131:8081 max_fails=3  fail_timeout=30s;        server 192.168.158.131:8082 max_fails=3  fail_timeout=30s;    }    server {        # 侦听192.168.158.131的80端口        listen       80;        server_name  192.168.158.131;        #charset koi8-r;        charset utf-8;        access_log  logs/host.access.log  main;        location / {            proxy_pass    http://web_server ;            proxy_redirect off ;            #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP            proxy_set_header Host $host;            proxy_set_header X-Real-IP $remote_addr;            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        }        #error_page  404              /404.html;        # redirect server error pages to the static page /50x.html        #        error_page   500 502 503 504  /50x.html;        location = /50x.html {            root   html;        }    }}

 

 四.启动和停止

启动

# 启动 memcachedsudo /usr/local/memcached/bin/memcached -d -m 256 -u gqshao -p 11211 -c 128 -P /tmp/memcached1.pidsudo /usr/local/memcached/bin/memcached -d -m 256 -u gqshao -p 11212 -c 128 -P /tmp/memcached2.pid# 启动 Tomcat./startup.sh# 启动 Nginxsudo /usr/local/nginx/sbin/nginx
 

停止

# 停止Memcachedsudo kill -9 `cat /tmp/memcached1.pid`sudo kill -9 `cat /tmp/memcached2.pid`# 停止Tomcat./shutdown.sh# 停止Nginxps -ef  | grep nginx  sudo kill -QUIT 主进程号 # 强制停止 Nginx sudo pkill -9 nginx

 

 个别问题

 (1)

# 查看端口占用sudo netstat -tlnp|grep 80

 

 (2)

项目中如果用到JVM缓存,改为放到session中,相当于通过中央缓存维护session

比如shiro中不要再使用EhCache缓存

 

Sticky(黏性)模式:tomcat session 为 主session, memcached 为备 session。Request请求到来时, 从memcached加载备 session 到 tomcat (仅当tomcat jvmroute发生变化时,否则直接取tomcat session);Request请求结束时,将tomcat session更新至memcached,以达到主备同步之目的。 
Non-Sticky模式:tomcat session 为 中转session, memcached1 为主 session,memcached 2 为备session。Request请求到来时,从memcached 2加载备 session 到 tomcat,(当 容器 中还是没有session 则从memcached1加载主 session 到 tomcat, 这种情况是只有一个memcached节点,或者有memcached1 出错时),Request请求结束时,将tomcat session更新至 主memcached1和备memcached2,并且清除tomcat session 。以达到主备同步之目的

 

附一.Manager标签属性说明

 

1.className  必须类名:de.javakaffee.web.msm.MemcachedBackupSessionManager2.memcachedNodes  必须memcached节点:此属性应该包含所有运行的memcached节点或者membase bucket的uri地址,每一个memcached节点的属性定义格式为
:
:
,多个节点定义直接使用空格或者逗号分隔,形如:memcachedNodes="n1:app01:11211,n2:app02:11211",如果只有单个的memcached节点,则
是可选项,只需配置
:
即可,形如:memcachedNodes="localhost:11211"。如果我们配置的是membase,那么从1.6.0版本开始,我们可以配置指定一个或者多个membase bucket uris,形如:http://host1:8091/pools,http://host2:8091/pools。Bucket 名称和密码通过属性username,password来定义。membase buckets连接需要遵循memcached协议,传输数据通过二进制流方式。3.failoverNodes 可选项故障转移节点:可选项,对非黏性session不可用,属性必须包含memcached节点集群的所有ids。节点id之间用空格或者逗号分隔。4.username 可选项从1.6.0版开始使用,并且是可选的。用来进行membase bucket或者SASL验证,密码可以为空。5.password 可选项从1.6.0版开始使用,并且是可选的。用来进行membase bucket或者SASL验证,密码可以为空。6.memcachedProtocol 可选项定义memcached协议,默认使用text文本,出属性指明memcached使用的存储协议。只支持text或者binary。7.sticky 可选项定义session方式为黏性或非黏性,默认为true,多个tomcat时需使用非黏性8.lockingMode 可选项只有非黏性session才使用,默认值为nonenone: 从不对session进行锁定all: session将一直被锁定,知道请求结束auto: 对于只读请求,session将不会被锁定,如果是非只读请求,则session会被锁定uriPattern:
: 通过正则表达式的方式来对请求uri以及查询字符串进行匹配,只有匹配上的才会被锁定。9.requestUriIgnorePattern 可选项此属性是那些不能改备份Session的请求的正则表达式。如果像css,javascript,图片等静态文件被同一个Tomcat和同一个应用上下文来提供,这些请求也会通过memcached-session-manager。但是这些请求在一个http会话中几乎没什么改变,所以他们没必要触发Session备份。所以那些静态文件没必要触发Session备份,你就可以使用此属性定义。此属性必须符合java regex正则规范。 如:".*\.(png|gif|jpg|css|js)$" 10.sessionBackupAsync 可选项指定Session是否应该被异步保存到Memcached中。 如果被设置为true,backupThreadCount设置起作用,如果设置false,通过sessionBackupTimeout设置的过期时间起作用。11.backupThreadCount 可选项用来异步保存Session的线程数,(如果sessionBackupAsync="true")。默认值为cup的内核数。12.sessionBackupTimeout 可选项设置备份一个Session所用的时间,如果操作超过时间那么保存失败。此属性只在sessionBackupAsync="false"是起作用。默认100毫秒13.operationTimeout 可选项从1.6.0版开始使用, 默认值为100014.sessionAttributeFilter 可选项此属性是用来控制Session中的那个属性值保存到Memcached中的正则表达式。郑则表达式被用来匹配Session中属性名称。如sessionAttributeFilter="^(userName|sessionHistory)$" 指定了只有"userName"和"sessionHistory"属性保存到Memcached中。依赖于选择的序列化策略。15.transcoderFactoryClass 可选项此属性值是创建序列化和反序列化保存到Memcached中的Session的编码转换器的工厂类名。这个指定的类必须实现了de.javakaffee.web.msm.TranscoderFactory和提供一个无参的构造方法。例如其他的有效的实现在其他packages/jars中提供如:msm-kryo-serializer,msm-xstrea-serializer和msm-javolution-serializer.默认为 de.javakaffee.web.msm.JavaSerializationTranscoderFactory16.copyCollectionsForSerialization 可选项默认值为false。17.customConverter 可选项自己定义特殊的类注册到kryo自定义转换器中,实现序列化18.enableStatistics 可选项用来指定是否进行统计。 默认值为true。19.enabled 可选项指定Session保存到Memcached中是否可用和是否可以通过JMX进行改变。只用于粘性Session。 默认值为true。
 

 附二.会话管理相关测试结果

按非黏性的配置,经过多次测试,得到如下结论()

1.web.xml中配置的session-config.session-timeout是起作用的;

2.HttpSession监听,HttpSessionListener的测试中,sessionCreated方法每次请求都会被触发,但sessionDestroyed不会被自动触发,如果在缓存销毁后一段时间(不到一分钟左右)内发生访问才会被触发。手动调用request.getSession().invalidate();,也会被触发。

 

转载地址:http://hmyci.baihongyu.com/

你可能感兴趣的文章
android中对于非属性动画的整理
查看>>
一个简单的TabLayout的使用
查看>>
ReactNative使用Redux例子
查看>>
Promise的基本使用
查看>>
coursesa课程 Python 3 programming 统计文件有多少单词
查看>>
coursesa课程 Python 3 programming 输出每一行句子的第三个单词
查看>>
Returning a value from a function
查看>>
coursesa课程 Python 3 programming Functions can call other functions 函数调用另一个函数
查看>>
coursesa课程 Python 3 programming The while Statement
查看>>
course_2_assessment_6
查看>>
coursesa课程 Python 3 programming course_2_assessment_7 多参数函数练习题
查看>>
coursesa课程 Python 3 programming course_2_assessment_8 sorted练习题
查看>>
在unity中建立最小的shader(Minimal Shader)
查看>>
1.3 Debugging of Shaders (调试着色器)
查看>>
关于phpcms中模块_tag.class.php中的pc_tag()方法的含义
查看>>
vsftp 配置具有匿名登录也有系统用户登录,系统用户有管理权限,匿名只有下载权限。
查看>>
linux安装usb wifi接收器
查看>>
多线程使用随机函数需要注意的一点
查看>>
getpeername,getsockname
查看>>
让我做你的下一行Code
查看>>