同步过程中因为出现内存不足,出现miss data异常,触发了otter进行rollback操作.
在同步日志中出现: [pipelineId = 1,taskName = ProcessSelect] WARN com.alibaba.otter.node.etl.select.SelectTask - rollback happend , should skip this data and get new message.
然后几个程序就处于一个业务死锁状态.
ProcessSelect一直在等待rollback动作完成
"pipelineId = 1,taskName = ProcessSelect" prio=10 tid=0x00007f9cac08c000 nid=0x4240 waiting on condition [0x00007f9cdc7ba000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x00000000a1a95ba0> (a com.alibaba.otter.shared.common.utils.lock.BooleanMutex$Sync) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156) at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:811) at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:969) at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1281) at com.alibaba.otter.shared.common.utils.lock.BooleanMutex$Sync.innerGet(BooleanMutex.java:139) at com.alibaba.otter.shared.common.utils.lock.BooleanMutex.get(BooleanMutex.java:69) at com.alibaba.otter.node.etl.select.SelectTask.processSelect(SelectTask.java:265) at com.alibaba.otter.node.etl.select.SelectTask.access$300(SelectTask.java:94)
而ProcessTermin一直在等待termin信号,完成rollback的处理. 所以一个怀疑,就是termin信号丢了.
原提问者GitHub用户 agapple
根据您提供的信息,可能是因为同步过程中内存不足,导致出现 miss data 异常,随后 Otter 触发了 rollback 操作。在 rollback 过程中,可能因为某些原因导致部分线程处于等待状态,从而形成业务死锁。
对于这种情况,建议您检查 Otter 和数据库的配置,确保其满足系统需求。其中,内存大小,线程池大小等因素都可能会影响同步效率和可靠性。同时,确保系统和数据库的稳定性和可靠性也非常重要。
此外,为了避免类似问题,可以考虑使用控制台界面监控同步状态,及时发现并解决同步异常。另外,在上线新的同步任务前,可以先进行测试验证,确保同步任务的可靠性和稳定性。
主要代码问题,在处理rollback时,处理完后的termin信号未按照processId顺序进行添加,导致ProcessTermin发现顺序不对,直接丢弃取一下. (Memory的termin未实现peek/ack的模式,导致memory模式下一旦取出来不正确顺序的termin就会丢了),从而导致了业务死锁.
原回答者GitHub用户agapple
应该是同步过程中出现了异常,导致otter进行了rollback操作,但是在rollback过程中出现了阻塞导致程序无法继续执行。
针对这种情况,可以考虑以下几种解决方案:
增加内存容量:可以考虑增加内存容量,从而避免内存不足导致的异常。
调整同步模式:可以考虑调整同步模式,采用异步同步模式,从而避免同步过程中出现阻塞导致的问题。
优化同步代码:可以考虑优化同步代码,减少同步过程中出现异常的概率,或者在出现异常时进行快速处理,避免阻塞导致程序无法继续执行。
增加异常处理机制:可以考虑增加异常处理机制,比如在出现异常时及时进行告警或记录日志,从而及时发现和解决问题。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。