使用MongoDB血泪般的经验教训
故事背景,天书世界,现在项目已经属于成熟维护期,是时候总结一下当时的想法
第一个问题,为什么使用mongodb?
- 数据库对于游戏项目本身的要求与传统业务系统差异较大,所以nosql的弱结构性对于我那是相当的有吸引力,
- c++代码里面夹杂着sql这种方式实在是有点丑
- 由于要实现“秒合”,那么就意味所有的数据必须放到一起,遍寻当时的所有的数据库,支持热分片也就mongodb,仅此一家,别无分店
- mongodb号称与传统的sql最为接近,你可以像使用sql一样的去用他
第二个要回答的问题,mongodb有什么让人纠结点?
- mongdb的库级锁,真是让人心伤,就是因为你需要用到大量的数据都需要分片,结果你告诉我我这是库级锁 !你是想让我一张表一个库吧?
- 连接数过多,就是不想自己做中件间,或者说是数据库访问层,才想到你的分片,你居然告诉我连接数过多,差不多到10000多连接就卡得跟鬼一样!
- mongdb客户端的不成熟,编译个c++版本,还得引入个巨大无比的boost,c版本各种混乱,现在可倒好,升级到3.x,直接连这些驱动都不能用了。
- 没有lua官方驱动,只好网上找开源实现,但毕竟不是官方,我猜连接有泄漏
- 号称跟传统mysql之类最为接近,结果索引的效果跟mysql差异非常大,特别是联合索引,表的设计模式也是相当的不同,否则的话够你受的
- 做了分片之后mongodb性能分析就非常难用了,没有办法用很简单的方式找到慢查询
- 有时候我们还是需要有一个自增id的,由于mongodb的实现方式也好,或者说分片机制也罢,总之,如果需要实现一个自增id对于mongodb是个难题
- 内存过大,硬盘空间过大
第三个问题,都这样了,有什么要说的吗?
- 出来混的,总是要还的!所有妄图解决业务问题的开源解决方案,最终还是解决不了问题,并带给你一堆苦恼。所以,这么大的数据量,自己实现中间件,自己基于业务进行分片,还是最好的解决方式,对于性能也有一个更清楚的认识,合并查询
- 如果仅仅是基于数据大集中,还是把数据大集中的数据库作为一个备份库更加合适一些,防止出现当总个游戏服的大数据集中依赖于这个点,导致当这个点出现问题时风险过份集中
- mongodb只要转变思路还是一个相当不错的数据库,nosql的优点一览无疑,对于游戏这种弱数据结构的场景是非常合适的,并且最好采用单机方案,不去做分片,很方便的慢查询非常快就找到了
- 尽量做好分表,或者说要尽量能分的表尽量分掉,如果可以用日期分表,然后,让新旧数据隔离,性能会非常出色
- 规划好索引,特别是联合索引,mongodb要直接命中联合索引性能才能比较好
- 如果能用3.x还是用3.x吧,至少库级锁的问题就解决了,2.x的话,尽量从业务上把库分掉
- 至于占用内存过大,及空间过大的问题,3.x的新引擎据说已经很好的处理了一下
- 如果采用3.x的话,意味着lua客户端的库就有很多不支持了。。因为验证方式的改变,那么可以采用我新实现的方案,由于是采用luajit的ffi实现的,所以,可能很多不能用,自己看着办吧,https://github.com/linbc/mongo-clua-driver
常规经验贴,推荐
http://www.cnblogs.com/cswuyg/p/4595799.html
http://www.cnblogs.com/cswuyg/p/4355948.html
使用MongoDB血泪般的经验教训的更多相关文章
- 新人入职100天,聊聊自己的经验&教训
这篇文章讲了什么? 如题,本屌入职100天之后的经验和教训,具体包含: 对开发的一点感悟. 对如何提问的一点见解. 对Google开发流程的吐槽. 如果你 打算去国外工作. 对Google的开发流程感 ...
- Apache Storm 的历史及经验教训——Nathan Marz【翻译】
英文原文地址 中英文对照地址 History of Apache Storm and lessons learned --项目创建者 Nathan Marz Apache Storm 最近成为了ASF ...
- 七年IT生涯的经验教训
七年IT生涯的经验教训[转]我在IT界也拼打了有好几年了,但是现在和别人比较起来不是很如意.从天分上来说,我在属于智商不低的人:从技术上说,几乎没有我拿不下的:从见解上看,我是很有点子看法的人. ...
- 从Apache Storm学到的经验教训 —— storm的由来(转)
阅读目录 Storm来源 初探 再探 构建第一个版本 被Twitter收购 开源的Storm 发布之后 Storm的技术演进 构建开发者社区版 离开Twitter 提交到Apache Apache孵化 ...
- 从面向服务架构(SOA)学习:微服务时代应该借鉴的5条经验教训
[编者按]本文作者为 Matt McLarty,通过介绍 SOA 的兴衰变化,总结了微服务应该借鉴的5条经验教训.文章系国内 ITOM 管理平台 OneAPM 编译呈现. SOA 的兴衰变化让我们更了 ...
- 创建Android Apps的30个经验教训
这个世界上有两种人-从经验教训中学习的人以及听从别人建议的人.这里是我一路走来学到的一些东西,分享给大家: 在添加任何第三方party之前,请三思:这真的是一个成熟的项目吗? 如果一个东西用户看不到, ...
- google开发新人入职100天,聊聊自己的经验&教训 个人对编程和开发的理解 技术发展路线
新人入职100天,聊聊自己的经验&教训 这篇文章讲了什么? 如题,本屌入职100天之后的经验和教训,具体包含: 对开发的一点感悟. 对如何提问的一点见解. 对Google开发流程的吐槽. 如果 ...
- Week1 Team Homework #1 from Z.XML-总结学长经验教训
谭传奇学长: 我们的弯路可能是,一开始没有从最基础的部分开始迭代开发,一开始就想的太远了一些,每一步开的有点太大了,所以可能有些东西最后就连不上,也没有能够按时完成.如果可以先做出一个能用的版本,然后 ...
- CQRS之旅——旅程8(后记:经验教训)
旅程8:后记:经验教训 我们的地图有多好?我们走了多远?我们学到了什么?我们迷路了吗? "这片土地可能对那些愿意冒险的人有益."亨利.哈德逊 这一章总结了我们旅程中的发现.它强调了 ...
随机推荐
- 使用 Qt 获取 UDP 数据并显示成图片(2)
本文首发于 BriFuture 的 个人博客 在我的前一篇文章 使用 Qt 获取 UDP 数据并显示成图片 中,我讲了如何用 Python 模拟发送数据,如何在 Qt 中高效的接收 UDP 数据包并将 ...
- String.Compare 方法 (String, Int32, String, Int32, Int32)
String.Compare 方法 (String, Int32, String, Int32, Int32) 对两个指定的 String 对象的子字符串进行比较,并返回一个指示二者在排序顺序中的相对 ...
- 深入理解JavaScript系列(40):设计模式之组合模式
介绍 组合模式(Composite)将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性. 常见的场景有asp.net里的控件机制(即control ...
- log4j记录日志 和 webAppRootKey关系
今天发现一个问题,就是后台从某天开始不再记录日志了,最后发现是 webAppRootKey 的 value 的值必须要和log4j的注入变量要一致. 如下:web.xml文件的 webAppRootK ...
- SQL拼接 html 发送
--在Job BES_Daily_FTP_filedownload 中使用 ALTER proc [dbo].[RSP_FN_UNAPPLIED_Mail_Reminder] as Declare @ ...
- dbcp数据库连接池的java实现
1.准备 导入jar包 commons-dbcp-1.4.jar commons-pool-1.3.jar 数据库驱动包,如:mysql-connector-java-5.1.28-bin.jar 2 ...
- javaweb之jsp的九个隐含对象与基本语法
1.在页面上可以不用声明直接使用的对象称为jsp页面的隐含对象.使用<% %>编写的java代码在_jspService方法中,如下: public void _jspService(fi ...
- css之子元素获取(未定义高度)父元素的高度
你可能碰到过这样的需求,一个高度不固定的区域(内容由用户创造),当鼠标经过该区域或者其神马操作时,需要出现一个与该区域一样大的模版: 我们用一个span来处理这个mask.由于 .sample-1 和 ...
- git基本命令集合
以下内容不适合初学者 括号中表示需要自己填写 v1.0 git add git commit -m git commit -a -m git commit -amend git clone git l ...
- PHP获取当前时间戳
PHP提供了专门的获取当前时间戳的函数,那就是time()函数. time()函数获取当前的UNIX时间戳,返回值为从时间戳纪元(格林威治时间1970年1月1日 00:00:00)到当前的秒数. ...