战魂小筑

讨论群:309800774 知乎关注:http://zhihu.com/people/sunicdavy 开源项目:https://github.com/davyxu

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  257 随笔 :: 0 文章 :: 506 评论 :: 0 Trackbacks

数据库选择历程

我们的项目一直使用MySQL作为数据库. 无论是从C++的服务器, 还是到Golang服务器. 当年搞服务器时, 看大部分人都是用SQL(MySQL/SQLServer), 而Mongo感觉像邪教一样, 再加上服务器还是Linux比较正统, 所以果断选了MySQL.

刚开始感觉,游戏服务器的数据存储其实应该是蛮神圣的过程. 那么多的数据, 需要按照MySQL一样分表, 分字段存储, 为了查询, 还要乖乖的学一下SQL的语法

就这么折腾了几年. 在云DB的蒙蔽下, 一直认为MySQL就是做游戏服务器存储的专业技术. 分布式和存储压力一定交给云DB来做. 直到真正试了下NoSQL在游戏服务器开发里的思路.

用了Golang, 才发现同步写逻辑是多么的优雅.

用了NoSQL系列的数据库, 才意识到: 游戏服务器的数据存储和游戏服务器的存盘两个概念差异其实蛮大的.

MySQL中, 背包其实跟角色完全没有关系, 只是通过1个角色id映射过去, 人为的割裂了数据的关联性. 还硬生生的整出个概念叫结构化查询让你学

NoSQL中, 只是把数据库当成是存储点, 每个角色的数据是完整的一块. 里面怎么存随你便. 每个角色通过id来查询, 其他都没有了

于是乎, 游戏开发变得异常简单. MySQL角色进门查询4~5次才能搞定要的数据.而NoSQL一口气全查出来, 存盘也无需增量, 直接存盘就可以了

所以现在觉得, NoSQL的思路对于游戏服务器存储来说简直是完美的!

转载请注明: 战魂小筑http://www.cppblog.com/sunicdavy

 

NoSQL数据库方案对比

NoSQL下实现方案很多, 游戏常用的就这么3家: mongo, redis, memcached

下面说下优缺点

mongo

磁盘映射内存数据库

value为document类型, 基于BSON的value序列化

应用场景:

适合多写少读, 例如日志和备份

转载请注明: 战魂小筑http://www.cppblog.com/sunicdavy

 

redis

内存数据库

单核

value限制512M

多种value类型, 游戏用途使用私有的序列化协议(例如protobuf)

支持落地(bgsave)

用户: 新浪, 淘宝, Flickr, Github

应用场景: 适合读写都很高, 数据处理复杂等

转载请注明: 战魂小筑http://www.cppblog.com/sunicdavy

 

memcached

内存数据库

多核

value限制1M

不支持落地(持久化)

用户: LiveJournal、hatena、Facebook、Vox

应用场景: 动态系统中的缓冲, 适合多读少写

转载请注明: 战魂小筑http://www.cppblog.com/sunicdavy

个人评价

memcached 适合网页缓冲, 游戏里很少有使用. 目前只有腾讯云支持云memcached

redis非常适合游戏的内存数据库, 但是落地策略会比较复杂, 需要具体分析, 可以参考后面的链接看下云风怎么处理这个问题

mongo数据库在早期还是非常不错的NoSQL的数据库. 工具比较方便, 可视化. 但是随着近年来游戏的并发度越来越高, 所以为了一次到位, 很多人还是选择了redis

下图参考自知乎问题. 链接在后面有提示, 若侵权请联系删除

转载请注明: 战魂小筑http://www.cppblog.com/sunicdavy

image

参考链接:

    谈谈陌陌争霸在数据库方面踩过的坑( Redis 篇)

http://blog.codingnow.com/2014/03/mmzb_redis.html

转载请注明: 战魂小筑http://www.cppblog.com/sunicdavy

Memcache,Redis,MongoDB(数据缓存系统)方案对比与分析

http://blog.csdn.net/suifeng3051/article/details/23739295

 

http://www.zhihu.com/question/31417262

posted on 2015-06-19 16:23 战魂小筑 阅读(6554) 评论(5)  编辑 收藏 引用 所属分类: 游戏开发技术网络 服务器技术

评论

# re: 游戏数据库选型mysql,mongo, redis, memcached[未登录] 2015-07-12 02:11 杨粼波
有redis就用redis,没有就用memcached,memcached是redis的子集,也可以称之为memcached的升级版。redis的查询语句要丰富得多,当然,也是要复杂的多。

mongoDB虽然也是NoSQL数据库,但是与以上两者有很大的区别。首先,它是磁盘数据库,而不是内存数据库,虽然也可以搞成内存数据库,但是那是歪门邪道。而且,该数据库的稳定性有待改进,对于数据库而言,稳定性是我们首要考虑的,服务不能出问题,数据不能出问题。而mysql这样发展了许多年的数据库就是我们的首选了,通常将其作为热备数据库。

redis的热备份看起来很美好,但其实不好用,还有损性能。通常都会被关闭掉。

以前新浪是用的memcached,现在不知道了,他们还好像自己改进了,当然,主要是做分布式。

淘宝也有基于memcached开发的Tair,不过据说现在他们自己也慢慢开始放弃了,主要也是在分布式上作了点文章。http://code.taobao.org/p/tair/src/

对于游戏这样的应用而言,只要不是腾讯那样的用户量级,都不需要考虑分布式的问题。只需要省心便可,用redis功能多,自然是首选。  回复  更多评论
  

# re: 游戏数据库选型mysql,mongo, redis, memcached[未登录] 2015-07-12 02:27 杨粼波
再啰嗦几句。

阿里云也支持memcached的,当然也支持redis,
腾讯云太挫了,我对它印象不好,有用过,redis是今年才支持的,要不是因为不支持redis,我也就不会选择memcached了,很多功能本可以用redis里面很简单一条命令搞定的,不过话说回来,至少也没有它搞不定的事情。

memcached有个最郁闷的事情就是没有什么称手的工具,只有一个php的memAdmin以及http://www.cnblogs.com/xffy1028/archive/2013/02/01/2861706.html

而Redis有一个http://www.oschina.net/p/redisdesktop,这个很好用。

内存数据库相对于磁盘数据库而言,不要抱有太大期望。只不过是说,磁盘数据库随着数据量增大,它的性能会呈指数级降低。而内存数据库基本上是没有太大的影响,仅此而已。磁盘数据库数据量少的时候,可能跟内存数据库的性能差不多哦。  回复  更多评论
  

# re: 游戏数据库选型mysql,mongo, redis, memcached 2015-07-13 09:24 战魂小筑
@杨粼波
感谢杨大大专业级回答  回复  更多评论
  

# re: 游戏数据库选型mysql,mongo, redis, memcached[未登录] 2015-07-14 12:50 杨粼波
@战魂小筑
专业倒称不上,因为做过,这些都比较了解了,只能说是过来人罢了。我那个数量级,简直要笑掉大牙的。要专家级,起码得经历过大用户量的冲击才行啊。  回复  更多评论
  

# re: 游戏数据库选型mysql,mongo, redis, memcached 2015-07-20 20:29 T
mongo号称程序员的最爱,运维的噩梦。
过了开发期的甜蜜时光,后面就有的痛苦了。  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理