2014年10月22日星期三

tomcat + memcached session manager共享session

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
tomcat + memcached session manager共享session  阅读原文»

网上有很多关于通过MSM(memcached session manager)实现memcached共享session的文章,但是很多都是东拼西凑,误导别人。正巧最近有一个地方用到,特此总结一下。

MSM支持tomcat6,tomcat7,tomcat8,MSM支持两种模式:sticky sessions(粘性session)和non-sticky sessions(非粘性session)。我用到的是stickysession,所以以下都按照stickysession

来介绍。集群结构是2个tomcat实例节点,2个memcached实例节点

      <tomcat1><tomcat2>
. \ / .
machine1 . X . machine2
. / \ .
<memcached1><memcached2>

简单说明下:tomcat1为主要把它的session存储到memcached2上,而memcache2是运行在另一台主机上的(一般情况下,memcached是存tomcat1的session),只有当memcached2不可用时,tomcat1才会把session存在memcached1上,也就是说memcached1是为了tomcat1做故障切换用的节点。这要的话,当machine1挂了的时候,session是不会丢失的。

接着我们考虑使用session的哪种序列化方式,默认的是使用java进行序列化,是由memcached-session-manager.jar这个jar包来提供的方法,而其它的序列化方式是由其它的jar包提供的。

首先是要安装jdk和tomcat,这里不再赘述,当然tomcat可以选择支持native函数。在修改tomcat配置文件之前,先把一些jar包放在$CATALINA_HOME/lib/(WEB-INF/lib)目录里,再修改$CATALINA_HOME/conf/(META-INF/context.xml)配置文件。

我们使用的是memcached,所以需要spymemcached-2.11.1.jar

补充:如果使用couchbase,需要添加以下jar包:couchbase-client-1.4.0.jarjettison-1.3.jar,commons-codec-1.5.jar,httpcore-4.3.jar,httpcore-nio-4.3.jar,netty-3.5.5.Final.jar

需要注意的是,如果你使用java内置的序列化方式,把jar放在$CATALINA_HOME/lib/里即可。如果为了更好的性能,使用自定义的序列化方式,就要把其它jar包部署在具体java项目工程下的WEB-INF/lib里。以下是四种session序列化方式对应需要的jar包

  • kryo-serializer:msm-kryo-serializer,kryo-serializers-0.11(0.11 is needed, as 0.20+ is for kryo2),kryo,minlog,reflectasm,asm-3.2

  • javolution-serializer:msm-javolution-serializer,javolution-5.4.3.1

  • xstream-serializer:msm-xstream-serializer,xstream,xmlpull,xpp3_min

  • flexjson-serializer:msm-flexjson-serializer,flexjson

所以非粘性sessions 使用kryo序列化所需要增加的jar包如下:

wKiom1RHEauzhcQnAAC2YW9b-dM187.jpg

虽然我使用的是kryo序列化方式 + 非粘性session,但是还是把粘性session一起介绍一下。

sticky sessions粘性session+ kryo序列化

在machine1上有tomcat1和memcached1,tomcat的$CATALINA_HOME/conf/context.xml增加如下配置

  <Context>    ...    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"      memcachedNodes="n1:host1.example.com:11211,n2:host2.example.com:11211"      failoverNodes="n1"      requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"      transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"      />  </Context>  

参数failoverNodes="n1"是用来告诉 MSM 把session优先存储在memcached2上,只有当memcached2挂了的时候才会把session存在memcache1也就是配置文件的n1里。

假如整个machine1挂了,session还是可用,因为session是存在machine2的memcache2上,可以通过tomcat2对外提供服务。

machine2上的tomcat2的配置文件只要改成failoverNodes="n2"即可。

non-sticky sessions 非粘性session + kryo序列化

非粘性session是不需要配置failoverNodes,也就是故障切换节点的,因此session是由所有tomcat节点通过轮训(round-robin)来提供服务的,session是不和某单个tomcat节点绑定,所以tomcat所有节点的都是一样的,如下:

  <Context>    ...    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"      memcachedNodes="n1:host1.example.com:11211,n2:host2.example.com:11211"      sticky="false"      sessionBackupAsync="false"      lockingMode="uriPattern:/path1|/path2"      requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"      transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"      />  </Context>  

配置完成后重新启动两个节点上的不同tomcat服务。

  tail -f /usr/local/tomcat/logs/catalina.out  

wKiom1RGYIKACNTdAAo-3_MzksQ616.jpg

两个节点tomcat的启动日志都正常。

测试的session.jsp页面内容如下

  SessionID:<%=session.getId()%> <BR>  SessionIP:<%=request.getServerName()%> <BR>  Se
