游戏服务器 – 存储

游戏服务器 – 存储

数据存储基础

  • 数据存储的概念 将运行时的数据保存到硬盘上。
  • 数据存储方式 事实上,数据量可能会很大,数据格式也可能很复杂,如果当作文件来存的话,很难以管理。一个小程序可以用文件的方式去保存。当数据库的规模变大,达到1TB或以上时,维护就变得十分麻烦。一般开发中会通过数据库保存我们的文件 数据库是比较宽泛的定义,有关系型数据库Mysql,非关系型数据库mongodb与redis等,不用再去用一些比较原始的方式去操作数据。
  • 数据库 – 关系型数据库
    • 数据库表设计与范式
      • 1NF
      • 2NF
      • 3NF
    • 优点
      • 减少数据冗余
      • 保证数据完整性
      • SQL语言提供强大的查询功能
    • 问题
      • 数据结构复杂情况下,表结构难以维护
      • 性能一般,容易产生性能瓶颈
      • 可扩展性差
  • 数据库 – 非关系型数据库
    • NoSQL数据库特点
      • Key-Value结构
      • 支持结构化存储
    • 优点
      • 易于维护
      • 性能较高
      • 可扩展性好
    • 问题
      • 容易产生数据冗余
      • 不支持SQL查询

数据库存储设计

  • 游戏业务的特点
    • 响应速度要求非常高,100ms以上玩家就会有感知
    • 数据更新频率高
      • 玩家数据时刻都在变化
      • 获取经验、获取金钱、获取成就
      • 操作类型的频率,update > read > insert > delete
    • 解决方案
      • 为了实现高速响应,玩家数据全部存在内存中
      • 在登陆时,从db加载进内存
      • 游戏过程的数据变更通过操作内存数据完成

    大部分用户都是鼠标用户,用鼠标点点,而不是键盘用户,用键盘去输入内容,这个对存储系统的要求也完全不一样。比如web的话,也强调一个缓存的概率,大部分是读(刷博客、刷天猫),服务器把数据缓存起来,不用去db拉。但是,游戏服器主要是变更比较多,update的操作比较频繁。所以更多的是,在写方面考虑怎么去降低对db的负载,通常解决办法是先对内存更新,然后再落地到数据库。对数据存储设计的影响,还和游戏类型、架构有关。

  • 游戏服务器架构介绍
    • 分区分服架构 用分区分服架构的原因:
      • 技术限制,每个游戏服对应一个数据库,存储压力相对较少
      • 游戏类型,从策划的角度来看,所有玩家在一个大世界玩,很难控制金钱的产出
    • 全区全服架构 对玩家来说,玩家更希望的是,进游戏不需要选择服务器,一登陆进来就能朋友一起来玩,而不是要问对方你在哪个区、哪个服务器。
    • 对于以上两种架构,对db要求的性能是不一样的
      • 分区分服可以通过业务相或策划选项,来控制整个区服的人数
      • 数据库选择

      对于分区分服,很多时候选择关系型数据库就可以满足需求了,再稍微加点优化就可以了,而且在单个服内,很少区动态扩容,因为一个服人数的上限已经定好了,传统rpg通常是6000人左右。开服一段时间后,玩家登陆数量是下降的,不需要去动态扩容。如过这个游戏非常受欢迎,也不是去对这个服务器扩容,而是选择开一个新服

      对于全区全服,数据量非常大,请求量也非常大,而且需要在线动态扩容 。像王者荣耀,当服务器人数超多,需要另外开一组服务器时,不可能停服,这样会导致其他玩家无法继续游戏,所以是需要支持在线扩容(扩容包括存储、进程)。这种情况决定了,要去选非关系型数据库。

  • 使用Mysql作为数据库
    • Blob
      • A blob is binary large object that can hold a variable amount of data
      • TINYBLOB / BLOB / MEDIUMBLOB / LONGBLOB
    • 混合式存储设计
      • 稳定数据,用表字段存储
      • 复杂 / 不稳定数据,用blob存储
      • 充分地理sql的查询优势 与 K-V的便捷优势

    游戏业务变更频繁,会引起对表字段的添加,为了解决这个问题,可以是用kv的方式去存储,要注意的是区分稳定与不稳定的数据。如,玩家的等级、经验这些相对是稳定的,技能、宠物这些是相对不稳定的,稳定的数据用sql查询起来方便,用kv去存,查询就变的复杂。这种设计,其实是软件工程的一种思想,很多时候没有单一非常完美的解决方案,需要用现有的技术,做一些混合式的方案出来,各取所长。

  • 存盘策略设计
    • update > read > insert > delete
    • 定期自动存盘
      • 3分钟自动存盘
    • 重要操作即时存盘
      • 升级 / 下线 / 关服
      • 获得高价值道具
    • 存储缓存队列
      • 削峰填谷
  • 存储容灾介绍
    • 热备
      • 主从热备,自动切换
    • 冷备
      • 每日全量备份
      • 关键操作前全量备份
  • 运营日志存储
    • 什么是运营日志?
      • 游戏中玩家重要行为的记录
      • 诸如登陆记录,等级变更,财产流水,交易记录等信息
    • 运营日志用途?
      • 运营分析游戏中玩家动态,做出运营决策的数据基础
      • 当发生异常时,追查玩家在游戏内的活动轨迹的重要依据
    • 运营日志的存储
      • 数据量巨大,单服每日约5-10g
      • 永久存档,涉及到游戏收入,需要永久存档备查
      • 需要便于分析统计
JackLei
JackLei

我是真的不会修电脑