如今nosql 的应用越来越广泛,已不仅仅应用于高并发的大型网站,也在慢慢应用到游戏服务器中来。基于它的高性能,易部署,上手快的特点。
目前上线了一款产品,弱联网,日活跃百万级别,用户数据千万级别,数据库使用redis.redis属于内存型数据库,但同样也支持数据持久化,官方数据可达到10万的操作,实际测试约也能达到5~6W,详情参考
redis 集群性能测试以及与单机性能对比(1)。利用redis的高性能,在实现服务器时省不少事,直接用数据库当内存,游戏服务器不再缓存任何数据,每次请求从数据库获取数据,操作完成后,保存数据。曾使用gatling 做过压力测试,按照实际生产环境部署,模拟游戏逻辑,
每个请求约5次数据库操作,测试结果可达到1W+的并发,当初推测瓶颈可能在nginx,不过经过后面的实际测试盒分析,可能在数据库(
redis 集群性能测试结果分析)。如果按照官方的数据,应该还有提升的可能。下面为服务器的架构图:
为了防止意外情况,每个redis的节点后都有个从数据库,目前还没有用上。
现在游戏越来越重度化,很多端游的产品移植到手游获得了很大的成功,手游服务器也将变的更加复杂。基于目前的服务器框架,尝试在强联网的服务器中使用类似的结构。前面的框架实现基于 node.js,它比较适用于轻度的产品,而以往的端游产品大多采用c++,比如arpg,rpg类,因此后面所提到的都是基于c++的实现。
以往游戏数据库采用mysql较多,本身基于PC的产品单组用户量比较少,我所了解的产品数据量至多也在百万级别左右,这也是经过DBA的优化后的成果,其过程不免要对数据进行分表等优化。在游戏服务器的实现过程中,一般都会缓存游戏数据,或者使用共享内存来减少数据库的压力。(虽没有很正式的测试,只是mysql 自带的工具简单的测试了下,推测mysql每秒的操作次数之多应该在千级别,当然这和mysql本身的配置有关,比如说日志的频率,或者说使用的mysql数据引擎,这些对结果的影响非常大。
随着手机的普及,手游的用户量要比PC用户大的多,而且进入游戏的成本要低的多,随时,随地都可以打开游戏玩一会。这也意味着数据量要大的多。使用mysql已经满足不了需求,即便能满足,也需要花费比较大的代价。那么nosql数据库可能是更好的选择:大数据量,高性能,支持集群,易部署。目前接触的多的两款nosql产品redis,mongodb.已上线的产品采用redis,一种可以存储数据结构的内存数据库,这种类型的数据做排名类的功能特别方便。不需要额外工作,数据库已经帮你完成。但一般比较适用于小数据量。这里所说的小数据量是指单条数据,因为存取粒度比较大,每次都是取完整的数据。它与node.js合作非常友好,以json格式存储,而node..js对这种格式可直接使用,无需额外开销。而mongod是一种文档型数据库,以一种类似json的结构存储,查询功能基本和mysql可以媲美,这也是想尝试使用的一个原因。下图为想尝试强联网的服务器架构图:
其结构与之前的架构图类似,多了一个login.因为目前的项目也没有完整的账号系统,采用设备ID做为唯一识别号。proxy相当于nginx,目前没有开源的针对tcp的类nginx解决方案,proxy即用来替代,其只作为详细转发,而不需要对数据进行解析处理,考虑使用DMA方式直接操作硬件,减少内存拷贝,提高性能,更多信息参考
liinux下零拷贝技术。core 为游戏服务器,core不缓存游戏数据,这也是与传统服务器服务器不同之处,我觉得mongdb 的性能足以支撑服务器的需求,这也将大大提高开发效率以及服务器的复杂度。
目前考虑的就这么多了,架构基本搭建完成,细节还在陆续实现中,代码托管在git 上:
tinynet是针对游戏网络模块的定制,easy为通用的一些功能模块,server_framework为架构的具体实现。
因本人水平与经验以及文字功能有限,如有误导,还请见谅。Just follow you heart!
基于nosql的"新型"游戏服务器框架
原文:http://blog.chinaunix.net/uid-8625039-id-4766151.html