某web应用负载均衡在两台机器上部署,其中一个节点tomcat无法启动原因分析

即刻关注,获取更多

  • 该问题产生的原因:
    • 直接原因:spring加载的时候获取配置文件的顺序在不同磁盘上结果不一致,导致“类加载出现异常",所以在有些磁盘环境下可以有些不可以,下面分析会说明原因。
    • 间接原因:spring配置文件配置重复
  • 解决办法:如下图 红色框内的配置是要注释掉的,否则在特别的情况下容易引起初始化出现异常。

  • 排查步骤(web是挂在磁盘,temp是本机磁盘)
  1. 分别启动web,temp 完全一样的Tomcat和工程,对比各自catalina.out内容,发现web出现缺少一个SQL的执行输出,继续观察不同之处,发现load spring顺序不一样(附件catalina.out-temp 是temp的Tomcat启动输出内容,附件catalina.out-web是web的Tomcat启动输出内容)
  2. 根据web.xml 配置和跟踪代码,找出来 spring是获取到所有配置后一个一个来实例化的

  1. 下面是写的打印出系统找到的spring配置文件,在test.jsp 页面打印出来(附件test.jsp-temp.txt是temp工程打印结果,附件test.jsp-web.txt 是web工程打印结果)

  1. 发现结果不一样,注释掉 springMvc-servlet.xml 中,发现工程可以正常运行(顺序还是不一样)。

---------------下面是翻查源码步骤(为什么加载顺序不一样)-----------------------------

  1. 下面是主调试入口函数:

  1. 调试跟踪堆栈(spring加载的时候堆栈)

  1. 上图可以看出,最终是由File.list() 列举出文件列表并获取满足条件的文件,下图解释了这个内部方法,所以引起了这种现象。

ps:linux文件管理跟windows有差距,但是该方法都是调用 native 方法实现。

  1. 总结:代码还是要规整起来。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
在将Spring Boot后端应用部署在多服务器上并进行负载均衡时,保证读写一致性是一个重要的考虑因素。以下是一些常用的方法来实现读写一致性: 1. 数据库复制:可以使用数据库的主从复制或者多主复制来实现数据的复制和同步。这样,写操作可以在主数据库上执行,而读操作可以在主数据库和从数据库上执行。通过设置合适的复制延迟,可以确保写操作完成后再进行读操作,从而保证读写一致性。 2. 分布式缓存:使用分布式缓存如Redis或Memcached可以提高读取性能,并且可以通过设置适当的缓存策略来减少数据库的读取压力。在写操作时,可以使用缓存失效或更新缓存的方式来保证数据一致性。 3. 分布式事务:如果应用中存在跨多个数据库操作的事务,可以使用分布式事务管理器(如Atomikos、Bitronix)来保证多个数据库操作的一致性。这样可以将多个数据库操作作为一个原子事务来处理,要么全部成功,要么全部失败。 4. 数据一致性算法:在某些场景下,需要保证分布式系统中多个节点之间的数据一致性。这时可以使用一致性哈希算法、Paxos算法、Raft算法等分布式一致性算法来保证数据的一致性。 无论采用哪种方法,都需要综合考虑应用的特点、性能需求和系统复杂度,选择最适合的方案来确保读写一致性。同时,对于一些关键的操作,可以引入重试机制、日志记录和监控来保证数据的完整性和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jack_software

感谢打赏,我努力提供优质内容~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值