游戏服务器合服相关

年后一直在做手游服务器开发,之前做了一个系统,新加了一个数据库表,但是忘记修改合服工具了,合服的时候该表漏合,导致运维部门的同时忙活了大半夜。第二天早上我8点到公司的时候(离公司近,每天7点起床),发现运维部的同事已经到了,之前我每天早上到公司的时候,除了内务部的阿姨,就是客服部的小伙伴们,所以,我也惊呆了。聊着聊着发现运维部的同事晚上通宵了,根本没有回家,然后又得知是合服工具漏合了一个表,但是这个表是我加的。唉,我赶紧连说了几声抱歉。所以赶紧整理下合服相关的知识。

注:本人并没有真正合过服,一下想法是自己总结的,当然也请教了老员工,如果有错误,一定要指出来,谢谢。

1、合服是个概念简单,但是操作复杂,必须十分谨慎的细致活

合服就是把两个或者多个数据库的数据合在一起,从而使多个游戏服组成一个游戏服,之前的多个游戏服中的玩家能够在同一个游戏世界中玩耍,提高游戏内人气。但是每个服的数据库中都存储这大量的表,大量的数据,表与表的结构未必完全一致,游戏持久化的对象ID冲突等都导致了合服是一个让人心惊胆颤的事情。所以在网上能够搜索到很多“合服后,站立下降了,物品丢失了,元宝变少了等各种奇葩的问题”。

但是庆幸的是,基本上都是相同版本的服务器之间才会合服,如果A服现在是1.1的版本,B服现在是2.2的版本,C服现在是3.0的版本,那么就没有需求把A,B,C三个服合起来,如果强行把ABC三个不同版本的服合起来,不是运维傻,就是老板傻。所以相同版本服务器的数据库结构差异基本上都比较小。

2、合服时,要清掉一些不必要合的数据

现在大部分的手游每个服火爆的时间不过数日,这就导致了每个服里面存在这大量的垃圾号,例如等级很低,登陆时间很短,已经N久没登陆,没充过值等,合服前要把这些数据清掉,既加快合服速度,也减少了合服后的僵尸号。

另外还有数据库可能会存储一些配置项,例如我们就专门建了一个config表,存储各种逻辑无关的配置,这些数据就没有必要合了。

3、生成持久化对象ID的时候,一定要主要不要冲突

如果A服玩家ID从1开始分配,B服玩家ID也从1开始分配,那么合服的时候就等着哭吧,不是随随便便修改A的玩家ID就行的,因为这个ID也可能会在别的表里面存储。

举个例子:

t_faction:存储有玩家ID

t_friend:存储有玩家ID

t_mail: 存储有玩家ID

XXXXX,基本上持久化的ID都有可能在别的表里面存储。

所以每个持久化对象的ID尽量不要使用自增列,如果使用自增列也一定要每个服制定一个独一无二的区间。

我们现在的服务器定死每个服上限注册角色是20万个,超过就不让再注册了。所以就可能给每个服指定一个ID区间,这样合服的时候就不会冲突。

但是我觉得最好的办法是顶一个一个GUID生成规则:

64bit GUID = 32bit时间戳 + 14bit区号 +  6bit类型号 + 12bit自增号

32bit时间戳:这个不解释

14bit区号:一共可以表示16384的区,一个游戏如果能开这么多个区,那就在梦里笑醒吧。

6bit类型号:可以表示64种类型,Player/Npc/Monster/掉落物/子弹等,足够用了

12bit自增号:表示一个时间戳内能够生成的ID个数,2^12 = 4096,如果一秒内生成4096个ID还不够用,那你也等着在梦里笑醒吧。

按照这种生成规则,合服的时候,任何的持久化对象id都不会重复。但是有个缺点是,拿到一个ID,一眼看不出来这个ID表示一个玩家,还是一个npc,或是一个monster?

4、合服工具一定要有服务器开发人员维护

服务器开发人员最整个游戏系统最熟悉,最了解数据库的信息。并且要做好合服工具,把合服中遇到的警告,错误要及时反馈给运维人员。

5、服务器开发人员改动数据库的时候,一定要考虑到合服

首先应该确保自己对数据库的修改能够合服,其次一定不要忘记修改合服工具,之前正是因为我的疏忽,才导致了运维同事的通宵。

时间: 2025-01-11 19:05:06

游戏服务器合服相关的相关文章

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

机缘巧合的机会,我有幸能够从头开始设计一个游戏的服务器.中间遇到很多欢声笑语和悲伤泪水,这里分享一下. 我之前所在项目组的游戏服务器架构如下图: 这款游戏是一款MMO的端游,GateWay网关的任务是接受客户端的连接,然后通过分发策略,把玩家丢进GameSvr上去,之后玩家的所有请求都直接发给GameSvr,由GameSvr处理了.当然这里的分发策略跟一般的web服务器是不同的,web服务器一般会做成无状态的服务器,也就是对于客户端来说请求到达哪一个服务器都没有关系,都能够被处理,但是游戏服务器

游戏服务器框架概括分析

