如何实现手游服务器之分布式数据库
手游服务器开发避免不了会用到数据库,高效合理的数据库设计可以给游戏的存储效率得到大大提高,并能保证数据的可靠和稳定性,游戏设计中服务器可以分布,而数据库如何分布呢,集中式数据库或者分布式数据库在万人在线手游中该如何取舍,这都是需要重点讨论的问题。
一、传统数据库
数据库在游戏开发中非常重要,基于数据库的数据存取有哪些优点呢?
1)数据共享
2)减少数据冗余
3)保证数据的一致性,完整性,安全性
4)支持事务处理
5)并发控制
6)数据独立(逻辑独立,物理独立)
基于以上的优点,在手游开发中一定会用到数据库,因此数据库的设计也是服务器端开发的重点,传统的数据库由层次模型,到网状模型,再到现在普遍使用的关系模型,在各方面都有很大的发展,但是也同样存在的不足之处,很多时候并不能满足我们万人在线的游戏数据库要求。主要表现在以下几点。
1)直接使用缺点
1、数据库结构与外部结构不一致
2、由联接构造的视图不可更新
3、关系系统是基于值的
2)数据类型简单,固定
1、简单类型:整形,实形 ,字串等
2、固定类型集合,不支持ADT和嵌套
3)结构与行为完全分离
1、不支持抽象行为描述
4)阻抗失配
1、sql与通用编程语言的失配
2、编程模式失配
3、类型系统不匹配
集中式数据库的不足使得在开发过程中需要用相应的技术进行改进,如何回避这些不足,考虑到游戏玩家的地域性,小到跨地域市,大到跨国域,对于这样的万人玩家在线的游戏,我们考虑使用分布式数据库进行数据存储。
二、分布式数据库
分布式数据库定义: 物理上分散而逻辑上集中的数据库系统分布式数据库特点:
1)物理分布性
数据不在单个Site上, 按全局需求将数据划分成一定的数据子集, 分散存储在各个Site上
2)逻辑整体性
各个Site上的数据子集, 相互间有严密的约束规则加以限定, 逻辑上是一个整体
3)站点自治性
各个Site上的数据(即LDB)是由本地的DBMS管理,具有自治处理能力
三、分布式数据库举例
某游戏分别在London,NewYork,北京有服务器
游戏玩家数据:Player(PNO,USERNAME,PASSWORD,···)
问题:该玩家数据表数据应该如何存储
大多数情况,玩家数据被其区域的分部门管理,定期的总部门统一访问玩家的数据
上图可以看出,分部数据库在并行执行上有更好的应用,增大了游戏数据的访问效率,因此分布式数据库是要考虑在具有多处理器并可能是自治、异构情况下的数据管理,其中受到影响的内容有: 1)数据组织2)查询处理3)存取结构4)并发控制5)恢复处理等等。
三、分布式数据实现
1、从集中到分布数据的转移首先应该将关键数据的多个副本置于不同站点,提高数据的可用性, 避免“单站点失败”现象并且要考虑高效的数据访问,以及改进数据管理性能,使得可以容易增加应用程序, 用户数目和扩大规模,让数据放在其产生和频繁使用位置, 减少传输,从而提高效率。
数据分布的基本形式有以下基本形式1)复制数据2)重新组织的数据3)子集数据4)分区数据5)对立模式数据6)不相容数据,如下图是各种数据的具体存储形式。
假如游戏分布数据库系统中玩家表存在住部门(MS)站点, 分部门站点(PS)存有部分数据复制,如果MS站点有10000条记录, 每次读2000次, 更新500次,PS站点有1000条记录,每次读1000次, 更新100次,根据不同的配置方法,可以得到如下更新和读取的网络开销大小(如下表)。
操作 | 站点 | |
MS | PC | |
READ | 2000 | 1000 |
UPDATE | 500 | 100 |
配制方法 | 数据分布站点 | 网络开销 | |
MS | PS | ||
1 | Y | N | 1100 |
2 | N | Y | 2500 |
3 | Y | Y | 600 |
通过对以上不同的网络开销的分析我们可以得出,分布式数据的位置取决于逻辑数据和处理(读和更新)模式, 数量等特征。而数据分布是降低整个分布式系统开销的有效措施。
2、分布式数据的访问有远程请求,远程事务,分布式请求,分布式事务
对于远程请求
1)远程请求
只涉及单个远程服务器的单个请求
1 2 3 | Select * From Server1.PartDB.Player Where Server1.PartDB.Player.City = ‘Beijing’ |
2)远程事务
允许一个事务中包含多个应用同一个远程服务器站点的数据访问请求
1 2 3 4 5 6 7 | Begin Work Select * From Server1.PartDB.Player Where Server1.PartDB.Player.City = ‘Beijing’ Update Server1.PartDB.Bag Set closed_ind = ‘Yes’ Commit Work |
3)分布式事务
一个事务包含多个数据请求, 每个请求只能访问单个服务器
1 2 3 4 5 6 | Begin Work Select * From ServerB1.PartDB.Employee Where ServerB1.PartDB.Bag.Weapon=‘sword Select * From ServerM.PartDB.Epl_MD Where ServerM.PartDB.Empl_MED.Skill=‘PP’ Commit Work |
4) 分布式请求
一个事务包含多个数据请求,每个请求都可以引用驻留于多个服务器站点数据
1 2 3 4 5 6 7 8 9 | Begin Work Select * From ServerB1.PartDB.Bag B1, ServerM.BankDB.Epl_MD M Where B1.Epl_ID = M. Epl_ID AND B1. Weapon = ‘sword’ Update Server1.PartDB.Bag Set closed_ind= ‘Yes’ Where Server1.PartDB.Bag = ‘lewis’ Commit Work |
如何实现更加高效的分布式数据库,以配合高效率的游戏,是每个开发者,每个公司都在追求的目标,未来对分布式数据库的应用将会更加广泛。