游戏服务器数据库踩过的坑

在页游服务器这块很早之前一直没有认真考虑过,大部分是之前搭建好的,我只需要按照他原来的设计继续码代码就好了。

可是这次服务器重构的过程中,还是遇到了很多始料不及的问题。那么就按照踩过的坑,去一个个讲讲分析分析。

1:起初mysql的方案

  起初的设计方案是这样,用一个RolePlayer 去做玩家数据的缓存,所有玩家的数据更新到RolePlayer中,定时十秒中更新到数据库。RolePlayer大概是这样一个设计

class RolePlayer

{

  public int roleId;

public String packInfo;

public String equipInfo;

public String taskInfo;

.....

}

每十秒钟对所有在线的RolePlayer做一个批处理的更新,用的jdbc,对于玩家的流水也是如此,只是更多的是拼凑的字符串,比如这样insert into onlineserials(roleid,rolename,oltime) values (1212929,"wanjia1",12222),(1212929,"wanjia1",12222),(1212929,"wanjia1",12222)(1212929,"wanjia1",12222),(1212929,"wanjia1",12222) 。对于流水的处理还算比较谨慎,当流水条目到达5k之后 才做一次插入。我想这大概是一个页游服务器对mysql的通用设计,可是无奈总是出现内存泄露,用工具查看,基本是 string中的char占到了内存的40%,无论我使用什么回收方式都无效。  当然我依然觉得这是一个很好的设计,只是我自己在使用上还是欠水准。

  2:mongo的数据库方案

  后来调整数据库为mongo的,大家不要惊讶,我用的是json格式存储的数据库,这样兼容mysql和mongo,所以调整起来比较容易。mongo使用起来就比较简单了,对于这种nosql 内存数据库,使用起来就方便不少,无论是更新还是查询。基本的设计就是当玩家的数据改变的时候,就更新到数据库,当然是通过一条消息异步到数据库线程去做更新,对于流水的记录也是同样的道理。只是mongo 是一个内存怪兽,对于内存的贪婪,想必用过的人都清楚,对于mongo对于内存的管理大家可以百度下,有很多这样的文章,在这里就不详细解释。我起初也是毫无办法,甚至去读外文资料。找到我们之前的运维,他们也说并没有对mongo做太多的设置,只是用了一个内存25g+raid10硬盘 去专门部署mongo数据库,ssd确实太贵用不起。在网上微博上搜集了一些资料也分享给大家,虽然并不能完全控制,但是也不失为一个很好的办法。

  3:控制mongo的内存

    1: 调整linux内核的内存管理方式: shell> sysctl -w vm.drop_caches=1

2:利用mongo提供的方式去回收整理内存:使用时会影响mongo的效率

mongo>use mmo;

       mongo>db.repairDatabase();

3:主动清理linux的cache内存: echo 3 > /proc/sys/vm/drop_caches

      说明,释放前最好sync一下,防止丢数据。

可以用一个将上面的命令定时跑 去释放mongo的内存。

  4:控制mongo内存最终的方案

  在翻看《mongo实战》这本书的时候发现了capped collection的用法。capped collections有如下优点:

1: 固定大小集合,如此便防止了内存无限扩张。

2: 以LRU(Least Recently Used)规则和插入顺序进行age-out(老化移除) 处理,自动维护集合中的插入顺序。

初看会以为 固定大小是一个很大的限制,但其实对于也有来说已经足够,现在的页游导入用户 基本在万级别。 老化移除防止了内存的无限矿长,对于流水,我们大部分只是要最近的流水来查找问题,对于一个月以前的流水,我想没人会关心。

另外补充,调整ulimit 并不能控制住mongo对于内存的使用。

如有误,望批评!

游戏服务器数据库踩过的坑

时间: 2024-10-13 11:54:45

游戏服务器数据库踩过的坑的相关文章

[转至云风的博客]谈谈陌陌争霸在数据库方面踩过的坑( Redis 篇)

« 谈谈陌陌争霸在数据库方面踩过的坑(芒果篇) | 返回首页 | linode 广告时间 » 谈谈陌陌争霸在数据库方面踩过的坑( Redis 篇) 注:陌陌争霸的数据库部分我没有参与具体设计,只是参与了一些讨论和提出一些意见.在出现问题的时候,也都是由肥龙.晓靖.Aply 同学判断研究解决的.所以我对 Redis 的判断大多也从他们的讨论中听来,加上自己的一些猜测,并没有去仔细阅读 Redis 文档和阅读 Redis 代码.虽然我们最终都解决了问题,但本文中说描述的技术细节还是很有可能与事实相悖

Java8 Lambda表达式应用案例 -- 单线程游戏服务器+异步数据库操作

前段时间我们游戏服务器的开发环境升级到了Java8,这两天我又把服务器的线程模型重新设计了一下,用上了Lambda表达式.Lambda表达式确实能够大幅简化Java代码,特别是丑陋不堪的匿名内部类,这篇文章主要就是想和大家分享这一点. 线程模型 首先简单介绍一下我们游戏服务器的线程模型,大致如下图所示: Netty线程池只处理消息的收发,当Netty收到消息之后,会交给游戏逻辑线程处理.由于是单线程在处理游戏逻辑,所以每一个消息必须很快处理完,也就是说,不能有数据库等耗时操作,不然逻辑线程很可能

