项目同时用了 mysql 和 mongodb,在这方面有经验的同学进来谈谈

2014-03-20 12:16:22 +08:00
 yueyoum
项目初期是用的mysql,但考虑到一些数据查询更新很频繁,所以上了mongodb。
现在项目快做完了,好多数据都存在mongodb中。

现在有两个问题:

1. 事务保证。

mongodb自身不支持事务,并且有些请求处理会同时更新mongodb和mysql,
所以我现在的做法是 把各种条件全部检测过了, 然后去存mysql和mongodb。
只能默认它们都能save成功。

2. 现在mysql的读取也用redis做了cache,但存还是直接打到mysql上的。
当mysql save完毕后,再自动去更新对应的cache.

我现在想对 mysql save也做缓存,就是save到缓存,然后定时将缓存数据刷入mysql.

问题还是 同时用了两个数据库, mongodb 是直接写入成功的, 万一mysql的更新数据还在缓存中,没写入mysql的时候, server 崩溃重启了,那么 数据就不统一了。


如何处理这些问题?

如果还是保持现状,直接写mysql,先不说性能,问题一还是有风险。

或者全部只用一个数据库???
4944 次点击
所在节点    程序员
10 条回复
eric
2014-03-20 13:34:17 +08:00
如果要求保证事务和一致性的话,MongoDB 并不是很合适,或许你可以研究下 HandlerSocket。

不太清楚选择上 MongoDB 只是为了解决 MySQL 的性能问题,还是有其它方面的考虑?
lyhapple
2014-03-20 13:45:31 +08:00
笨办法: Save时,只存到mongodb, 附带一个同步到mysql的标志位, 存完后新开线程去存到mysql, 存成功了,再更新mongodb里的这个标志位;
假如遇到 mongodb 写入成功, mysql还没写完, server就崩了, 就在启动服务的时候,扫描标志位, 未同步到mysql里的立即进行同步,全同步完成了,再提供服务。。

这方法好笨,而且麻烦。:(
dustise
2014-03-20 14:15:01 +08:00
真的需要redis mysql mongodb一起上么?有这个必要么,另外运维的同学们不会觉得痛苦么。
yueyoum
2014-03-20 14:19:32 +08:00
@eric

差不多吧。 用mongodb主要是对于热数据更新比mysql速度更快。就不用那么担心mysql压力。
yueyoum
2014-03-20 14:20:08 +08:00
@lyhapple

我现在的数据是 一部分在mysql中, 一部分在mongodb中, 并不是要说吧mongodb中的存入mysql
yueyoum
2014-03-20 14:21:03 +08:00
@dustise

可以不要redis, redis只是作为mysql的读缓存,同时还利用了一下它的 list 方便做一些小队列
skydiver
2014-03-20 15:02:02 +08:00
@lyhapple 这样还是不是原子操作啊。。要是mysql 写完了改标志位的时候崩了呢。。
cevincheung
2014-03-20 15:06:59 +08:00
你需要的是TokuMX
yueyoum
2014-03-20 15:25:00 +08:00
@cevincheung

thanks, 我研究下。
superisaac
2014-03-20 19:35:31 +08:00
活着 voltdb ?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/105103

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX