基于内存,redis,mysql的高速游戏数据服务器设计架构

转载请注明出处,欢迎你们批评指正mysql

 

一、数据服务器详细设计

数据服务器在设计上采用三个层次的数据同步,实现玩家数据的高速获取和修改。redis

数据层次上分为:内存数据,redis数据,mysql数据sql

设计目的:首先保证数据的可靠,防止数据丢失,保证数据完整。而后实现数据的高速访问,减小由玩家数量增长对数据服务器性能形成的影响。最后实现运维数据的入库,以及数据持久化。数据库

在这个基础上数据服务器再也不是一个单一服务器,它涉及到与其余服务器之间的交互。缓存

数据服务器的核心在于redis数据层面。经过redis加快玩家数据的快速拉取。服务器

内存数据是直接与逻辑服务器进行交互的,所以内存数据划分到逻辑服务器进行管理,redis数据划分为数据服务器管理,mysql数据是对redis数据库的备份和同步。网络

主要流程,数据服务器启动时先从mysql数据库加载全部的活跃玩家相关数据到redis数据库中,逻辑服务器与数据服务器之间的交互都是经过国过redis数据进行操做。Redis数据库回写到mysql能够经过回写进程实现。多线程

            图 1 数据服务器数据扭转流程图运维

 

1.1 数据服务器主进程

数据服务器主进程核心是对redis的操做,经过redis数据库实现数据的高速存储。所以,数据服务器的核心是保证在玩家数量大较大的状况下对玩家数据的增删改都能维持在必定的时间效率内。异步

针对于redis数据库自己,能够考虑实现redis的主从库搭建,保证redis的数据库的备份和效率。

数据服务器主进程的构成:

一、mysql数据同步到redis数据库中。

二、逻辑服务器和数据服务器的网络库

三、玩家帐户修改缓存

四、Redis数据库的回写至mysql

五、逻辑数据库的请求处理

六、内存数据库的组织结构

 

1.2 数据回存服务

数据服务器接收到逻辑服务器的请求后,就数据库操做请求进行操做的队列缓冲,造成操做队列。操做队列同时提供了redis数据库的及时写入和mysql数据库的异步写入。

 

1.3 数据服务器提供接口

对于逻辑服务器,数据服务器应为其开放如下接口:

一、数据拉取接口,拉取对应玩家的全部数据,将数据保存到内存数据中

二、修改玩家数据接口,提供玩家的部分或所有信息修改命令

数据服务器模块功能

首先redis是一种key-value的内存数据库,以keyvalue的方式来存储数据实现高速的访问和操做。其次mysql是一种关系型数据库,存储的是结构化的数据。这种差别决定了在数据入库redis的时候须要作相应的处理。

2.1 数据入库redis

经过rediskey-value来存储数据库中的表名以及表的索引和hashkey,来实现构造二维的数据表。

针对于每张表,key结构 [表名][id]

要求全部的数据库表的第一个字段为id,或者全部的表都为主键,而且不能重复,这样保证了全部的key都不重复

 

图 2 数据入库redis后表现结构

 

入库流程方法一:

先将redis清空,再将mysql全部的额数据逐条入库到redis。逐条入库的好处是能够对玩家进行其余的操做处理,缺点是启动服务器速度慢。

方法二:

先将redis数据库清空,再将mysql读取处理的数据缓存成redis识别的事务,一次性进行redis入库。

2.2 排序

实现高效的排序功能,可使用rediszset进行拍寻队列构建,对于玩家等级或经验改变时,对redis数据库进行修改,当须要或获取排序时直接获取zset集合类已经拍好的顺序就能够实现高效的排序功能

2.3 redis数据回存mysql 

redis数据库的操做须要回存到mysql数据库中。

方案一:采用多线程异步,经过多线程异步实现mysql修改回存同步。在数据服务器多开一个线程进行回存。

优势:设计结构相对简单,不涉及到进程间通讯,但须要多线程开发支持

方案二:采用多进程方式,回存由专门的进程进行,没有操做消息redis数据库默认转发进程转发。

优势:简单的单线程便可知足需求,但须要进程间通信。

2.4 网络交互模块及序列化

服务器之间的网络传输由统一的网络模块进行。序列化功能采用protobuf的序列化功能。

具体实现

数据服务器设计到大多都是表和redis数据操做,这些操做具备类似性。这样的繁杂的操做不利于手动修改和书写代码。

所以在此处合理的运用生成器就会减小很大一部分工做量,经过生成器快速生成C++代码,而且灵活的应对数据库结构的更改。

3.1 生成物和生成器

生成器使用了C#语言快速编写访问数据库结构,并生成类代码。

生成物能够设计成各类语言的操做文件,目前生成C++文件。

 

3.2 Mysql数据回写进程 

数据回写进程又一个回写消息队列和一个回写器组成,回写消息队列缓存全部要进行回写操做,再有回写器进行回写。多线程回写消息队列操做加锁。

 

3.3 玩家登录信息查询

玩家登录时将拉取玩家数据到内存中。这个流程如今redis数据库中查询玩家数据,若是存在,返回给逻辑服务器玩家数据,若是redis数据库中不存在玩家数据,将再次在mysql中进行查询,若是存在返回给逻辑服务器,若是不存在返回查询失败。具体流程看下图

 

    

                图 3 玩家数据查询流程

在修改玩家数据时,须要同步三层数据。数据首先是在内存中进行修改,而后发起修改命令给数据服务器,数据服务器将修改命令分别压入redis数据库命令队列和mysql命令队列。再有两个线程异步对命令队列中的命令执行,完成数据回写。

 

图 4 数据回写命令执行流程

3.4 玩家活跃程度划分 

为了提升数据的访问速度和效率,将玩家进行活跃度分级。正在游戏玩家数据加载到内存,快速访问。活跃玩家加载到redis数据库,实现快速拉取。不活跃玩家存放mysql,须要时访问查询。

优势:根据数据的访问频度对数据进行分级,使得高频数据快速访问,节约了内存空间。

缺点:不活跃玩家登录时间相对较长,但不影响游戏效率。登录后,玩家又再次进入活跃玩家存储方案。

相关文章
相关标签/搜索