网上有很多关于通过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包如下:
虽然我使用的是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
两个节点tomcat的启动日志都正常。
测试的session.jsp页面内容如下
SessionID:<%=session.getId()%> <BR> SessionIP:<%=request.getServerName()%> <BR> SePuppet扩展篇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-dashboard3 配置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进行报告时,它的性能会非常差,因此不推荐使用。
订阅: 博文评论 (Atom)
没有评论:
发表评论