在游戏开发中,面对游戏中的bug以及策划案子的修改,难免要重启服务器 如果说一个服务器在游戏上线的情况下,频繁重新服务器对用户体验及其恶劣,甚至会引起用户的流失 避免游戏服务器重新启动基本不可能,那作为游戏服务器开发人员有什么办法能够尽量避免这不必要的流失呢 在最近的游戏项目中本人用到了这样一套架构,既实现了简单的负载均衡又避免单个服务器重启引发的一系列问题 这里就不提供具体代码了,给大家提供下具体的开发思路吧 首先我们在脑中有这样一个思想,突破传统的单服务器概念 我们将服务器分成N多个进程,也就是说一台服务器由N多个进程组成,这N多个进程是N多个TCP/UDP主机地址以及端口, 可以灵活配置分布在不同物理服务器中 下面看下XML服务器设计图
<?xml version="1.0" encoding="UTF-8"?> <servers> <server id="1" name="天上人间" version="v1.0.0 20131104" size="12" > <process id="00:16:3E:00:14:A6-9894" host="121.199.13.143" port="1860" online="4" usedMemory="57" status="101"/> <process id="00:16:3E:00:14:A6-10001" host="121.199.13.143" port="1861" online="0" usedMemory="50" status="101"/> <process id="10:dd:b1:c0:3b:82-108" host="192.168.1.102" port="1768" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:82-107" host="192.168.1.102" port="1767" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:82-103" host="192.168.1.100" port="1763" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:82-109" host="192.168.1.102" port="1769" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:82-100" host="192.168.1.100" port="1760" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:82-105" host="192.168.1.101" port="1765" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:82-106" host="192.168.1.101" port="1766" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:82-104" host="192.168.1.101" port="1764" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:82-101" host="192.168.1.100" port="1761" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:82-102" host="192.168.1.100" port="1762" online="0" usedMemory="0" status="105"/> </server> <server id="2" name="瑶池仙境" version="v1.0.0 20131104" size="10" > <process id="10:dd:b1:c0:3b:83-207" host="192.168.1.102" port="1867" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:83-201" host="192.168.1.100" port="1861" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:83-204" host="192.168.1.101" port="1864" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:83-206" host="192.168.1.101" port="1866" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:83-203" host="192.168.1.101" port="1863" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:83-208" host="192.168.1.102" port="1868" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:83-205" host="192.168.1.101" port="1865" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:83-209" host="192.168.1.102" port="1869" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:83-202" host="192.168.1.100" port="1862" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:83-200" host="192.168.1.100" port="1860" online="0" usedMemory="0" status="105"/> </server> <server id="3" name="忍者传说" version="v1.0.0 20131104" size="11" > <process id="10:dd:b1:c0:3b:84-304" host="192.168.1.101" port="1964" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:84-306" host="192.168.1.102" port="1966" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:84-307" host="192.168.1.102" port="1967" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:84-300" host="192.168.1.100" port="1960" online="0" usedMemory="0" status="105"/> <process id="D4:3D:7E:BC:7B:AD-6249" host="116.226.64.2" port="1860" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:84-305" host="192.168.1.101" port="1965" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:84-308" host="192.168.1.102" port="1968" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:84-303" host="192.168.1.101" port="1963" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:84-302" host="192.168.1.100" port="1962" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:84-301" host="192.168.1.100" port="1961" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:84-309" host="192.168.1.102" port="1969" online="0" usedMemory="0" status="105"/> </server> </servers>
这仅仅是服务器的设计图,在此之上可以再加上分区以及具体应用的设计
从上XML中可以看出有三台服务器,每个服务器下又有N多个进程,要说明的是这个列表是动态的,并不是静态文件
当然你也只需要开发一套程序即可,但你要做的是往负载均衡服务器中推送当前进程的信息包括进程的id、
进程的主机地址以及端口、当前进程的连接数 、已经使用的内存
在每个进程启动的时候配置下服务器的id以及当前进程的id(这里本人推荐mac地址+进程号)、
然后定时往服务器均衡服务器推送自己最新的状态信息在负载均衡服务器中我们要能接收每个进程服务器的信息推送,
将每一条推送过来的信息存放在内存中,并设置此进程的状态为正常状态
也不能就一直指望这进程的推送,因为有可能此进程已经没有在运行状态了,所以我们需要定时扫描所有列表中的状态,
对其主机地址端口进行连接测试,如果连不通过就将其状态设为停止
在客户端访问时时候,在负载均衡需要做的就是根据连接数以及使用的内存还有状态进行排序,
状态正常的靠前,在线人数使用的内存比小的靠前,
根据这个思路将服务器地址列表推送给客户端即可
当发现服务器下的每个进程连接数量都很高,我们可以在线开启新的进程,
当有用户进来的时候永远连接进来的主机地址是负载最小的服务器进程,
就算某一个进程重启了,也不必担心服务器的正常供应。
文章转载自 dmdq.org - 代码大全: http://www.dmdq.org/thread-41-1-1.html