Puppet扩展篇8-Puppet dashboard的部署及测试  阅读原文»

Puppet扩展篇8-Puppet dashboard的部署及测试

零基础学习Puppet自动化配置管理系列文档

Puppet Dasshboard是由支持Puppet开发的公司Puppetlabs创建的,是Ruby on Rails程序。可以作为一个ENC(外部节点分类器)以及一个报告工具,并且正在逐渐成为一个包含许多Puppet新功能的集成界面,例如审计和资源管 理功能。 Puppet Dashboard是一个Ruby on Rails程序,用于显示Puppet master和agent的相关信息。它允许你查看从一个或多个Puppet master汇总的图形和报告数据。它同时从一个或者多个Puppet master上收集来自于Puppet agent的资产数据(主机的Fact和其他信息)。最后,它能作为一个ENC来配置Puppet节点,并指定这些节点上的类和参数。

Puppet Dashboard(1.2.3)程序目前版本只能安装在Ruby 1.8.x(Dashboard还不能工作在1.9.x下或者更新的版本下),只支持MySQL作为数据库后端。

  Rake version 0.8.3 or newer  MySQL database server version 5.x  Ruby-MySQL bindings version 2.7.x or 2.8.x  

备注:更多详细信息请参考:http://docs.puppetlabs.com/dashboard/

2 安装相关软件包

  [root@puppetserver nodes]# yum install  ruby-mysql mysql-server puppet-dashboard  

3 配置Dashboard(包括与数据库的结合部分)

3.1 创建管理Dashboard的MySQL数据库账号并授权

  [root@puppetserver rpms]# /etc/rc.d/init.d/mysqld restart  [root@puppetserver ~]# chkconfig mysqld on  [root@puppetserver rpms]# mysqladmin -uroot password 123.com  [root@puppetserver rpms]# mysql p123.com  mysql> create database dashboard character set utf8;  mysql> grant all on dashboard.* to 'dashboard'@'localhost' identified by "123.com";  mysql> flush privileges;  [root@puppetserver rpms]# mysql -udashboard -p123.com #测试账号是否创建成功  …  Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.  mysql>  

3.2 优化数据库配置文件my.cnf

  [root@puppetserver rpms]# vim /etc/my.cnf  [mysqld]  # Allowing 32MB allows an occasional 17MB row with plenty of spare room  max_allowed_packet = 32M  …  [root@puppetserver rpms]# /etc/rc.d/init.d/mysqld restart #重启MySQL生效  Stopping mysqld:                                           [  OK  ]  Starting mysqld:                                           [  OK  ]  

3.3 编辑dashboard YAML配置文件(database.yml)来指定数据库

  [root@puppetserver rpms]# vim /usr/share/puppet-dashboard/config/database.yml  production:    database: dashboard    username: dashboard    password: 123.com    encoding: utf8    adapter: mysql  …  

3.4 填充数据库

  [root@puppetserver ~]# cd /usr/share/puppet-dashboard/  [root@puppetserver puppet-dashboard]# rake gems:refresh_specs  [root@puppetserver puppet-dashboard]# rake RAILS_ENV=production db:migrate #环境变量RAILS_ENV=production告诉Ruby on Rails我们工作在生产环境。每次你运行一个rake命令都需要使用合适的环境值来设置RAILS_ENV环境变量  

3.5 查看是否导入成功

  [root@puppetserver puppet-dashboard]# mysql -udashboard -p123.com  Welcome to the MySQL monitor.  Commands end with ; or \g.  Your MySQL connection id is 5  Server version: 5.1.66 Source distribution  Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.  Oracle is a registered trademark of Oracle Corporation and/or its  affiliates. Other names may be trademarks of their respective  owners.  Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.  mysql> use dashboard;  Reading table information for completion of table and column names  You can turn off this feature to get a quicker startup with -A  Database changed  mysql> show tables;  +------------------------------+  | Tables_in_dashboard          |  +------------------------------+  | delayed_job_failures         |  | delayed_jobs                 |  | metrics                      |  | node_class_memberships       |  | node_classes                 |  | node_group_class_memberships |  | node_group_edges             |  | node_group_memberships       |  | node_groups                  |  | nodes                        |  | old_reports                  |  | parameters                   |  | report_logs                  |  | reports                      |  | resource_events              |  | resource_statuses            |  | schema_migrations            |  | timeline_events              |  +------------------------------+  18 rows in set (0.00 sec)  

4 启动并运行Dashboard(WEBrick方式)

WEBrick有助于快速使用Dashboard,不过它不能很好地进行扩展,并且当有许多Puppet agent向Dashboard进行报告时,它的性能会非常差,因此不推荐使用。

阅读更多内容

没有评论:

发表评论