MMO网络游戏服务器中mysql数据库访问的性能优化探讨

时间:2022-06-20 06:37:11
昨日qq上,和一些做mmo大型网络游戏服务器端的人讨论了一些mysql数据库访问的问题,因为我本人没有实际开发大型网游的经验,所以他们说的我也理解的不深,我还是努力理解,但还是觉得他们所谈的好象并不是那么一回事;

mysql数据库的访问一般就通过他提供的c api接口访问就可以了,网络游戏服务器端事先和mysql建立并保持1个或者几个连接,正常情况下这些连接将一直保持;

为提高性能,网络游戏服务器程序启动后一般都会把事先需要的数据从数据库提取到内存供使用,以减少读数据库的频率,这到好理解;

当然,网游开发中,遇到需要立即写库或者更新库的内容时,我们会立即向数据库服务器发送insert,delete,update等以期望数据库能立即更新我们的数据,比如玩家切换到新地图,这种数据就有必要立即提交到数据库;

但同时,有些有实践经验的网游服务器开发者也重点提出了提高开发mysql服务器程序效率的做法,用他的话说就是所谓的:
(1)“写到数据服务(这个数据服务器似乎就是他自己程序中缓存,用来缓存一些所要提交的数据)中,并不直接写库,因为数据库不是你想象的那么高效”
(2)业务服务实时写数据库,数据服务定时存盘 比如5分钟保存一次;

在这里业务服务实时写数据库到也好理解,就是将必要的东西理解写入,但“数据服务定时存盘”的意思就是对于一些不是特别紧急的数据库语句,每5分钟向数据库写一次;

我所疑惑的是:
(1)在网络游戏中什么样的数据算是数据服务,比如玩家拾取了一把武器,我需要insert该武器数据到玩家对应的武器表,但按照这个说法,就是我不立即insert,而是攒一攒,到5分钟后才提交一次;

(2)这种数据服务定时存盘 比如5分钟保存一次的做法真的能提高数据库的效率吗?因为对于写数据库(insert,delete,update)我通常都是直接执行mysql c++ api"mysql_query"立即提交,我这种做法难道确实是很影响效率,是一个很失败的做法吗?(因为该人说我这种在业务进程中直接写库的做法有问题,数据库若不堪压力会崩掉)
那么5分钟提交一次的做法有什么明显的好处,能否举个例子告诉我哪些数据可以5分钟提交一次呢?

请各位帮忙解释和指导,谢谢!


12 个解决方案

#1


数据服务即:
数据服务中心,它负责所有数据统一管理,提供实时的数据读写,多服务器环境下数据服务中心的处理能力,直接关系到整个集群系统的性能.所有的关键数据库访问都它包装,一般对内存需求和很大,因为有大量数据要在内存缓存.

#2


一般都会有Session服务器的,相当于一个内存数据库
而DB是用来持久化数据的,第二次Server重启,初始化Session

你可以想一下如果没有Session会怎么样?
当然,游戏可以玩,只是效率会低很多,因为不管是什么MySQL/Oracle,在并发上面没有本质的区别,效率太低.
所以要把数据缓存起来.

而把变化的数据写入到DB里面,为什么要几分钟一次呢?还是因为DB的效率太低了的缘故

#3


该回复于2011-01-06 09:14:32被版主删除

#4



MYSQL C API 访问程序(更新升级版本) 
http://blog.csdn.net/hzhxxx/archive/2010/12/27/6100752.aspx

#5


hi!楼主好!不知到能不能留下联系方式啊~qq之类的 我也在做一个mmo服务器 遇到数据库这块的时候有点想要一同讨论下的东西~~

#6


有一个问题,如何保证这五分钟来缓存的数据,不会一下把数据库搞崩掉呢?

#7


多条语句一次提交执行比单条语句执行效率高NN倍

#8


我测试过,每次提交一条语句,插入数据库1000次需要48秒,但是1000条一起提交,只需要0.1秒

#9


