20万人同时在线的游戏数据库要如何设计

cs_kill_you 2014-08-18 11:16:12
大家好,公司的游戏预计会有20万人同时在线,这样的的数据库要如何设计呢,服务器可以分服,但数据库要如何分库呢。
...全文
2539 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
逍遥的心 2015-08-28
  • 打赏
  • 举报
回复
20W,老老实实分服吧,没什么值得想的,统一鉴权倒是可以。
zilaishuichina 2014-08-27
  • 打赏
  • 举报
回复
引用 10 楼 cs_kill_you 的回复:
COC(部落冲突)游戏是不分服的,人家是怎么做的呢
不分服的, 对于数据库来说, 就是按行拆表,(乃至拆分库) 比如拆4张表,userid%4模是多少,就在哪张表中 玩家登陆之后,已经从帐号数据库中取到了userid了 服务器请求玩家数据的时候, 肯定是要传userid作为查询条件的,比如userid%4 == 1,就select user_table_1 ……;userid%4 == 2,就select user_table_2 …… 压力更大的情况下就可以拆库,放在不同的机器上 比如database1在机器A上,database2在机器B上,database3在机器C上,database4在机器D上 服务器同时connect database1,connect database2,connect database3,connect database4 userid%4 == 1,就向database1去select user_table userid%4 == 2,就向database2去select user_table
难题 2014-08-27
  • 打赏
  • 举报
回复
引用 5 楼 zilaishuichina 的回复:
有些表是不能分库的, 比如账号表, 你分电信一区,网通一区, 但是登陆的时候查的账号表都是同一张表, 你不可能让玩家在电信一区注册一个账号, 到网通一区再注册一个账号。 然后,角色数据表,可能还有公会数据表,拍卖行数据表等等,也就是各区独有的数据,那就是每区一个数据库。 设计起初就是角色数据一张表,一行数据就是一个玩家的数据(字段包括:等级,经验等等这些基础数据,身上的装备(一个blob),背包(一个blob),仓库(一个blob),任务数据(一个blob),好友(一个blob),等等) 然后根据实际需要,比如数据库自身的压力, 那么可能是按行拆分表,比如拆4张表,userid%4模是多少,就在哪张表中 比如服务器的逻辑划分(下面会举例), 不同的数据的更新的频率(这个主要是考虑数据的重要程度,比如玩家的装备是重要数据,更新频率比较高,是不能丢失的数据;而玩家的任务,这个数据如果回档可以丢失,大不了让玩家重新完成一次任务,那么更新频率比较低)。 可能会再按列拆分这张表: 比如拆成,玩家基础数据(攻击防御身上的装备)一张表,玩家背包仓库一张表,玩家好友一张表,等等按照实际需要划分 举几个例子: 玩家登陆之后,进入角色选择画面的时候,你要显示玩家已经创建的角色,同时要显示这个玩家身上的装备,拿在手上的武器,可能这个武器是强化过的,是要发光的,是吧。这个时候你不可能把玩家所有数据全部读出来,只需要读他的基础数据,多少级,身上的装备是什么,就可以了。玩家点进入游戏,才将剩余数据一并读到内存,包括背包啊仓库啊什么的。 再比如,你们拍卖行是一个单独的服务器,因为拍卖行可能会涉及到大量搜索,甚至是汉字的模糊匹配,一般为了不影响正常逻辑的效率,可能会单独拿出来。这个时候,拍卖行这个服务器也是不需要这个玩家的所有数据的,只需要玩家寄售在拍卖行的装备,所以数据库的设计上,玩家寄售在拍卖行的装备就单独拆分出来作为一个表。 再比如,邮件服务器,邮件一般不要求及时,为什么呢,因为邮件数据里面可能包含很多汉字,尽管其实这些汉字一般玩家都不会填的,所以邮件数据包推给客户端的时候,要比普通的移动,攻击包,可能会大很多,这个是从网络的效率来考虑,为了不影响普通的移动、攻击包的网络的收发效率,邮件数据会在这个玩家角色不动的时候,比如站在安全区摆摊的时候才推给客户端。比如wow也就是半小时以内收到,那么逻辑上邮件服务器可能也就是单独的一个服务器,那么显然这个服务器也是不需要这个玩家的所有数据的,那么从数据库的设计上来说,邮件也就是单独一张表就可以了。 诸如此类。
这个不错,可以好好学习
mujiok2003 2014-08-27
  • 打赏
  • 举报