这篇blog题目涉及的范围真大!以至于在这里需要先写一篇前言把范围缩小.选择写这样一个系列的文章,主要是想给工作了两年的自己一个交代,或者说是一个阶段性的总结.两年时间里,房价依然再涨,工资依然跑不赢CPI,某人依然在仰望星空.期间很多梦碎了,很多还在坚持着,生活过得波澜不惊.而我也从刚毕业是的青涩逐步蜕变为"老油条".不知道是一种悲哀.还是一种悲哀.还是一种悲哀....... 庆幸的是梦还在继续,一颗倔强的心还在坚持.希望明天的明天被束缚的心能回到梦开始的地方! ==========

FPS游戏服务器设计的问题 【转】

一.追溯 去gameloft笔试,有一个题目是说: 叫你去设计一个FPS(第一人称射击游戏),你是要用TCP呢还是要用UDP,说明理由 . 二.学习 这是两篇网上找到的文章,写非常不错. 当时笔试的时候自己没想到这么全,但大概想法都是一致的,摘录下来再学习一下. 1.网络游戏程序员须知 UDP vs TCP 作者:[email protected] 首发链接:http://blog.csdn.net/rellikt/archive/2010/08/21/5829020.aspx 这篇教程让我们就

游戏服务器生成全局唯一ID的几种方法

在服务器系统开发时,为了适应数据大并发的请求,我们往往需要对数据进行异步存储,特别是在做分布式系统时,这个时候就不能等待插入数据库返回了取自动id了,而是需要在插入数据库之前生成一个全局的唯一id,使用全局的唯一id,在游戏服务器中,全局唯一的id可以用于将来合服方便,不会出现键冲突.也可以将来在业务增长的情况下,实现分库分表,比如某一个用户的物品要放在同一个分片内,而这个分片段可能是根据用户id的范围值来确定的,比如用户id大于1000小于100000的用户在一个分片内.目前常用的有以下几种:

解决游戏服务器负载上限问题

最近开发一款网络游戏,快到发布阶段,但是服务器的负载上限问题,这个该怎么处理呢? 现在有以下几种方案: 1.排队机制,像wow那样: 2.给当已满服打上一个"满"标记,不让玩家登录当前服,推荐一个新服或空闲服给他: 3.控制玩家注册数,满足当前服所有玩家都能进入游戏,等玩家少了之后再合服: 第1种方案对手游来说,好像不太适用,没有人愿意盯着手机等着: 第2种方案肯定会挨骂,如果玩家好不容易有点空闲时间,来玩玩游戏竟然进不了,装备都在这个服,给他推荐个其他的服,玩家估计分分钟流失: 第3

游戏服务器框架分析

一个大型的网落游戏服务器应该包含几个模块:网络通讯,业务逻辑,数据存储,守护监控(不是必须),其中业务逻辑可能根据具体需要,又划分为好几个子模块. 这里说的模块可以指一个进程,或者一个线程方式存在,本质上就是一些类的封装. 对于服务器的并发性,要么采用单进程多线程,要么采用多进程单线程的方式,说说两种方式的优缺点: 一.单进程多线程的服务器设计模式,只有一个进程,但一个进程包好多个线程: 网络通讯层,业务逻辑,数据存储,分别在独立的线程中,无守护进程. 优点: 1.数据共享和交换方便,使用全局变

合服日志 2015-11-25

电信一服合并至双线二服,改名为碧水云天 合服时间:7:00~9:30 合服工具新加功能: 查看两个服务器中被领取的冲级经验奖励数量,同样50级奖励,哪边被领取的多以哪边数量为主记录. 涉及到的表:tbl_JoyDock, tbl_JoyDock_rbhlv_limit_blimit. 出现问题: 1. 测试发现合服后,角色在不同账号下. 出现原因:测试方法的问题,所有Account的dbid都是运维服务器发过来的.即使合并服务器Account.dbid也不会出现重复的可能.18测试服务器是未开启

java游戏服务器搭建

一.前言 此游戏服务器架构是一个单服的形式,也就是说所有游戏逻辑在一个工程里,没有区分登陆服务器.战斗服务器.世界服务器等.此架构已成功应用在了多款页游服务器 .在此框架中没有实现相关业务逻辑,只有简单的测试用的注册登陆功能. 服务器工程---GameServer 测试客户端---TestClient,模拟客户端与服务器通信,用于测试服务器功能 项目工具 ---Tools,服务器搭建用到的jar包以及相关eclipse插件 二.服务器运行环境 此服务器是基于tomcat启动,所以GameServ

GoWorld – 用Golang写一个分布式可扩展、可热更的游戏服务器

GoWorld代码:https://github.com/xiaonanln/goworld Golang具有运行效率高.内存安全等优良特性,因此是非常适合用来进行服务器开发.使用Golang开发游戏服务器有如下的优点: 运行效率远高于各种脚本语言,大幅度提升服务器承载能力 内存安全,不会像C++服务器那样出现内存错误导致服务器down机 Goroutine能够很好地利用多核计算能力,提升承载能力 Golang本身非常简单好用,大家都喜欢 然而使用Golang编写游戏服务器也面临一定的困难,主要