通过数据库来实现tomcat集群

前段时间一直在学习tomcat的集群,tomcat5已经配置成功了,无奈到了tomcat6上,总是不成功,出现的问题是一个tomcat无法发现另外一个tomcat,今天又在网上看了下,发现了一个新的方法来实现集群。
集群无非就是实现两个关键点,一个是负载的均衡,一个是session的复制。
负载的均衡通过apache很容易分配,前面也有介绍,就不细说了。
tomcat6的session复制,按照官网上说的tomcat5配置成功了,到了6就总是不成功。
下面说下新方法
1.编辑context.xml文件,添加

<Manager className="org.apache.catalina.session.PersistentManager" checkInterval="1" maxIdleBackup="2">
<Store className="org.apache.catalina.session.JDBCStore" driverName="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/session?user=root&password=123456"
sessionTable="tomcat_sessions" sessionIdCol="session_id" sessionDataCol="session_data"
sessionValidCol="valid_session" sessionMaxInactiveCol="max_inactive"
sessionLastAccessedCol="last_access" sessionAppCol="app_name" checkInterval="1" debug="99" />
</Manager>

2.创建一个数据库来存储session

create table tomcat_sessions (
session_id varchar(100) not null primary key,
valid_session char(1) not null,
max_inactive int not null,
last_access bigint not null,
app_name varchar(255),
session_data mediumblob,
KEY kapp_name(app_name)
);

此两处的参数说明如下:
driverName和connectionURL就不说了
sessionTable是指定数据库的表名
sessionIdCol指定存储sessionID的字段名称
sessionDataCol指定存储session数据的字段名称
sessionValidCol指定存储session是否失效的字段名称
sessionMaxInactiveCol指定存储session失效时间的字段名称
sessionLastAccessedCol指定存储session最后访问时间的字段名称
sessionAppCol指定存储session所在域名的字段名称

然后,将另外一个tomcat的配置文件配置成和以上相同,即可实现tomcat的session共享
最后一点,不要忘记将mysql的数据库连接jar包拷贝到两个tomcat的lib目录下

集群完成,经过测试,关掉一个tomcat,另外一个tomcat仍然可以获取到以前的session,但是,有一点是我担心的,session的创建和销毁会不会对数据库产生太大的压力?

另外
在关闭和重启Tomcat时, tomcat 会试图 serialize存在的session资源. 如果 sessions中相关的对象没有实现 serializable 接口, 就会出现Cannot serialize session attribute XXX for 异常.

如果你不想看到该异常, 也不想保存session. 那么你可以在项目部署描述文件中(如. test.xml,)(instead of just exploding the war) 的 <Context> tags中间 加上 :
<Manager className="org.apache.catalina.session.PersistentManager"
saveOnRestart="false"/>
这样 tomcat 在关闭的时候就不会保存session资源了.

如果你确实担心数据库的压力,那么可以使用将数据库的引擎改为内存表,但是内存表不支持blob,所以你得尽量少写一些session数据,然后使用varbinary

CREATE TABLE `tomcat_sessions` (
`session_id` varchar(100) NOT NULL,
`valid_session` char(1) NOT NULL,
`max_inactive` int(11) NOT NULL,
`last_access` bigint(20) NOT NULL,
`app_name` varchar(255) DEFAULT NULL,
`session_data` varbinary(60000) DEFAULT NULL,
PRIMARY KEY (`session_id`),
KEY `kapp_name` (`app_name`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8;

60000为字节长度,大约为50KB。
如果你的应用向session中写入的数据过多,你得考虑下。

通过以上,你的tomcat已经集群了,但是在应用层面上,依然有一些问题,需要来解决。
主要有以下几个方面
1.集群的服务器文件如何同步?
你可以考虑用NFS来实现
2.集群的应用如果使用了缓存,那么缓存如何同步?
这个目前我没有好的办法,或者你可以将不对一些数据使用缓存
3.如果你的应用使用了quartz,那么定时任务会被执行多次
这个新版本的quartz实现集群了,不过配置有些复杂,或者你可以单独用一个应用来跑quartz
目前我们自己写了一个基于时间戳的定时方案,但尚未经过集群环境的测试,不好放出来给大家使用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值