故事背景,天书世界,现在项目已经属于成熟维护期,是时候总结一下当时的想法

第一个问题,为什么使用mongodb?

  1. 数据库对于游戏项目本身的要求与传统业务系统差异较大,所以nosql的弱结构性对于我那是相当的有吸引力,
  2. c++代码里面夹杂着sql这种方式实在是有点丑
  3. 由于要实现“秒合”,那么就意味所有的数据必须放到一起,遍寻当时的所有的数据库,支持热分片也就mongodb,仅此一家,别无分店
  4. mongodb号称与传统的sql最为接近,你可以像使用sql一样的去用他

第二个要回答的问题,mongodb有什么让人纠结点?

  1. mongdb的库级锁,真是让人心伤,就是因为你需要用到大量的数据都需要分片,结果你告诉我我这是库级锁 !你是想让我一张表一个库吧?
  2. 连接数过多,就是不想自己做中件间,或者说是数据库访问层,才想到你的分片,你居然告诉我连接数过多,差不多到10000多连接就卡得跟鬼一样!
  3. mongdb客户端的不成熟,编译个c++版本,还得引入个巨大无比的boost,c版本各种混乱,现在可倒好,升级到3.x,直接连这些驱动都不能用了。
  4. 没有lua官方驱动,只好网上找开源实现,但毕竟不是官方,我猜连接有泄漏
  5. 号称跟传统mysql之类最为接近,结果索引的效果跟mysql差异非常大,特别是联合索引,表的设计模式也是相当的不同,否则的话够你受的
  6. 做了分片之后mongodb性能分析就非常难用了,没有办法用很简单的方式找到慢查询
  7. 有时候我们还是需要有一个自增id的,由于mongodb的实现方式也好,或者说分片机制也罢,总之,如果需要实现一个自增id对于mongodb是个难题
  8. 内存过大,硬盘空间过大

第三个问题,都这样了,有什么要说的吗?

  1. 出来混的,总是要还的!所有妄图解决业务问题的开源解决方案,最终还是解决不了问题,并带给你一堆苦恼。所以,这么大的数据量,自己实现中间件,自己基于业务进行分片,还是最好的解决方式,对于性能也有一个更清楚的认识,合并查询
  2. 如果仅仅是基于数据大集中,还是把数据大集中的数据库作为一个备份库更加合适一些,防止出现当总个游戏服的大数据集中依赖于这个点,导致当这个点出现问题时风险过份集中
  3. mongodb只要转变思路还是一个相当不错的数据库,nosql的优点一览无疑,对于游戏这种弱数据结构的场景是非常合适的,并且最好采用单机方案,不去做分片,很方便的慢查询非常快就找到了
  4. 尽量做好分表,或者说要尽量能分的表尽量分掉,如果可以用日期分表,然后,让新旧数据隔离,性能会非常出色
  5. 规划好索引,特别是联合索引,mongodb要直接命中联合索引性能才能比较好
  6. 如果能用3.x还是用3.x吧,至少库级锁的问题就解决了,2.x的话,尽量从业务上把库分掉
  7. 至于占用内存过大,及空间过大的问题,3.x的新引擎据说已经很好的处理了一下
  8. 如果采用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血泪般的经验教训的更多相关文章

  1. 新人入职100天,聊聊自己的经验&教训

    这篇文章讲了什么? 如题,本屌入职100天之后的经验和教训,具体包含: 对开发的一点感悟. 对如何提问的一点见解. 对Google开发流程的吐槽. 如果你 打算去国外工作. 对Google的开发流程感 ...

  2. Apache Storm 的历史及经验教训——Nathan Marz【翻译】

    英文原文地址 中英文对照地址 History of Apache Storm and lessons learned --项目创建者 Nathan Marz Apache Storm 最近成为了ASF ...

  3. 七年IT生涯的经验教训

     七年IT生涯的经验教训[转]我在IT界也拼打了有好几年了,但是现在和别人比较起来不是很如意.从天分上来说,我在属于智商不低的人:从技术上说,几乎没有我拿不下的:从见解上看,我是很有点子看法的人. ...

  4. 从Apache Storm学到的经验教训 —— storm的由来(转)

    阅读目录 Storm来源 初探 再探 构建第一个版本 被Twitter收购 开源的Storm 发布之后 Storm的技术演进 构建开发者社区版 离开Twitter 提交到Apache Apache孵化 ...

  5. 从面向服务架构(SOA)学习:微服务时代应该借鉴的5条经验教训

    [编者按]本文作者为 Matt McLarty,通过介绍 SOA 的兴衰变化,总结了微服务应该借鉴的5条经验教训.文章系国内 ITOM 管理平台 OneAPM 编译呈现. SOA 的兴衰变化让我们更了 ...

  6. 创建Android Apps的30个经验教训

    这个世界上有两种人-从经验教训中学习的人以及听从别人建议的人.这里是我一路走来学到的一些东西,分享给大家: 在添加任何第三方party之前,请三思:这真的是一个成熟的项目吗? 如果一个东西用户看不到, ...

  7. google开发新人入职100天,聊聊自己的经验&教训 个人对编程和开发的理解 技术发展路线

    新人入职100天,聊聊自己的经验&教训 这篇文章讲了什么? 如题,本屌入职100天之后的经验和教训,具体包含: 对开发的一点感悟. 对如何提问的一点见解. 对Google开发流程的吐槽. 如果 ...

  8. Week1 Team Homework #1 from Z.XML-总结学长经验教训

    谭传奇学长: 我们的弯路可能是,一开始没有从最基础的部分开始迭代开发,一开始就想的太远了一些,每一步开的有点太大了,所以可能有些东西最后就连不上,也没有能够按时完成.如果可以先做出一个能用的版本,然后 ...

  9. CQRS之旅——旅程8(后记:经验教训)

    旅程8:后记:经验教训 我们的地图有多好?我们走了多远?我们学到了什么?我们迷路了吗? "这片土地可能对那些愿意冒险的人有益."亨利.哈德逊 这一章总结了我们旅程中的发现.它强调了 ...

