如何实现游戏服务器分布式并且能够负载均衡以及重启措施
在游戏开发中,⾯对游戏中的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"/>
游戏xml文件修改
<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地址+进程号)、
然后定时往服务器均衡服务器推送⾃⼰最新的状态信息在负载均衡服务器中我们要能接收每个进程服务器的信息推送,
将每⼀条推送过来的信息存放在内存中,并设置此进程的状态为正常状态
也不能就⼀直指望这进程的推送,因为有可能此进程已经没有在运⾏状态了,所以我们需要定时扫描所有列表中的状态,对其主机地址端⼝进⾏连接测试,如果连不通过就将其状态设为停⽌
在客户端访问时时候,在负载均衡需要做的就是根据连接数以及使⽤的内存还有状态进⾏排序,
状态正常的靠前,在线⼈数使⽤的内存⽐⼩的靠前,
根据这个思路将服务器地址列表推送给客户端即可
当发现服务器下的每个进程连接数量都很⾼,我们可以在线开启新的进程,
当有⽤户进来的时候永远连接进来的主机地址是负载最⼩的服务器进程,
就算某⼀个进程重启了,也不必担⼼服务器的正常供应。
⽂章转载⾃ - 代码⼤全:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。