设为首页 收藏本站
查看: 296|回复: 0

[经验分享] 通过数据库来实现tomcat集群

[复制链接]

尚未签到

发表于 2017-1-26 08:39:17 | 显示全部楼层 |阅读模式
前段时间一直在学习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&amp;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
目前我们自己写了一个基于时间戳的定时方案,但尚未经过集群环境的测试,不好放出来给大家使用。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-333498-1-1.html 上篇帖子: tomcat配置虚拟主机的方法 下篇帖子: [zz]tomcat 简易性能调优
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表