随机推荐

  1. Junit打包测试

    在一个项目中,只写一个测试类是不可能的,我们会写出很多很多个测试类.可是这些测试类必须一个一个的执行,也是比较麻烦的事情. 鉴于此, JUnit 为我们提供了打包测试的功能,将所有需要运行的测试类集中 ...

  2. css3中outline切换动画效果

    今天刚看了篇文章<纯CSS实现的outline切换transition动画效果> 里面的效果研究了一下,下图为实现时的效果 代码如下: <!DOCTYPE html> < ...

  3. django允许跨域请求配置

    django允许跨域请求配置 下载corsheader pip install django-cors-headers 修改setting.py中配置 在INSTALLED_APPS中增加corshe ...

  4. Redis云端架构深入浅出

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云数据库 TencentDB 发表于云+社区专栏 作者介绍:邹鹏,腾讯云数据库Redis产品负责人,多年数据库.网络安全研发经验. ...

  5. Truncated incorrect DOUBLE value: 'NO_REFUND'

    解决办法:Mysql中,如果一个字段是字符串,则一定要加单引号 问题原因: `item_refund_state` ) NOT NULL item_refund_state字段的类型是varchar但 ...

  6. Eclipse 工具栏无法移动的解决办法

    升级到Juno后发现工具栏有些乱 而且无法拖动,试了下http://blog.csdn.net/cxx504659987/article/details/38532599的方法 发现配置文件里没有文中 ...

  7. SQL中的函数以及实例

    AVG (平均) COUNT (计数) MAX (最大值) MIN (最小值) SUM (总合) 运用函数的语法是: selecte  "函数名"("列名") ...

  8. 如何删除eclipse中已经保存的svn密码

    一.打开eclipse--->点击Window--->点击Perference,打开eclipse配置,输入svn,然后点击svn,找到下方svn接口,查看下svn是什么类型的接口,如果是 ...

  9. java 类与对象基础整理

    之前学习javaSE的时候,没有针对性地对对类与对象的一些基础进行整理,下面这些内容是笔记内容整理后的,希望以后自己可以通过这些博客时常复习! 一.类and对象的基础 类似于类的生命啊,类与对象的关系 ...

  10. JAVA常用单词

    柠檬学院Java 基础常见英语词汇(共 70 个)OO: object-oriented ,面向对象 OOP: object-oriented programming,面向对象编程JDK:Java d ...