MMOG Server DataBase 设计.docx
- 文档编号:26192610
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:15
- 大小:77.57KB
MMOG Server DataBase 设计.docx
《MMOG Server DataBase 设计.docx》由会员分享,可在线阅读,更多相关《MMOG Server DataBase 设计.docx(15页珍藏版)》请在冰豆网上搜索。
MMOGServerDataBase设计
MMOGSERVERDatabase设计
Version0.1
Createdbywillim
Lastmodified2003-11-30
深圳市腾讯计算机系统有限公司
版权所有不得复制
一、AccountBillingDatabase3
1、在线帐号信息列表3
2、LOGIN请求4
3、实时计费5
4、在线充值5
5、维护上的考虑5
6、小结5
二、WorldDatabase6
1、读取角色数据7
2、角色数据的同步7
3、在线角色信息7
4、有顺序要求的数据操作7
5、小结8
三、实时数据库备份8
四、数据库表结构8
1.AccountBillingDatabase8
2.WorldDatabase9
五、数据结构10
1.在线帐号信息10
2.在线帐号列表11
3.在线角色信息11
本文基于kenny的《TencentMMOGserver概要设计》(以下简称“概要设计”),是MMOG数据库部分的概要设计,主要描述与数据库操作相关的部分细节。
如前文所述,由若干个分布式的AccountBillingDatabase实体组成一个BillingDatabaseCluster,负责保存一个游戏大区与计费相关的用户的帐号信息,而每一个World都有若干个WorldDatabase来保存这个World的角色属性数据。
一、AccountBillingDatabase
1、在线帐号信息列表
在clusterloginserver所在机器的共享内存中,将以结构数组的方式保留最近的活跃帐号的信息,以便进行用户唯一性检查和后续的统计。
在线帐号信息列表中一个帐号信息包含(Uin、计费方式、可用点数/时间、该帐号的登陆时间、当前登陆的角色名、所在的world)。
在线帐号信息列表是一个按照Uin(QQ号码)进行HASH的链表。
预先定义一个游戏大区能支持的(最大同时在线人数*2)数组。
在用户登陆时,将他的帐号信息更新到相应的在线帐号信息列表的节点上,如果发生碰撞,则追加在此节点之后(需要先根据Uin检查是否已存在相同的记录),在内存中的表现如下:
注:
这种数据结构,如果HASH之后的碰撞概率越大,则查找某一帐号是否已存在所需要的时间就越长,如果以支持同时在线50万计算,有3亿个QQ号码,则极端情况下需要3亿/100万=300次。
所以,后续需要继续改进,可以参考的方法有:
Ø参考qqgame的相关设计
Ø使用临时数据库表来保存当前在线的帐号信息
Ø将HASH链表分成多片,对应于不同号码段的QQ号,减少碰撞
玩家选择完world和角色,进入world之后,worldloginserver将向Clusterloginserver发送消息(Uin、当前登陆的角色名、所在的world),由后者维护在线帐号信息表中该帐号的信息。
在帐号LOGOUT时,需要回收节点或进行初始化。
2、LOGIN请求
说明:
ØAccountBillingDatabase是一个按照Uin(QQ号码)进行hash拆分后的分布式的数据库,每一个帐号数据表,将有一个单独的进程(或线程)与之关联,进行数据库操作。
ØClusterloginserver主进程将不同的Uin,通过FIFO的方式发送给不同的数据库操作进程(线程),由后者进行实际的数据库操作。
考虑到后续的扩展性,它们之间也可以是SOCKET的通信方式
ØClusterloginserver主进程获得该帐号的信息后,如果已达到最大的在线人数,则返回失败,否则通过hash直接寻址,追加到相应的节点之后
Ø合法性的判断包含:
在一个游戏大区的LOGIN唯一性,剩余点数(时间),数字签名的有效性等。
如果帐号已经登陆游戏,则返回已经登陆的信息
Ø如果验证成功,返回的信息包含(Uin、计费方式、可用点数/时间,是否已经登陆)
3、实时计费
目前主要有以下的计费方式:
1)点数(时间)计费
2)包月计费
3)后付费:
需要与其它ISP合作共同制订计费的协议和开发相关的接口,暂不实现
计费由worldloginserver来控制,角色LOGOUT时,worldloginserver将用户的消费时间发给Clusterloginserver,通知后者更改数据库中相应的记录,并将内存中结构数组该节点释放或重新初始化。
4、在线充值
当玩家进入游戏后,如果通过充值系统进行充值,Clusterloginserver更改数据库中的该帐号的可用点数或到期时间后,向该帐号的角色所在world发送充值消息,由worldloginserver来更改该帐号在内存中的可用点数或到期时间。
5、维护上的考虑
在将帐号信息表分离时,如果采取复杂的hash算法,不如仅根据Uin号码段,方便后续的维护。
下面的角色属性数据表的分离与此相同。
6、小结
Clusterloginserver需要完成的功能:
Ø查询并返回某Uin的信息
Ø帐号LOGIN时的合法性检查
Ø维护共享内存中的在线帐号信息表
Ø实时计费
Ø在线充值的接口
二、WorldDatabase
在一个World的角色数据,根据Uin(QQ号)先进行hash,是保存在若干个不同的数据库表中的,而每一个角色数据库表,都有一独立的进程与之对应,对该表的数据进行操作。
在由前端主进程分配任务时,采取同样的hash算法,保证同一角色的数据始终由同一个进程处理。
角色数据有角色的基本属性数据(如技能、级别、经验值、身上装备和所属行会名等)和辅助数据(如行会信息,保险箱信息和好友信息)两类,基本属性数据的更改频率远高于辅助属性数据,故在WorldDatabase系统中,将它们分开,以提高处理的效率。
进程之间的逻辑图如下所示:
说明:
Ø前端主进程接收worldloginserver的请求后,先根据不同的Uin和请求,将任务分配给N个具体的数据库操作进程和其它的服务进程
Ø前端主进程需要维护活跃角色信息表,该结构数组包含了当前的在线角色信息(Uin、角色名、所在world),以便角色转移到其它world时进行消息的转发
Ø如果角色辅助数据库中的好友数据库表、保险箱记录太多,也可以采取与角色基本数据根据Uin进行hash分表的方法,将其分离
1、读取角色数据
角色LOGIN时,worldloginserver向前端主进程发送请求,由后者读取并返回该角色的基本属性数据(如技能、级别、经验值、身上装备和所属行会名等)和部分的辅助数据:
Ø保险箱:
为减少数据流量和玩家的等待,只需要返回该角色所拥有的保险箱名,而不需要立即返回保险箱中的具体内容。
当角色选择打开某个保险箱时,才返回保险箱中的具体物品信息。
Ø好友系统:
如果好友系统直接使用QQ的好友,则存在和QQSERVER之间存在SOCKET通信机制,以便获得好友信息。
Ø行会:
在worldloginserver启动时,将向前端主进程发送读取行会信息的请求。
以后由worldloginserver维护内存中的行会信息的变化,并通知前端主进程更新数据库,进行同步。
2、角色数据的同步
由于当前的活跃角色数据是worldloginserver在其内存中进行管理的,WorldDatabase仅当以下情况时,才更新数据库中实际的数据:
Ø在角色LOGOUT时,worldloginserver向前端主进程发送更新该角色的属性数据请求
Ø系统运行期间,为了减少角色数据的丢失,每隔N分钟,worldloginserver也向前端主进程发送更新所有在线角色的当前属性数据
3、在线角色信息
在线角色信息包含(Uin,角色名,所在world)。
在角色从一个world转移到另一个world时,需要及时更新所在world信息,以便zoneserver的消息转发。
前端主进程在启动时,在共享内存中预先分配一个大小为(一个World所支持的同时在线人数*2)的空间。
在获取角色数据后,根据对Uin的hash,找到一个可用的节点保存该角色的在线信息,如果hash冲突,ID加1再hash。
在角色LOGOUT时,需要回收该角色数据所占用的节点。
4、有顺序要求的数据操作
涉及到不同角色的某些动作,如角色之间的交易,是有操作的顺序性要求的,而不同的角色数据,可能由多个进程进行操作。
为了保证数据的一致性,在由前端主进程进行任务分配时,必须等待前面的数据操作返回才能进行后续的任务分配操作。
5、小结
与WorldDatabase相配套,需要完成以下的功能:
Ø前端主进程:
⏹根据Uin和请求类型,分配worldloginserver发送过来的请求,并返回结果
⏹维护在线角色信息结构数组
Ø角色基本属性数据库操作进程:
⏹查询角色的基本信息并返回结果
Ø辅助数据库操作进程:
⏹查询行会、保险箱等辅助信息并返回结果
三、实时数据库备份
AccountBillingDatabase和WorldDatabase都采用Mysql的DataReplication技术,对其进行“准实时”的备份,在同一时间内存在2份几乎一样的数据库,尽量减少由于硬件故障所造成的影响:
此外,从容灾及数据恢复的角度考虑,还需要定期的数据备份,将某一时刻的生产数据库的snapshot以文件的方式DUMP出来,备份到其它的机器上,至少保留1周~1月的历史数据。
四、数据库表结构
1.AccountBillingDatabase
1)帐号信息表tbAccount
字段名
类型
属性
说明
lUin
bigint
NOTNULLdefault,PRIMARYKEY
QQ号码
cState
char
(1)
default'0'
帐号状态:
可用与否
dtExpire
datetime
default'0000-00-0000:
00:
00'
到期时间,仅当是包月方式的用户时有效
iTimeAmount
bigint
default'0'
可用的剩余点数/时间
dtLastLogin
datetime
default'0000-00-0000:
00:
00'
最后的登陆时间
dtBlock
datetime
default'0000-00-0000:
00:
00'
如果不为空则是停权时间
2.WorldDatabase
1)角色基本属性数据tbRole
字段名
类型
属性
说明
vRoleName
varchar(32)
NOTNULLdefault'',PRIMARYKEY
角色别名
lUin
bigint
NOTNULLdefault'0',INDEX
该角色所属的Uin
cPermission
char
(1)
default'0'
该角色的属性:
管理员/普通角色
cSex
char
(1)
default'0'
该角色的性别
cFace
char
(1)
default'0'
该角色的脸型
cHair
char
(1)
default'0'
该角色的发型
cProfession
char
(1)
default'0'
该角色的职业
dtBirth
datetime
default'0000-00-0000:
00:
00'
该角色的创造时间
dtLastSave
datetime
default'0000-00-0000:
00:
00'
该角色的基本数据最后一次被系统保留时间
vClan
varchar(32)
default''
该角色所属的行会名
cClanTitle
char
(1)
default'0'
该角色在行会的职位
iMap
int(3)
default'0'
该角色目前所在地图的编号
iPositionX
int(9)
该角色目前所处的X坐标
iPositionY
int(9)
该角色目前所处的Y坐标
iPositionZ
int(9)
该角色目前所处的Z坐标
iStrength
int(6)
力量
iDexterity
int(6)
精神
iVigor
int(6)
敏捷
iHealth
int(6)
体力
iLevel
int(3)
级别
lExperience
bigint
经验值
bWornItem
blob
身上的装备
bPackage
blob
身上背包的物品
bQuest
blob
任务列表
cMode
char
(1)
该角色是否可见
cStatus
char
(1)
该角色的状态:
正常/删除/停权
本表仅包含了角色的一些基本属性,后续视乎游戏的设计再增加字段。
2)行会tbClan
字段名
类型
属性
说明
vClanName
varchar(32)
NOTNULLdefault'',PRIMARYKEY
行会名
dtBirth
datetime
default'0000-00-0000:
00:
00'
行会创建时间
vCreator
varchar(32)
NOTNULLdefault'',
行会建立者
vEnemy
varchar(255)
敌对行会名列表
dtLastSave
datetime
default'0000-00-0000:
00:
00'
上次保存数据的时间
iTotalMember
int(6)
该行会当前的成员数目
cStatus
char
(1)
default‘0’
该行会的状态:
正常/删除
3)保险箱tbStash
字段名
类型
属性
说明
iStashNo
serial
PRIMARYKEY
保险箱的唯一编号
vStashName
varchar(32)
NOTNULLdefault''
保险箱名称
vOwner
varchar(32)
NOTNULLdefault'',INDEX
保险箱拥有者
bMoney
bigint
金钱
bItem
blob
物品
vBuddies
varchar(255)
共享给好友的列表
vClan
varchar(32)
NOTNULLdefault'',INDEX
行会的保险箱
dtCreatedTime
datetime
default'0000-00-0000:
00:
00'
保险箱创建日期
4)好友列表tbBuddy
好友系统如果使用QQ好友,则不需要另设。
五、数据结构
1.在线帐号信息
structAccount{
INT64lUin;
charcChargeType;
INT64lRemaindTime;
INT64lLoginTime;
charszRoleName[32+1];
INT32iWorld;
structAccount*pPrior;
structAccount*pNext;
}stAccount;
2.在线帐号列表
structAccountList{
structAccount*pHead;
structAccount*pTail;
INT32iTotalAccount;
}*pAccountList;
3.在线角色信息
typedefstruct{
INT64lUin;
charszRoleName[32+1];
INT32iCurrentWorld;
}Role;
RoleRoleList[MAX_ROLE_NUMBER*2];
4、worldloginserver与clusterloginserver之间的通信包
以下只是worldloginserver和clusterloginserver之间通信包的包体内容,不包含包头与附加信息:
1)worldloginserver发送给clusterloginserver的LOGIN请求
typedefstructLoginRequest{
INT64lUin;
INT64lLoginAddress;
INT64lLoginTime;
CharszMAC[64+1];//签名
}
2)Clusterloginserver返回LOGIN帐号信息给worldloginserver
typedefstructLoginResponse{
INT64lUin;
charcChargeType;
INT64lRemaindTime;
INT32iFirstLoginOrNot;//已经登陆?
}
3)Worldloginserver在角色进入world之后的登陆数据
typedefstructRoleLogin{
INT64lUin;
charszRoleName[32+1];
INT32iCurrentWorld;
}
4)Worldloginserver发送更改角色基本属性数据的数据包
typedefstructRoleBasicCharacter{
INT32iOperationType;//操作类型:
增加/修改/删除
charszRoleName[32+1];
INT64lUin;
、、、//与tbRole的字段相对应
}
5)Worldloginserver发送更改保险箱的数据包
typedefstructRoleAuxCharacter{
INT32iOperationType;//操作类型:
增加/修改/删除
charszRoleName[32+1];
、、、//与tbStash的字段相对应
}
6)Worldloginserver发送更改行会的数据包
typedefstructClan{
INT32iOperationType;//操作类型:
增加/修改/删除
charszClanName[32+1];
、、、//与tbClan的字段相对应
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MMOG Server DataBase 设计