mongo集群应用切换过程

1 篇文章 0 订阅
1 篇文章 0 订阅

     首先说一下大背景,以前系统是单节点的mongo作为数据库,然后直接操作数据库进行增、删、改、查。

     安装好集群后直接用现有包对接,看到的效果是增加和删除都没有问题,但是更新的时候无法更新数据内容。从日志上看不出来有错误,更新都是正常更新的,没有报任何错误。

    问题分析:

    单节点没有问题,集群有问题,而且集群里面没有报错,考虑是不是我们集群的连接方式不对,或者是mgo.v2不支持对应版本的,各种打印日志,发现入库前的操作和入库后的日志都打印了,都没有报错,更新成功了。

   怀疑点,是不是我们mgo.v2的版本不支持mongo集群,但是插入没有问题,是否是更新的方式不能用$set的增量更新,于是增加一些操作,比如更新,覆盖更新,插入等操作,然后打印各种日志,发现操作正常,没有复现,这下诡异了,怀疑人生。mgo.v2又没有继续维护,问都不知道问谁,实际上我怀疑过更新成功,那么我就在更新后调用一次查询,看看更新的结果。结果是查询出来的结果是没有更新的结果。这下凉了,真的是没有更新成功(恭喜这里已经成功进入死胡同,这里查询到是就的结果不一定就是没有更新成功)一段时间不理,认为是打包的问题,因为不是必现。

   后面又发现了一次,而且在同一个环境上我部署了另外一个测试包,测试包怎么更新都是ok的没有问题,而旧版本包怎么都不能更新成功。对比两个版本代码,数据库部分保持一致,session都是一致的,数据库接入方法也是一样的,唯一不一样的就是业务逻辑,难道是业务逻辑导致的,这时候我开始怀疑是业务代码问题,开始走读代码,看到又两个更新的动作在接口中,假设就是第二次更新导致第一次更新内容无法生效,也就是数据被覆盖了,现在就证明。

     证明方法,首先将两次更新前后的内容都打印一下。发现第一次更新前后数据没有变化(和以前以这样),第二次更新后数据也没有变化,那么在第一次操作后稍作停留,停留一段时间后再进行第二次更新,有效果了,第一次更新后查询没有结果,sleep 5S后查询结果变化了,再更新就不会覆盖了。此时问题很清晰了,就是更新后里面查询发现结果是旧的导致的。回头看发现就是集群的读写模式引发的,单节点没有这种问题,所以才导致看起来就是集群问题。

后面知道原因后解决方案就多了,可以变成strong类型,也可以合并更新请求,但是为了防止其他地方编码也存在这种连续的更新或者立刻读取的问题,最好先将类型变成strong类型,后面整改后再来调整提高系统性能。

 

 

 

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值