回复
现在本区的数据库中找,找不到的话,向其他数据库广播这个请求。
cs_kill_you 2014-08-27
  • 打赏
  • 举报
回复
COC(部落冲突)游戏是不分服的,人家是怎么做的呢
loong0306 2014-08-20
  • 打赏
  • 举报
回复
引用 5 楼 zilaishuichina 的回复:
有些表是不能分库的, 比如账号表, 你分电信一区,网通一区, 但是登陆的时候查的账号表都是同一张表, 你不可能让玩家在电信一区注册一个账号, 到网通一区再注册一个账号。 然后,角色数据表,可能还有公会数据表,拍卖行数据表等等,也就是各区独有的数据,那就是每区一个数据库。 设计起初就是角色数据一张表,一行数据就是一个玩家的数据(字段包括:等级,经验等等这些基础数据,身上的装备(一个blob),背包(一个blob),仓库(一个blob),任务数据(一个blob),好友(一个blob),等等) 然后根据实际需要,比如数据库自身的压力, 那么可能是按行拆分表,比如拆4张表,userid%4模是多少,就在哪张表中 比如服务器的逻辑划分(下面会举例), 不同的数据的更新的频率(这个主要是考虑数据的重要程度,比如玩家的装备是重要数据,更新频率比较高,是不能丢失的数据;而玩家的任务,这个数据如果回档可以丢失,大不了让玩家重新完成一次任务,那么更新频率比较低)。 可能会再按列拆分这张表: 比如拆成,玩家基础数据(攻击防御身上的装备)一张表,玩家背包仓库一张表,玩家好友一张表,等等按照实际需要划分 举几个例子: 玩家登陆之后,进入角色选择画面的时候,你要显示玩家已经创建的角色,同时要显示这个玩家身上的装备,拿在手上的武器,可能这个武器是强化过的,是要发光的,是吧。这个时候你不可能把玩家所有数据全部读出来,只需要读他的基础数据,多少级,身上的装备是什么,就可以了。玩家点进入游戏,才将剩余数据一并读到内存,包括背包啊仓库啊什么的。 再比如,你们拍卖行是一个单独的服务器,因为拍卖行可能会涉及到大量搜索,甚至是汉字的模糊匹配,一般为了不影响正常逻辑的效率,可能会单独拿出来。这个时候,拍卖行这个服务器也是不需要这个玩家的所有数据的,只需要玩家寄售在拍卖行的装备,所以数据库的设计上,玩家寄售在拍卖行的装备就单独拆分出来作为一个表。 再比如,邮件服务器,邮件一般不要求及时,为什么呢,因为邮件数据里面可能包含很多汉字,尽管其实这些汉字一般玩家都不会填的,所以邮件数据包推给客户端的时候,要比普通的移动,攻击包,可能会大很多,这个是从网络的效率来考虑,为了不影响普通的移动、攻击包的网络的收发效率,邮件数据会在这个玩家角色不动的时候,比如站在安全区摆摊的时候才推给客户端。比如wow也就是半小时以内收到,那么逻辑上邮件服务器可能也就是单独的一个服务器,那么显然这个服务器也是不需要这个玩家的所有数据的,那么从数据库的设计上来说,邮件也就是单独一张表就可以了。 诸如此类。
这个好,学习到了。
zilaishuichina 2014-08-19
  • 打赏
  • 举报
