红雪中国 2012-03-02
首先非常感谢Saint,跟他交谈收益颇多
有关服务器的数据架构,可以分为服务器本地内存+Memcached+DB这三块
1、和客户端交互数据的就是服务端的本地内存了,这个速度是最快的,所以交互也是最频繁的(本地内存数据只保存自身服务器的数据)
2、Memcached作为本地内存的备份数据,同时还提供了分布式服务器的数据共享(Memcached保存着所有服务器的数据)
3、DB作为Memcached的备份数据,当从Memcached取不到数据时可以从DB中获取
用户登录的时候先尝试从Memcached中获取 如果获取到就从Memcached中放入本地内存,如果获取不到就从DB中获取之后再放入Memcached和本地内存
然后每隔一段时间(例如5分钟)将本地内存同步到DB
用户下线的时候,本地内存同步到Memcached和DB,然后把本地内存中的用户信息删除
其中本地缓存的读取速度是最快的,并且保存的是当前服务器的在线用户信息,数据量也比较小,所以交互的是最频繁的;Memcached其次(因为需要socket交互),而且Memcached保存着所有服务器的用户信息;DB的瓶颈最大,所以交互的最少。这样以上的架构可以保证性能分配的最大化
根据Saint的经验之谈,一个游戏服务器的同时在线人数大概在1100左右,一台物理服务器大概放3个游戏服务器,也就是3300人左右。当然,这个取决于物理服务器的处理速度,也就是服务器硬件配置,我们按普通的服务器来算的。
不过计算物理服务器的硬件配置再高,一个游戏服务器的同时在线人数也不能太多,因为同一张地图在线玩家超过600,客户端就会比较卡了。
至于数据库,可以3、4个游戏服务器用一个DB,然后根据表名进行最基本的水平切分
Memcached物理服务器,只要内存足够大,就可以放所有服务器的用户信息。
可以一个游戏服务器对应Memcached的一个端口,至于每个端口要分配多少内存,就根据实际的玩家数量了,大概1G内存可以放2000个玩家的信息。
不同的游戏最好对应不同的端口,以免其他游戏的数据异常影响导致端口进程挂掉
不过要注意的是,在Windows下只能开一个端口,在Linux下才能开多个端口