战场数据库
1. 魔兽世界用的什么数据库
引用自cnblogs@Zealic:
最近几天重温了一下WOW,结合最近学习的数据库知识和自己的了解,对WOW的大概体系做了分析。当然,我仅仅只是窥豹见斑而已,希望对WOW有所了解的大侠能给我和向了解WOW的人指点;让世人更加了解WOW,让中国的游戏能够学习(不是抄袭)并超越WOW。
不知道哪来的想法,就想到了WOW的数据库的结构以及程序实现,那么,就来了解一下吧。
首先想到:Game Server 使用的是什么OS和Database
起初猜测为 : Unix/BSD ,数据库为 Oracle
这样比较适合WOW这样的大型网络游戏,因为其存储和数据量极大
网上查到的一些关键资料,可以证明我的猜想和实际相差不大
1.9C在一次服务器故障中的说明,下面只列出关键部分
08:29 收到EVA存储报警邮件,联系数据中心工程师,联系惠普工程师.
08:35 故障应急流程启动,相关人员包括THE9/HP/Blizzard US .
15:33 Oracle专家加入故障应急流程
15:50 暴雪数据库工程师开始与Oracle专家继续分析故障情况.
17:15 暴雪表示暂时还未从他们的admin以及DBA处获得任何有新的消息,他们仍然在研究此故障。
2.Blizzard的数据库管理员招聘要求
Oracle Database Administrator
The World of Warcraft development team is looking for a self-motivated and knowledgeable IT professional to help administer the WoW databases. As the person responsible for handling the database-side of WoW pushes and patches, our Live Team Oracle DBA's job ties would include designing, configuring, maintaining, monitoring, benchmarking and troubleshooting Oracle databases.
Blizzard offers a fun, creative, and technically challenging environment with excellent compensation and a full range of benefits.
Responsibilities:
Provide proction on-call support.
Maintain and enhance existing databases.
Perform routine database maintenance.
Work with end users to ensure smooth proction rollouts and pushes.
Assist in training other employees.
Requirements:
3+ years professional Oracle DBA experience, including Oracle 9i.
Extensive experience with database performance tuning.
Experience working with large databases (>1TB).
Experience with Oracle RAC and Partitioning features.
Proficiency in Linux/Unix environments including shell scripting.
Plusses:
Strong knowledge of sql & PL/SQL.
Familiarity with UNIX tools and shell scripting
Familiarity with HP EVA's and Data Protector.
Passion for video games, including MMORPG's
因此WOW的服务器应该为 : HPUNIX + ORACLE
那么我就对WOW的数据库做一些猜想,至于正确与否或者符合程度集合,就无从而知了
主要分为以下几块
-游戏服务器:
这里说的是游戏中的服务器,而非上面提到的物理意义上的服务器,比如,七区的恶魔之魂、黑铁、加基森就是游戏服务器。
-游戏区:
游戏大区,一个大区是由许多个游戏服务器构成的。之所以分大区,我认为完全是因为物理原因,每个区都其物理构成应应该是一个服务器群集,而在这群集上,有许多的数据库实例,每一个数据库实例都对应一个游戏服务器。
-验证系统:
游戏中的登录、排队、验证身份应该都是又这一部分完成的。
-聊天频道:
聊天频道是一个独立的服务器,这一点可以从游戏中人物、地图都很卡而聊天却完全不受影响的情况分析出来,聊天不可以离线发送消息,因此我可以武断的认为,聊天服务器基本不操作数据库,至多在当前无法处理或者玩家暂时接收不到的情况下,使用一些临时的表来保存消息;或者服务器将聊天数据全部保存到数据库中,以方便对玩家的行为查询。
另外,聊天服务器是独立于所有服务器的,每个区的所有游戏服务器都是使用对应于该区的聊天服务器。这样,可以专门针对聊天服务器的特性,对服务器的系统和数据库进行专门的优化
-副本&战场:
副本&战场(以下简称副本)我觉得也应该和聊天服务器相同,是个独立的服务器,不过他与普通游戏服务器不同,并没有保存其他的地图数据,仅仅保存了副本地图的数据。
至于如何实现跨服战场,我以为,应该是将需要的角色数据做拷贝到副本服务器中,并且锁定原本服务器中的数据(表或行),在退出战场时,用副本服务器的数据更新原来的数据。我们可以把战场看做数据库中的临时表,做了处理以后更新到需要保存的地方。
通过上述解释,也可以理解为什么在进入战场时需要加载画面了,加载画面并不仅仅是作为一个过渡画面,它还承载了加载客户端资源,与服务端通信进行处理;显示加载画面时,副本服务器应该是如上所说游戏服务器交换了角色数据。
大型副本与普通副本不同的地方,我觉得仅仅是重置时间和副本策略做了改变而已。
-地图
地图的定义是在客户端的资源中的,为防止用户篡改,BLZ对定义地图的资源文件和DBC进行使用了混淆命名以及检查校验;之所以这么认为,是因为中国WOW公测的时候,出现一些加速外挂,可以让角色直接穿越墙壁、地表等看起来不可能穿越的物体,这便验证了BLZ为了减轻服务器负担,直接在客户端进行了大部分的碰撞检测。
WOW的的实际地图结构和游戏中我们所见到的不一样,他是把一块大陆分成N个小块的地图数据,客户端仅仅需要加载玩家角色所在位置附近的所有地图块就可以了。其技术细节就不做详细分析了。
-东西大陆:
每个大陆都应该是一个独立的数据库,之所以出现加载画面,我认为是因为两个大陆的地形材质大不相同,客户端需要先释放出发大陆的所有资源,加载目的大陆的必要资源,同时转移角色的数据到目的大陆。
-角色:
游戏中的角色应该是被分离成数个表,包括玩家的属性,任务,包裹,邮箱,银行等。一些重要的,比如物品包裹、邮箱、银行,服务器会在很短(相对其他数据而言)的时间内将内存中的缓存数据写入提交到数据库中;而一些相较以上数据不是很重要的数据,则需要很长时间才会提交到数据库。这也解释了为什么服务器回档时,角色的位置和任务等都回档了,而物品却没有回档,这也造成了传说中的双手痛击。
-怪物:
世界中的怪物生成应该是使用了Prototype模式,那么保存怪物的数据其实之需要保存其会变化的值就即可。
-其他:
游戏中总是有一些事件发生,比如:暗月马戏团的来访,万圣节的活动,情人节的活动等等,这些东西应该都是具有伸缩性的,可以想象,为了方便BLZ自WOW的管理和扩展,在服务器或服务器群集管理中心中,应该有BLZ为自己和代理商提供的工具或者说脚本使用指南。至于WOW采用的脚本是什么,这个我就猜不到了,可能是Perl\Python\SH吧,反正不会是LUA。
-行为与技能:
为什么WOW玩起来感觉这么流畅,没有其他网络游戏看起来或感觉起来反应迟钝,WOW并没有每时每刻都与客户端进行通信;其主要工作原理是,客户端首先处理用户的输入,并执行相应的开始动画或处理,而实际显示结果要等待服务端处理并返回后才会显现出来,这就是为什么在掉线后,玩家还做操作角色,但是却无法获得操作结果。
技能和行为差不多,其实很多游戏中的限制都是在客户端进行的,这都是BLZ为了减轻服务端的负担、减少通信量而造成的。那么,我在这里大胆的猜测,只要分析出内存地址或相应代码,WOW是有很多地方可以被篡改的;因为据我所知,目前WOW的所有外挂都是通过暴力修改客户端的内存实现的,而非常见的修改网络封包,BLZ加密还是做的很不错的 :)。
基本上就分析了这么多了,我试图从自己的脑子里挖出更多的东西,可惜所了解的东西仍然太少,没办法,现这样吧。
----------------------------------------------
PS:大芒果单机版WOW采用的MySQL
2. 数据库索引有什么作用和好处
数据库索引是为了增加查询速度而对表字段附加的一种标识。见过很多人机械的理解索引的概念,认为增加索引只有好处没有坏处。这里想把之前的索引学习笔记总结一下:
首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。那么在任何时候都应该加索引么?这里有几个反例:1、如果每次都需要取到所有表记录,无论如何都必须进行全表扫描了,那么是否加索引也没有意义了。2、对非唯一的字段,例如“性别”这种大量重复值的字段,增加索引也没有什么意义。3、对于记录比较少的表,增加索引不会带来速度的优化反而浪费了存储空间,因为索引是需要存储空间的,而且有个致命缺点是对于update/insert/delete的每次执行,字段的索引都必须重新计算更新。
那么在什么时候适合加上索引呢?我们看一个Mysql手册中举的例子,这里有一条sql语句:
SELECT
c.companyID,
c.companyName
FROM
Companies
c,
User
u
WHERE
c.companyID
=
u.fk_companyID
AND
c.numEmployees
>=
0
AND
c.companyName
LIKE
'%i%'
AND
u.groupID
IN
(SELECT
g.groupID
FROM
Groups
g
WHERE
g.groupLabel
=
'Executive')
这条语句涉及3个表的联接,并且包括了许多搜索条件比如大小比较,Like匹配等。在没有索引的情况下Mysql需要执行的扫描行数是77721876行。而我们通过在companyID和groupLabel两个字段上加上索引之后,扫描的行数只需要134行。在Mysql中可以通过Explain
Select来查看扫描次数。可以看出来在这种联表和复杂搜索条件的情况下,索引带来的性能提升远比它所占据的磁盘空间要重要得多。
那么索引是如何实现的呢?大多数DB厂商实现索引都是基于一种数据结构——B树。因为B树的特点就是适合在磁盘等直接存储设备上组织动态查找表。B树的定义是这样的:一棵m(m>=3)阶的B树是满足下列条件的m叉树:
1、每个结点包括如下作用域(j,
p0,
k1,
p1,
k2,
p2,
...
ki,
pi)
其中j是关键字个数,p是孩子指针
2、所有叶子结点在同一层上,层数等于树高h
3、每个非根结点包含的关键字个数满足[m/2-1]<=j<=m-1
4、若树非空,则根至少有1个关键字,若根非叶子,则至少有2棵子树,至多有m棵子树
看一个B树的例子,针对26个英文字母的B树可以这样构造:
可以看到在这棵B树搜索英文字母复杂度只为o(m),在数据量比较大的情况下,这样的结构可以大大增加查询速度。然而有另外一种数据结构查询的虚度比B树更快——散列表。Hash表的定义是这样的:设所有可能出现的关键字集合为u,实际发生存储的关键字记为k,而|k|比|u|小很多。散列方法是通过散列函数h将u映射到表T[0,m-1]的下标上,这样u中的关键字为变量,以h为函数运算结果即为相应结点的存储地址。从而达到可以在o(1)的时间内完成查找。
然而散列表有一个缺陷,那就是散列冲突,即两个关键字通过散列函数计算出了相同的结果。设m和n分别表示散列表的长度和填满的结点数,n/m为散列表的填装因子,因子越大,表示散列冲突的机会越大。
因为有这样的缺陷,所以数据库不会使用散列表来做为索引的默认实现,Mysql宣称会根据执行查询格式尝试将基于磁盘的B树索引转变为和合适的散列索引以追求进一步提高搜索速度。我想其它数据库厂商也会有类似的策略,毕竟在数据库战场上,搜索速度和管理安全一样是非常重要的竞争点。
3. mangos数据库如何升级
这个东西整理了很久了,结构大同小异,部分汉化说明也有前人做过,不能算原创,只能说站在巨人的肩膀上,貌似3.13更新了一些地方,但是国外还没有对于跟新的部分进行说明,同时也废除了一些结构设置,附上部分作废的结构说明,以备大家使用。其次是GM把我的一个没有满80的小号删掉了,辛苦积攒的1W金币一下子就没有了,分个装备也挺费劲,时间也不多,还是搞点研究跟大家分享算了,一切过眼云烟……
MANGOS数据库表格含义
角色数据库:characters
==================================================
account_data 特征帐户
arena_team 竞技场队伍信息
arena_team_member 竞技场队伍成员
arena_team_stats 竞技点数统计
auctionhouse 拍卖行(参数--观看时所对应)
battleground_template 战场竞技场基本配置
bugreport 给GM发信所对应的数据
character_achievement
character_achievement_progress
character_action 创建的人物所会的技能对应playercreateinfo_action(仅出生)
character_aura 角色的 BUF 效果
character_homebind 创建人物的炉石回城所绑定的地点(或出生地点)
character_instance 角色玩家副本信息
character_inventory 创建人物身上和背包内的道具
character_kill 角色的荣誉信息(杀或被杀,有无荣誉等)(TYPE=1 获得,2=损失)
character_pet 创建人物的宠物信息
character_pet_declinedname
character_queststatus 创建人物的任务信息
character_reputation 创建人物的阵营声望
character_social 好友列表
character_spell 人物的技能列表(仅会魔法的人才会出现ID)
character_spell_cooldown 人物技能的冷却时间
character_ticket 角色传送点信息
character_tutorial 角色补习,讲解信息(例如游戏里的帮助内容和上线的一些提示信息)
character 创建的人物资料对应playercreateinfo
corpse 角色死亡后尸体相关的信息(这里有对应记录时角色即为死亡状态,包括尸体对应的墓地信息等,官服此表每星期清一次)
group_instance
group_member 队伍成员(登陆132错误多为不同阵营间组队造成,清除玩家的队伍就可以了)
groups 组队,团队信息
guild 工会信息
guild_bank_eventlog 工会银行事件记录
guild_bank_item 工会银行的物品
guild_bank_right 工会银行使用等级
guild_bank_tab 工会银行的存放槽
guild_eventlog 工会事件记录
guild_member 工会成员
guild_rank 工会的阶级划分记录信息
instance 副本记录(临时表)记录玩家开启的副本并对重置时间进行计时
instance_template FB信息(包括地图、要求进入的等级、人数上限、重置时间)
item_enchantment_template 道具的魔法模版
item_instance 物品信息
instance_reset 重新设定信息
item_template 道具及任务道具的详细信息
item_loot_template 道具掉落表
item_text 道具说明(item_template相关字段)
mail 邮件系统
mail_items 邮寄道具
pet_aura 宠物光环模型
pet_spell 宠物学的技能
pet_spell_cooldown 宠物技能的冷却时间
petition 已被召唤的宠物,对应角色GUID
petition_sign 宠物归属哪个角色标志
saved_variables 不定时保存信息
主数据库:mangos
=============================================
achievement_reward 添加巫妖王的奖励成就
areatrigger_involvedrelation 传送(区域触发)_包含的任务关系
areatrigger_scripts 区域触发脚本
areatrigger_tavern 进传送门id指向areatrigger_teleport----OK触发
areatrigger_teleport
areatrigger_template 传送区域的具体坐标(与travern所对应)
battleground_template 战场竞技场基本配置
battlemaster_entry 战场管理NPC分管的战场(NPC的entry对应战场的ID)
command GM命令
creature 地图刷怪配置
creature_addon 生物刷怪补充(即根据GUID的不同一个生物通过此表可定义为不同属性的)
creature_equip_template 生物身上的装备模板库(creature_template调用这里的内容,如用什么武器和盾等)
creature_involvedrelation NPC或怪物(特殊类)参与的任务关系,所涉及的关系
creature_loot_template 生物的掉率
creature_model_info 生物模型信息库(creature_template调用这里的内容)
creature_movement 怪物或NPC移动的关系,活动范围
creature_onkill_reputation 生物被杀声誉配置
creature_questrelation 怪物触发的任务关系
creature_respawn 生物再生(临时表)针对creature里的生物时间被杀死后进行记录。
creature_template 怪物或NPC的具体信息如HP,SP等
creature_template_addon 怪物或NPC的具体信息补充(即相同的生物可以设置不同的属性)
db_script_string 数据库脚本处理
db_version 数据库版本说明
disenchant_loot_template 附魔合成出产物品表
event_scripts 事件脚本
exploration_basexp 等级和基本经验配置
fishing_loot_template 钓鱼出的爆率配置
game_event 游戏事件,定时触发
game_event_creature 游戏事件由生物触发
game_event_creature_quest 由生物来处理的游戏事件内的任务和问题
game_event_gameobject 游戏事件由对象触发
game_event_model_equip 游戏事件中发重变动的模型装备配置
game_event_pool 游戏共用事件
game_graveyard_zone 地图区域连接墓地配置
game_tele 游戏不同区域的广播视频信息
game_weather 天气系统(可以为不同的区域配置不同的天气变化)
gameobject 世界刷对象配置物品信息(地上的箱子,草,矿)仅刷新点,时间,位置
gameobject_involvedrelation 对象参与的任务关系,所涉及的关系
gameobject_loot_template 对象爆率,地上的箱子、矿石、花草
gameobject_questrelation 对象触发的任务关系
gameobject_respawn 对象再生(临时表)(如gameobject刷出的对象箱子等在被打开后这里就开始计时)
gameobject_scripts 对象脚本
gameobject_template 对象具体信息配置,如草,矿等
instance_template 副本配置(等级、团队限止和副本AI脚本控制等)
item_enchantment_template 附魔产品配置
item_loot_template 包里的箱子之类爆率
item_template 道具及任务物品的详细信息
locales_achievement_reward 完成给予的奖励
locales_creature 生物名七国语言支持
locales_gameobject 世界对象七国语言支持
locales_item 物品名称七国语言支持
locales_npc_option NPC的选择
locales_npc_text NPC对话七国语言支持
locales_page_text 其它对话七国语言支持
locales_points_of_interest
locales_quest 任务对话七国语言支持
mangos_string 系统提示信息自定义表
milling_loot_template 最小掉落模版
npc_gossip NPC对话索引,没事说的话,如有些副本人物一进入就可以看到BOSS遇到你说的话
npc_gossip_textid 话的内容对应NPC_gossip
npc_option 共50条记录,NPC的类型
npc_text 跟NPC说话的内容,不同于任务内容,此内容大多是通过AI实现调用
npc_trainer 训练师所对应的内容(学习技能要求的等级, 金钱, 前置技能等)
npc_vendor 卖东西的NPC所对应的商品配置
page_text 对话提示内容不同于任务
pet_levelstats 宠物等级初始定义
pet_name_generation 宠物名称替换定义
petcreateinfo_spell 宠物法术信息
pickpocketing_loot_template 盗贼偷窃爆率(可以得到的物品配置)
player_classlevelstats 人物升级基础加成倍(血、魔法……)
player_levelstats 出生等级
player_xp_for_level 玩家升级所需得升级经验
playercreateinfo 人物出生的信息,根据种族配置出生时所在的地图坐标等
playercreateinfo_action 出生时快捷键的技能图标
playercreateinfo_item 出生时身上道具
points_of_interest
pool_creature 所有池塘中游戏事件的情况
pool_gameobject 生物的GUID
pool_pool
pool_template 池塘生物模版
prospecting_loot_template 采矿爆率
quest_end_scripts 任务结束脚本(例如完成风剑任务召唤桑德兰王子就是调用这里)
quest_mail_loot_template
quest_start_scripts 任务开始脚本(按任务时触发的剧情配置)
quest_template 任务的详细信息(可接范围等)对应QUESTID可能跟object_involvedrelation有关系
reference_loot_template 掉落参考模版
reserved_name 保留名称为不可被其它用户所注册
skill_discovery_template 技能规定必要条件要求模板(处理某些技能,规定发现的机会大小)
skill_extra_item_template 道具额外奖励技能模版
skill_fishing_base_level 钓鱼基础的登记
skinning_loot_template 剥皮爆率
spell_affect 法术触发技能或效果处理
spell_area 法术范围
spell_chain 法术的链接处理(设置某一法术的前置技能和顺序等)
spell_elixir 炼金技能
spell_learn_spell 可以学习的法术
spell_proc_event 法术的过程事件
spell_script_target
spell_scripts 法术脚本
spell_target_position 远程传送,产生法术结果通过SPELL_EFFECT_TELEPORT_UNITS协调
spell_threat 给予或者取消所有法术拥有的威胁值
transports 运输配置
登录控制数据库:realmd
=============================================================
account 账号具体ID等信息
account_banned 被禁止的账号
autobroadcast 自动公告表
creature 地图刷怪配置
db_version 登录控制数据库的版本和所支持客户端的标识
ip_banned 被禁止的IP
localization 语言环境设置
realmcharacters 登录器角色所登录的服务器主数据库信息(即为一个登录数据库对应多个主控制器时分配标识)
realmd_db_version
realmlist 登录控制器列表(设置对外开放的登录IP和端口号等)
uptime SERVER正常运行的时间
更新废弃
spell_bonus_data 法术加成数据库
spell_disabled 禁用技能
spell_pet_auras 宠物技能模版
spell_script_target 法术脚本目标(技能图腾,type=0对应世界对象ID或type=1对应生物ID,或type=2为必须死亡的生物(被人或NPC杀死的))
playercreateinfo_reputation 出生时各个派别的声望
playercreateinfo_skill 出生时所会的技能
playercreateinfo_spell 出生时所会的法术(同上,数据表内容很像,但有出入,法术和技能是两个不同的概念)
player_levelstats 初始人物等级配置定义
pet_levelstats 宠物的等级信息(规定的几个宠物 如 SS 的小鬼 虚空等)
pet_name_generation 宠物名称的产生,对应与规定的宠物
petcreateinfo_spell creature表中能作为宠物的怪物技能列表
spell_learn_skill 可以学习的技能
spell_proc_event 法术的过程事件
spell_teleport 法术传送(和areatrigger_teleport传送门基本一样)
spell_threat 法术的威胁(仇恨)
button_scripts 鼠标右键按钮触发的脚本配置(如开箱子或开门等而触发剧情控制)
uptime 系统运行时间记录
taxi_node WOW的飞机系统(具体不明)
taxi_path 飞到哪的价格什么的吧(不明)
taxi_pathnode 飞机的完整表(对应taxi_NODE taxi_path)
game_talent 游戏的天赋系统
game_graveyard 人物死亡后所回到的墓地(复活需要对应game_corpse表)
game_spell 魔法(参数有可以创造什么,比如FS做水)
gameobject_grid 可以拿取的有效距离(不明)
item_trainer 传送宝石技能师
item_vendor 传送宝石商店
npc_SpiritHealer 灵魂医者表
petcreateinfo_spell 宠物法术初始定义
zone_coordinate 地区id,地区名字缩写,例: Orgrimmar => Orgi