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

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

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

     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对于内存的使用。

      如有误,望批评!

时间: 2025-01-24 10:10:48

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

7个产品经理/交互新人初入职场时踩过的坑

  前车之鉴后事之师,聪明的人可以从别人的错误中学到经验.这次特意邀请了七位迈入职场不久的产品经理.交互设计师同学,分享那些他们踩过的坑.话不多说,收获有多少,就看你有多聪明啦. 当从象牙塔走入职场,新人们除了兴奋和憧憬以外更多的还有紧张和迷茫:对庞大业务的不熟悉.对工作模式和规范的不了解.对同事和前辈的生疏,都是新人成长的必经之路.有些坑,需要我们亲自踩过才能有深刻的体会,但是前车之鉴后事之师,聪明的人一样可以从别人的错误中学到经验. 这次特意邀请了七位迈入职场不久的产品经理.交互设计师同学,

游戏服务器架构演进(完整版)

一.游戏服务器特征 游戏服务器,是一个会长期运行程序,并且它还要服务于多个不定时,不定点的网络请求.所以这类服务的特点是要特别关注稳定性和性能.这类程序如果需要多个协作来提高承载能力,则还要关注部署和扩容的便利性;同时,还需要考虑如何实现某种程度容灾需求.由于多进程协同工作,也带来了开发的复杂度,这也是需要关注的问题. 功能约束,是架构设计决定性因素.基于游戏业务的功能特征,对服务器端系统来说,有以下几个特殊的需求: 游戏和玩家的数据存储落地 对玩家交互数据进行广播和同步 重要逻辑要在服务器上运

这篇必看:那些产品、交互新人初入职场踩过的坑

当从象牙塔走入职场,新人们除了兴奋和憧憬以外更多的还有紧张和迷茫:对庞大业务的不熟悉.对工作模式和规范的不了解.对同事和前辈的生疏,都是新人成长的必经之路.有些坑,需要我们亲自踩过才能有深刻的体会,但是前车之鉴后事之师,聪明的人一样可以从别人的错误中学到经验. 这次特意邀请了七位迈入职场不久的产品经理.交互设计师同学,分享那些他们踩过的坑.话不多说,收获有多少,就看你有多聪明啦. 交互设计师 鸿影 from 阿里巴巴 1. 无脑闷头执行 过程描述:接到需求的时候,对方描述了一个具体的解决方案,就

说说云计算时代,运维人员会踩到哪些坑?

近期在ChinaUnix论坛有一场讨论,标题是--云计算时代:运维人员会踩到哪些坑? 整个讨论过程非常活跃,大概有50个答复,运维派这就给大家整理了一些讨论的优质内容分享给大家. 背景: 在云计算领域,运维人员就是这样的存在,小到一条短信,大到一次网上交易,只要和IT相关的业务就需要这些运维人员,没有他们在背后的支持,生活是会出大乱子的. 可是到了云计算时代,不少人说IT人要下岗了,是否真会如此呢?云计算的出现是否会使得整体行业对运维的需求萎缩了呢? 面对传统的几十台服务器时,运维人员还能手动处

棋牌游戏服务器基本架构

1. 总体设计概述休闲游戏系统主要包括以下几个部分: l 服务器:CenterServer.GameDataServer.GameServer.LoginServer l 客户端 l 数据库 l 网管工具 l 网页服务器 用户使用客户端通过网络连接LoginServer进行身份验证,CenterServer和GameServer通过数据库存取用户数据,客户端和GameServer配合完成用户的游戏功能,网管工具用来管理服务器的配置.启动等工作,网页服务器提供相关网页处理. 2. 各部分的主要功能

平台-GPS服务器, 主服务器数据库和次数据库服务器在不同机房中做同步备份

问题描述 GPS服务器, 主服务器数据库和次数据库服务器在不同机房中做同步备份 GPS服务器,怎么做可以让终端双IP或双域名,主服务器数据库和次数据库服务器在不同机房中做同步备份,然后终端平台主服务器挂了切到次服务器中 有没有什么好方案的 解决方案 这个问题需要在终端软件中实现,比如证券公司和游戏服务器都是多个IP和域名,登录时自动判断首选IP或域名是否联通,连接不上时就尝试下一个ip或域名,不知道对不对!个人看法!

棋牌游戏服务器架构: 部署

(有什么问题欢迎指教,企鹅:2172243813 更多资讯尽在www.ttkmwl.com) 1布署数据库       选定作为数据库服务器的机器以后,要先安装postgresql数据库,然后导入ServerInfoDB(CenterServer使用), UserInfoDB(LogonServer.RoomServer.LogServer使用),UserScoreDB(RoomServer使用),还有有关各个游戏逻辑的数据库,比如TexasPokerDB等等.这些数据库不一定要放在一台机器上,

“爆款”游戏吃鸡是如何诞生的?聊聊游戏服务器的架构演进

近日的游戏圈只有一个主题--「吃鸡」.长期被 MOBA 多人在线战术竞技游戏,如<英雄联盟>.<王者荣耀>游戏把持的国内游戏市场在"吃鸡"的刺激下出现了松动.作为技术人让我们一起看看目前游戏服务器的演化进程. 本文阅读预计需要 10 分钟,主要技术点如下: 游戏服务器特征. 短连接游戏服务器架构. 长连接游戏服务器架构. 分区分服服务器架构. MMOARPG 服务器架构. 房间服务器架构. 游戏服务器特征 游戏服务器端,是一个会长期运行的程序,并且它还要服务于多

cardstories 1.0.4发布 网络猜谜游戏服务器图片卡

cardstories提供了一个网络猜谜游戏服务器使用的图片卡.一个玩家开始通过选择卡,选择一个词或一个句子来形容它,并发送邀请函给他人参加比赛.这些球员每收到七张牌,并挑选一个最符合的描述.一旦足够的玩家选择了一张卡片,笔者选择显示卡和所有的玩家揣摩哪一个是作者.如果至少有一个但不是所有的猜测都正确,哪么作者胜,随着玩家被谁猜中.最后,猜测的将全部获胜. cardstories 1.0.4此版本在"get_package"功能的性能得到改善.在"数据库:database_a