Java游戏服务器成长之路——弱联网游戏篇(源码分析)

http://blog.csdn.net/hjcenry/article/details/50530472 前段时间由于公司的一款弱联网游戏急着上线,没能及时分享,现在基本做的差不多,剩下的就是测试阶段了(本来说元旦来分享一下服务器技术的).公司的这款游戏已经上线一年多了,在我来之前一直都是单机版本,由于人民群众的力量太强大,各种内购破解,刷体力,刷金币,刷钻石版本的出现,公司才决定将这款游戏转型为弱联网游戏,压制百分之八十的破解用户(毕竟原则上还是属于单机游戏,不可能做到百分之百的防破解),招

当我设计游戏服务器时,我在想些什么?(4)

我兴高采烈的把我的架构图发给一个有经验的前辈看,他指出来,也许不需要这么多逻辑进程.听他这么说,我想到这么早就把逻辑强行拆开给设计带来了不必要的复杂度,也没有让架构更加优美,甚至这种拆分可能是不必要的,过早的逻辑拆分就跟提前优化代码一样,都应该避免. 于是我去掉了 chat.mail 进程,打算把所有逻辑都放在 loc 进程进行处理,如果后期发现有拆分的必要再进行拆分. 最开始的时候,我提到过,想要服务器进程可以方便的横向动态进行改变,使用 zmq 满足了动态改变的需求,那么怎么能进行横向扩展呢

Java游戏服务器微信房卡炸金花平台出租成长之路

Java游戏服务器成长的微信房卡炸金花平台出租QQ1279829431(h5.mostsheng.com)17061863554源码出售平台出租系列,已经很长时间没写了,不是不想写,而是这一年,基本都是在忙别的了,今天特地挤出时间,对我的2016年,做一个不留遗憾的总结. 2016的事件 不知不觉,又到了春节抢票的时候了,这两天除了盼着年终能发点奖金以外,就是盼着能买一张合适的火车票,今年是离家最久的一年,幸运的是,我成都的小房子要结房了,必须要我本人到场,这就能给我一个理由多请一周的假提前回去

2019爬虫项目总结——我在项目中踩的那些坑

2019刚出校门,初到公司,最大的成就是完成了一个全球抓取数据的系统!简单介绍一下这个项目的实现思路以及在项目中踩过的坑,随时告诫自己以后尽量避免! 历时一个半月还多几天,终于通过交付测试了!项目是从全球范围内,通过Google,Bing,雅虎来抓取数据,由于服务器不是特别的好,并且考虑到会有很多的脏数据,我们在实现的时候并没有将数据入库,想要将数据进行持久化的保存,可以使用导出的方式将数据以电子表格的方式导出来! 难点一: 项目经历了一次大的改版,将整个的抓取流程做了一次很大的改动.我们在抓取

游戏服务器开发需要学习的技术

一,游戏服务器编程语言的选择 所谓的游戏服务器编程语言其实有很多,基本上任何一种语言都可以作为游戏服务器的编程语言.这需要根据自己游戏的类型和要求加以选择.比如C++,Java ,Erlang,go等等.目前我用过的只有C++和Java.但是以Java为主.所以接下来就以自己的经验,谈谈以Java为核心的游戏服务器开发技术体系. Java目前作为游戏服务器开发语言已经很是普遍.但是大多数是作为页游或手游的服务器,而端游戏一般选择C++,因为端游对服务器的性能要求相对比较高一些.两种语言各有利弊.

棋牌游戏服务器架构设计

转载自:简书一位同行的文章 一,棋牌类服务器的特点 1,棋牌类不分区不分服 一般来说,棋牌游戏都是不分区不分服的.所以棋牌类服务器要满足随着用户量的增加而扩展的需要. 2,房间模式 即在同一局游戏中就是在同一个房间中,同一个房间中的人可以接收到其他人的消息. 3,每个房间的操作必须是顺序性 这个特性类似与一般游戏的回合制,每个玩家的操作都是有顺序性的. 二,需要解决的技术点 1,数据共享 因为棋牌类游戏不分区不分服,我们在设计服务器的时候,是按世界服的思想去设计,即服务器是一个n多台物理机的集群

使用GoWorld游戏服务器引擎轻松实现分布式聊天服务器

GoWorld游戏服务器引擎简介 GoWorld是一款开源的分布式可扩展的游戏服务器引擎,使用Go语言(Golang)编写.它采用类似BigWorld的结构,使用了简化的场景-对象框架.以一个典型的MMORPG为例,每个服务器上会有多个场景,每个场景里可以包含多个对象,这些对象包括玩家.NPC.怪物等.GoWorld服务器可以将场景分配到在不同的进程甚至不同的机器上,从而使得游戏服务器的负载是可扩展的. 开源分布式游戏服务器引擎:https://github.com/xiaonanln/gowo