回复
有些表是不能分库的, 比如账号表, 你分电信一区,网通一区, 但是登陆的时候查的账号表都是同一张表, 你不可能让玩家在电信一区注册一个账号, 到网通一区再注册一个账号。 然后,角色数据表,可能还有公会数据表,拍卖行数据表等等,也就是各区独有的数据,那就是每区一个数据库。 设计起初就是角色数据一张表,一行数据就是一个玩家的数据(字段包括:等级,经验等等这些基础数据,身上的装备(一个blob),背包(一个blob),仓库(一个blob),任务数据(一个blob),好友(一个blob),等等) 然后根据实际需要,比如数据库自身的压力, 那么可能是按行拆分表,比如拆4张表,userid%4模是多少,就在哪张表中 比如服务器的逻辑划分(下面会举例), 不同的数据的更新的频率(这个主要是考虑数据的重要程度,比如玩家的装备是重要数据,更新频率比较高,是不能丢失的数据;而玩家的任务,这个数据如果回档可以丢失,大不了让玩家重新完成一次任务,那么更新频率比较低)。 可能会再按列拆分这张表: 比如拆成,玩家基础数据(攻击防御身上的装备)一张表,玩家背包仓库一张表,玩家好友一张表,等等按照实际需要划分 举几个例子: 玩家登陆之后,进入角色选择画面的时候,你要显示玩家已经创建的角色,同时要显示这个玩家身上的装备,拿在手上的武器,可能这个武器是强化过的,是要发光的,是吧。这个时候你不可能把玩家所有数据全部读出来,只需要读他的基础数据,多少级,身上的装备是什么,就可以了。玩家点进入游戏,才将剩余数据一并读到内存,包括背包啊仓库啊什么的。 再比如,你们拍卖行是一个单独的服务器,因为拍卖行可能会涉及到大量搜索,甚至是汉字的模糊匹配,一般为了不影响正常逻辑的效率,可能会单独拿出来。这个时候,拍卖行这个服务器也是不需要这个玩家的所有数据的,只需要玩家寄售在拍卖行的装备,所以数据库的设计上,玩家寄售在拍卖行的装备就单独拆分出来作为一个表。 再比如,邮件服务器,邮件一般不要求及时,为什么呢,因为邮件数据里面可能包含很多汉字,尽管其实这些汉字一般玩家都不会填的,所以邮件数据包推给客户端的时候,要比普通的移动,攻击包,可能会大很多,这个是从网络的效率来考虑,为了不影响普通的移动、攻击包的网络的收发效率,邮件数据会在这个玩家角色不动的时候,比如站在安全区摆摊的时候才推给客户端。比如wow也就是半小时以内收到,那么逻辑上邮件服务器可能也就是单独的一个服务器,那么显然这个服务器也是不需要这个玩家的所有数据的,那么从数据库的设计上来说,邮件也就是单独一张表就可以了。 诸如此类。
alex_my 2014-08-19
  • 打赏
  • 举报
回复
不同服了,还是大部分数据还是不同库吧。 20万人,每人的背包(假设有这玩意)有100个格子,每一个物品(叠加物品算一个)一条记录。 这得多少条记录啊。 还有其它的,宠物什么的。
lx624909677 2014-08-19
  • 打赏
  • 举报
回复
多个服之间共用一个数据库的话,数据管理也很麻烦啊,还是分开的好
sniffer12345 2014-08-19
  • 打赏
  • 举报
回复
引用 6 楼 lovesmiles 的回复:
如楼上,玩家帐号一般由运营商接入,角色帐号才由服务器数据库控制。 20W同时在线,应该很大的并发量了,是要分服了。 如果预计能够做到20W同时在线的游戏应该是很成功的游戏了吧,还会有开发人员在论坛上面问怎么设计数据库? 我对贵公司的这款游戏能否做到20w同时在线表示怀疑。
我也想说点风凉话 20W同时在线,注册用户都得几百万了 你们老板有这心思做这么大的游戏,不如花点钱,找个牛逼的服务器主程来吧 至少数据库设计这种基础性东西,必须慎重啊
cs_kill_you 2014-08-19
  • 打赏
  • 举报
回复
刚做游戏不久,我试了下所有游戏都是一个区一个库的,也没进行数据同步。
woshisange03 2014-08-19
  • 打赏
  • 举报
回复
这么厉害。20W的同时在线。。。。服务器都分服了为什么数据库不能和服务器一起独立开?每个服务器用一个单独的数据库。比如 1W人一个服务器+一个数据库??
冷月清晖 2014-08-19
  • 打赏
  • 举报
回复
建议:属性信息、装备信息等基本变化比较少的建一个库,日志数据,对话数据等实时变化比较频繁的单独建库。为将来的优化打好基础。
勤奋的小游侠 2014-08-19
  • 打赏
  • 举报
回复
如楼上,玩家帐号一般由运营商接入,角色帐号才由服务器数据库控制。 20W同时在线,应该很大的并发量了,是要分服了。 如果预计能够做到20W同时在线的游戏应该是很成功的游戏了吧,还会有开发人员在论坛上面问怎么设计数据库? 我对贵公司的这款游戏能否做到20w同时在线表示怀疑。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