我也有跟楼主有类似的疑问。
数据服务 也就是 大家常说的 DBServer 。
游戏中数据改变的操作有 insert,delete,update。
问题:
“定时的数据存盘” 意思是 
1、定时的去把积累的这些( insert,delete,update)操作 在数据库执行吗? 
2、还是说把 DBServer在内存中维护的玩家数据,全部更新到数据库呢?

如果是按 1猜想,那么如何才能维护好DBServer中内存数据呢。我想要保持内存和数据的同步的话,DBServer在接到要更新数据的请求的时候,是不是既需要执行sql操作,也需要执行更新内存的操作,这明显增加了工作量了。

如果是按 2猜想 要维护好数据库中的数据 就会大量增加对数据库的delete和insert操作了吧?这样数据库岂不是更加容易崩溃?

或者都不是我想的这样,那究竟是怎样会相对合理呢?求教大侠们

#10


对数据缓存的操作应该是实时的 对数据库的操作是把数据缓存的内容全部存入数据库防止服务器意外故障玩家数据丢失

#11


数据缓存的更新是实时的

#12


DBcache一方面向逻辑提供一个数据缓存服务,另一方面向逻辑提供一个异步的操作接口。
如果你在逻辑中直接使用mysql的同步API,你应该能猜到后果。

#1


数据服务即:
数据服务中心,它负责所有数据统一管理,提供实时的数据读写,多服务器环境下数据服务中心的处理能力,直接关系到整个集群系统的性能.所有的关键数据库访问都它包装,一般对内存需求和很大,因为有大量数据要在内存缓存.

#2


一般都会有Session服务器的,相当于一个内存数据库
而DB是用来持久化数据的,第二次Server重启,初始化Session

你可以想一下如果没有Session会怎么样?
当然,游戏可以玩,只是效率会低很多,因为不管是什么MySQL/Oracle,在并发上面没有本质的区别,效率太低.
所以要把数据缓存起来.

而把变化的数据写入到DB里面,为什么要几分钟一次呢?还是因为DB的效率太低了的缘故

#3


该回复于2011-01-06 09:14:32被版主删除

#4



MYSQL C API 访问程序(更新升级版本) 
http://blog.csdn.net/hzhxxx/archive/2010/12/27/6100752.aspx

#5


hi!楼主好!不知到能不能留下联系方式啊~qq之类的 我也在做一个mmo服务器 遇到数据库这块的时候有点想要一同讨论下的东西~~

#6


有一个问题,如何保证这五分钟来缓存的数据,不会一下把数据库搞崩掉呢?

#7


多条语句一次提交执行比单条语句执行效率高NN倍

#8


我测试过,每次提交一条语句,插入数据库1000次需要48秒,但是1000条一起提交,只需要0.1秒

#9


我也有跟楼主有类似的疑问。
数据服务 也就是 大家常说的 DBServer 。
游戏中数据改变的操作有 insert,delete,update。
问题:
“定时的数据存盘” 意思是 
1、定时的去把积累的这些( insert,delete,update)操作 在数据库执行吗? 
2、还是说把 DBServer在内存中维护的玩家数据,全部更新到数据库呢?

如果是按 1猜想,那么如何才能维护好DBServer中内存数据呢。我想要保持内存和数据的同步的话,DBServer在接到要更新数据的请求的时候,是不是既需要执行sql操作,也需要执行更新内存的操作,这明显增加了工作量了。

如果是按 2猜想 要维护好数据库中的数据 就会大量增加对数据库的delete和insert操作了吧?这样数据库岂不是更加容易崩溃?

或者都不是我想的这样,那究竟是怎样会相对合理呢?求教大侠们

#10


对数据缓存的操作应该是实时的 对数据库的操作是把数据缓存的内容全部存入数据库防止服务器意外故障玩家数据丢失

#11


数据缓存的更新是实时的

#12


DBcache一方面向逻辑提供一个数据缓存服务,另一方面向逻辑提供一个异步的操作接口。
如果你在逻辑中直接使用mysql的同步API,你应该能猜到后果。