前言:
本来以为是个很简单的活,就是加两个节点的服务器即可。哪儿想到搞了我和泉哥一上午。。。
当然大多是泉哥的功劳,我还有待提高啊。
在此记录今天踩到的坑:
一是提醒自己下次别再犯二了。一定不能马虎。。虽然我已经很认真了,但还是遗漏了一些点。
二是记录一些奇怪的未解之谜留待以后分析。
任务:在原有系统上加入一个集群的2台openfire服务器(节点3)
需改动的地方:
1.web服务端代码的xmpp连接池加入登录新集群的一个客户端
2.openfire源码配置文件连接redis,这里修改成新的名称。和web服务端代码里面的设置保持一致
准备工作:
1.copy openfire至两个节点,并修改openfire的redis配置文件
2.内存设置
3.服务器简单调优
4.服务器防火墙设置
5.老大修改端口及进一步优化服务器
6.web代码修改
开始部署:
1.关服务,防火墙Deny客户端连接端口
2.修改上次的遗留问题,Hazelcast插件没设置member
3.启动所有openfire,成功。padian登录,成功!
4.登录管理控制台查看状态。
问题1:
新的集群中有一台openfire管理控制台登录错误。
解决:
查看错误日志,发现端口被占用,进而查看端口占用情况,发现遗留的mysql。
进入mysql的配置文件查看,发现确实占用了相同的端口。
干掉mysql,问题解决。
5.感觉服务器正常。替换应用服务器代码的相应少数class(并未重新部署war)
启动应用服务器tomcat(接下来才是蛋碎的开始。。。)
问题2:
tomcat启动失败,错误日志是spring无法注入Bean A
解决:
前面干了些无用功。后来认真看了日志,怀疑是环境问题。即class替换过程中引起的问题,不属于错误。
于是重新替换整个工程的class。此问题解决。
然依旧报错,后来各种排查,定位问题出在我的本机环境为JDK1.8,而服务器是JDK1.7。于是整了重新再来,依旧报错。
继续排查问题,找到了一个我马虎的错误。
ExecutorService pool = Executors.newFixedThreadPool(2);此时3节点应该是3.
又弄了一些,启动成功了,调试程序。发现新节点的消息收不到。
问题3:
此时问题定位到openfire,开始查看openfire源码。
继续定位问题,发现是新节点的openfire没有注册进入redis。
查看error.log日志未报异常。
问题4:
继续各种找啊查啊,最后决定改源码加打印。
解决:
问题定位到了,SingletonHolder这个内部类NoSuchClass
思索了半天,认定这是个和前面Bean A一样的环境问题,不想重新部署了。于是把这个内部类单例模式干掉,使用了静态工厂模式创建单例,替换这个class,问题解决。
上述情况有个需要注意的是:
在替换class的时候一定要注意这个class的内部类也要一起替换!
问题5:
尼玛,还是不行啊。redis里面没写进去啊
解决:
又给openfire一次性加了一大堆打印,一步步调试,发现是openfire读取redis配置文件有问题啊,尼玛。
这台服务器拷贝的其他服务器的好嘛?我TM什么都没干就改了一个字母,还审视了很久没有空格之类的多余啊。
好吧,搞了半上午了,蛋碎了。本来我想试试new一个properties重新试试的。但是泉哥烦躁了,直接就Jedis池那写死了,不用配置文件了。好了,改了重新部署。OK!
继续测试,某个功能OK,某个接口的功能不OK。
问题X:
WARN PageNotFound:194 - Request method 'POST' not supported
解决:
这个问题是说SpringMvc的某个路径POST请求没成功。
泉哥的马虎:之前调试的时候
@RequestMapping(value = "/msg/xxx", method = RequestMethod.POST)
多加了这个/msg,干掉之后异常消失.
蛋碎的一上午。
总结一下吧。
1.千万要仔细仔细再仔细,无论是我还是泉大神都犯了个2.特别是在部署服务这种事情上,一定要再三检查,不然是给自己挖坑啊!!!
2.环境问题,有大神说的好,出问题了重启,重换war!虽然不全对,但是真的咱这行这个是真理啊。
N次了,都是因为只替换class出的问题。再三警戒!
3.有些问题咱是无能为力的~~,比如同样的配置文件为何最后在这个系统读不出来啊 我去?路径打印出来是没错的啊?没办法,只好绕道了,以后再研究吧。