游戏服务器本质上也是一个分布式系统,涉及到分布式系统就会涉及到一致性。
目标
- 数据存储的概念
- 游戏服务器的存储需求
- 游戏服务器存储方案
问题
- 游戏服务器有哪些数据存储需求呢?
- 相比较web服务,游戏服务器对于存储的需求什么不一样呢?
- 游戏服务器存储和其他网络服务有什么不一样呢?
游戏服务器相比较web服务,存储的数据更为复杂,而且变化的频率更快。
数据存储基础(基础背景)
什么是数据存储?
数据存储是指将内存中数据保存到硬盘上形成持久化数据的过程。
关系型数据库
数据库表设计与范式(1NF、2NF、3NF),关系型数据的优点在于减少数据冗余、保证数据完整性、SQL语言提供强大查询功能。缺点是数据结构复杂情况下表结构难以维护,性能一般且容易产生性能瓶颈、可扩展性较差。
NoSQL数据库
NoSQL数据库特点是Key-Value
结构和支持结构化存储,其优点在于易于维护、性能较高、可扩展性好。缺点是容易产生数据冗余、不支持SQL查询。
DHT算法
游戏服务器应该如何选择存储方案?
游戏服务器架构与数据存储设计
游戏业务的特点
- 响应速度要求非常高:100ms以上的延迟玩家就会有感知,一般在20~50ms之间。
- 数据更新频率高:玩家数据每时每刻都在变化、如获取经验、获取金钱、获取成就等。
游戏数据的频繁操作程度:update > read > insert > delte
。
为实现高速响应,玩家数据全部在内存中。在登录时从DB从加载到内存,游戏过程中的数据变更通过操作内存数据完成。游戏服务器正常运行的时候,是不会动态地从DB中去load数据的。
传统的web服务其实大部操作时在读数据,所以它会很强调一个缓存的概念。但是游戏中主要是变更比较多,update的操作会非常频繁,所以更多地是在写数据,因此要考虑怎么去降低对DB的负载。
除此之外,还跟游戏的类型和架构有关。传统的MMORPG会有一个选择区服的概念,也就是业界说的比较多的全区全服和分区分服的概念。
游戏服务器架构介绍
分区分服简单来说就是每个玩家可以选择不同的服务器进行游戏,每个服务器后面的存储都是相互独立的。这样每个服务器的存储压力会变得比较小。
两种架构直接导致了对db的性能的要求是不一样的,分区分服可以通过业务项或策划项来控制每个区服的人数。传统的RPG每个区分会限制在5k~6k之间,天刀可以做到单服4w人。
游戏服务器数据库选型
- 分区分服存储特点:单服数据量较少、请求量少、无需动态在线扩容,因此比较适合采用RDBM。
- 全区全服存储特点:数据量大、请求量大、需要动态在线孔融,因此采用NoSQL比较适合。
使用MySQL作为游戏数据库
- Blob:A Blob is a binary large object that can hold a variable amount of data.
blob数据类型分为:tinyblob/blob/mediumblob/longblob
,它们之间的区别主要在于容纳对象的大小不一样。
其实也可以把MySQL当作一个KV系统来使用
- 混合式存储设计
稳定数据使用表字段来存储,复杂且不稳定的数据采用blob存储,充分利用SQL的查询优势和KV的便捷优势。
数据库选择好了,那么如何设计存盘策略呢?
对游戏服务器来说,读不是问题因为很少,更新才是问题。更新首先会在内存中把它记录下来,最终落地综合考虑也是采用一种混合式的操作。
游戏服务器存盘策略设计
- 游戏存盘需求特点:
update>read>insert>delete
- 定期自动存盘:3分钟自动存盘
- 重要操作即时存盘:例如升级/下线/关服、获得高价值道具...
- 存储缓冲队列:削峰填谷
游戏服务器存储容灾
- 热备:主从热备,自动切换
- 冷备:每日全量备份,关键操作前做全量备份。
运营日志存储
什么是运营日志呢?它是游戏中玩家重要行为的记录,诸如登录记录、等级变更、财产变化流水、交易记录等信息。
运营日志有什么用途呢?运营分析哟西中玩家动态,是做运营决策的数据基础。当发生异常时,是追查玩家在游戏内的活动轨迹的重要轨迹。
运营日志的存储,由于数据量巨大,单服每日可高达5~10G的未压缩数据。一些涉及游戏收入的流水,是需要永久存档备查的。另外一方面便于分析统计。