有状态服务器负载均衡的方法、系统、装置和存储介质
文献发布时间:2023-06-19 10:16:30
技术领域
本申请涉及计算机领域,特别是涉及有状态服务器负载均衡的方法、系统、装置和存储介质。
背景技术
对服务器程序来说,有两个重要的基本假设,即服务器是基于状态请求还是无状态请求,其中,游戏服务器一般都是有状态服务器。有状态服务器在服务端维护每个连接的状态信息,服务端在接收到每个连接发送的请求时,可以从本地存储的信息来重现上下文关系。这样,客户端可以很容易使用缺省的信息,服务端也可以很容易地进行状态管理。例如,当游戏用户登录后,服务端可以根据用户名获取他先前的游戏注册信息;而且在后续的处理中,服务端能很容易找到这个用户的历史信息。
在相关技术中,有状态服务器的负载均衡方式一种是通过hash方式,然而这种方式难以动态扩容,而且会存在负载分配不均的问题;另一种方式是通过一个中心服进行负载分配,但是会存在服务器单点故障的问题。
针对相关技术中,在有状态服务器中对游戏资源进行分配时,负载分配不均、系统出现单点故障和服务器难以动态扩容的问题,尚未提出有效的解决方案。
发明内容
本申请实施例提供了有状态服务器负载均衡的方法、系统、装置和存储介质,至少解决相关技术中在有状态服务器中对游戏资源进行分配时,负载分配不均、系统出现单点故障和服务器难以动态扩容的问题。
第一方面,本申请实施例提供了一种有状态服务器负载均衡的方法,所述方法包括:
获取后端服务器中的空闲服务器,所述空闲服务器为第一服务器;
通过redis的setex指令将游戏资源分配到所述第一服务器上;
将所述游戏资源连接到所述第一服务器进行服务,并在预设间隔时间内,所述第一服务器通过所述redis与所述游戏资源的绑定关系进行续期;
在经过所述redis中的预设时间没有续期的情况下,所述第一服务器与所述游戏资源的所述绑定关系过期,所述游戏资源进行重新分配。
在其中一些实施例中,在将所述游戏资源连接到所述第一服务器进行服务之前,所述方法包括:
通过redis的get指令始终获取所述游戏资源当前所在的服务器,所述服务器为第二服务器。
在其中一些实施例中,所述获取后端服务器中的空闲服务器包括:
获取存储在所述redis中的所述空闲服务器的ID;
服务发现协议通过所述ID定位到所述空闲服务器。
在其中一些实施例中,所述第一服务器与所述游戏资源的所述绑定关系过期包括:
在所述第一服务器宕机或游戏玩家退出登陆的情况下,所述第一服务器与所述游戏资源的所述绑定关系过期。
第二方面,本申请实施例提供了一种有状态服务器负载均衡的系统,所述系统包括:
获取模块,用于获取后端服务器中的空闲服务器,所述空闲服务器为第一服务器;
分配模块,用于通过redis的setex指令将游戏资源分配到所述第一服务器上;
定时续期模块,用于将所述游戏资源连接到所述第一服务器进行服务,并在预设间隔时间内,所述第一服务器通过所述redis与所述游戏资源的绑定关系进行续期;
再分配模块,用于在经过所述redis中的预设时间没有续期的情况下,所述第一服务器与所述游戏资源的所述绑定关系过期,所述游戏资源进行重新分配。
在其中一些实施例中,所述分配模块还用于在将所述游戏资源连接到所述第一服务器进行服务之前,
通过redis的get指令始终获取所述游戏资源当前所在的服务器,所述服务器为第二服务器。
在其中一些实施例中,所述获取模块还用于获取存储在所述redis中的所述空闲服务器的ID;
服务发现协议通过所述ID定位到所述空闲服务器。
在其中一些实施例中,所述再分配模块还用于在所述第一服务器宕机或游戏玩家退出登陆的情况下,所述第一服务器与所述游戏资源的所述绑定关系过期。
第三方面,本申请实施例提供了一种电子装置,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行上述任一项所述的有状态服务器负载均衡的方法。
第四方面,本申请实施例提供了一种存储介质,所述存储介质中存储有计算机程序,其中,所述计算机程序被设置为运行时执行上述任一项所述的有状态服务器负载均衡的方法。
相比于相关技术,本申请实施例提供的一种有状态服务器负载均衡的方法,获取后端服务器中的空闲服务器,该空闲服务器为第一服务器,通过redis的setex指令将游戏资源分配到第一服务器上,然后将游戏资源连接到第一服务器进行服务,并在预设间隔时间内,第一服务器通过redis与游戏资源的绑定关系进行续期,最后在经过redis中的预设时间没有续期的情况下,第一服务器与游戏资源的绑定关系过期,游戏资源进行重新分配,解决了在有状态服务器中对游戏资源进行分配时,负载分配不均、系统出现单点故障和服务器难以动态扩容的问题,实现了游戏资源的动态负载均衡,以及服务器的动态扩容,去除了系统的单点故障。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1是根据本申请实施例的一种有状态服务器负载均衡的方法的应用环境示意图;
图2是根据本申请实施例的有状态服务器负载均衡方法的流程图;
图3是根据本申请实施例的动态分配后端服务器的示意图;
图4是根据本申请实施例的有状态服务器负载均衡系统的结构框图;
图5是根据本申请实施例的电子设备的内部结构示意图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行描述和说明。应当理解,此处所描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。基于本申请提供的实施例,本领域普通技术人员在没有作出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。此外,还可以理解的是,虽然这种开发过程中所作出的努力可能是复杂并且冗长的,然而对于与本申请公开的内容相关的本领域的普通技术人员而言,在本申请揭露的技术内容的基础上进行的一些设计,制造或者生产等变更只是常规的技术手段,不应当理解为本申请公开的内容不充分。
在本申请中提及“实施例”意味着,结合实施例描述的特定特征、结构或特性可以包含在本申请的至少一个实施例中。在说明书中的各个位置出现该短语并不一定均是指相同的实施例,也不是与其它实施例互斥的独立的或备选的实施例。本领域普通技术人员显式地和隐式地理解的是,本申请所描述的实施例在不冲突的情况下,可以与其它实施例相结合。
除非另作定义,本申请所涉及的技术术语或者科学术语应当为本申请所属技术领域内具有一般技能的人士所理解的通常意义。本申请所涉及的“一”、“一个”、“一种”、“该”等类似词语并不表示数量限制,可表示单数或复数。本申请所涉及的术语“包括”、“包含”、“具有”以及它们任何变形,意图在于覆盖不排他的包含;例如包含了一系列步骤或模块(单元)的过程、方法、系统、产品或设备没有限定于已列出的步骤或单元,而是可以还包括没有列出的步骤或单元,或可以还包括对于这些过程、方法、产品或设备固有的其它步骤或单元。本申请所涉及的“连接”、“相连”、“耦接”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电气的连接,不管是直接的还是间接的。本申请所涉及的“多个”是指大于或者等于两个。“和/或”描述关联对象的关联关系,表示可以存在三种关系,例如,“A和/或B”可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。本申请所涉及的术语“第一”、“第二”、“第三”等仅仅是区别类似的对象,不代表针对对象的特定排序。
本申请提供的有状态服务器负载均衡的方法,可以应用于如图1所示的应用环境中,图1是根据本申请实施例的一种有状态服务器负载均衡的方法的应用环境示意图,如图1所示,其中,该应用环境的系统包括服务器10和智能终端设备11,其中,服务器10获取后端服务器中的空闲服务器,该空闲服务器为第一服务器,接着通过redis的setex指令将游戏资源分配到第一服务器上,然后将游戏资源连接到第一服务器进行服务,并在预设间隔时间内,第一服务器通过redis与游戏资源的绑定关系进行续期,最后在经过redis中的预设时间没有续期的情况下,第一服务器与游戏资源的绑定关系过期,应用于智能终端设备11的游戏资源进行重新分配,解决了在有状态服务器中对游戏资源进行分配时,负载分配不均、系统出现单点故障和服务器难以动态扩容的问题,实现了游戏资源的动态负载均衡,以及服务器的动态扩容,去除了系统的单点故障。
本实施例提供了一种有状态服务器负载均衡的方法,图2是根据本申请实施例的有状态服务器负载均衡方法的流程图,如图2所示,该流程包括如下步骤:
步骤S201,获取后端服务器中的空闲服务器,空闲服务器为第一服务器,可选的,假设后端有3个服务器可以进行服务,本实施例选取3个后端服务器中相对空闲的服务器,该空闲服务器为第一服务器。相比于现有技术中采用hash的方式进行负载均衡分配,本实施例能直接外部增设后端服务器,实现服务器的动态扩容;
步骤S202,通过redis的setex指令将游戏资源分配到第一服务器上,其中,redis是一个包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,此外,redis的setex指令用于在redis键中的指定超时,设置键的字符串值,即指定key设置值及其过期时间,例如,setex A 60S,其中,A表示游戏资源,S表示第一服务器,60代表过期时间是60秒。图3是根据本申请实施例的动态分配后端服务器的示意图,如图3所示,可选的,本实施例通过通过redis的setexA 60S指令将游戏资源A,如玩家、工会等,分配到第一服务器S上。本实施例通过redis集群将游戏资源分配到第一服务器上,与现有技术中通过一个中心服对负载资源进行分配会产生单点故障相比,通过redis集群能有效避免单点问题,即在主从点出现故障的时候,从节点可以代替故障主节点进行服务;
步骤S203,将游戏资源连接到第一服务器进行服务,并在预设间隔时间内,第一服务器通过redis与游戏资源的绑定关系进行续期,可选的,本实施例中在游戏资源被系统告知分配到第一服务器之后,游戏资源连接到第一服务器进行服务,并每隔一段时间比如30秒,第一服务器会通过redis与游戏资源A的绑定关系进行续期;
步骤S204,在经过redis中的预设时间没有续期的情况下,第一服务器与游戏资源的绑定关系过期,游戏资源进行重新分配,可选的,本实施例中,在经过redis中预设的60秒过期时间没有续期的情况下,第一服务器S与游戏资源A的绑定关系会过期,此时,游戏资源A会被重新分配到其他的服务器上。本实施例通过redis的lua脚本实现一个原子操作,即对游戏资源进行动态分配,能实现资源的动态负载均衡。
通过上述步骤S201至步骤S204,相对于现有技术中,有状态服务器通过hash方式实现负载均衡会导致服务器难以动态扩容和负载分配不均的问题;以及通过一个中心服进行负载分配,会存在服务器单点故障的问题。本实施例中获取后端服务器中的空闲服务器,该空闲服务器为第一服务器,接着通过redis的setex指令将游戏资源分配到第一服务器上,然后将游戏资源连接到第一服务器进行服务,并在预设间隔时间内,第一服务器通过redis与游戏资源的绑定关系进行续期,最后在经过redis中的预设时间没有续期的情况下,第一服务器与游戏资源的绑定关系过期,应用于智能终端设备11的游戏资源进行重新分配,解决了在有状态服务器中对游戏资源进行分配时,负载分配不均、系统出现单点故障和服务器难以动态扩容的问题,实现了游戏资源的动态负载均衡,以及服务器的动态扩容,去除了系统的单点故障。
在其中一些实施例中,在将游戏资源连接到第一服务器进行服务之前,通过redis的get指令始终获取游戏资源当前所在的服务器,该服务器为第二服务器,其中,redis的get指令用于获取指定key的值,如果key不存在,返回nil;如果key储存的值不是字符串类型,则返回一个错误,例如,get A是指获取游戏资源A当前所在的第二服务器。可选的,由于并发操作,即一个游戏玩家的账号在两个终端设备上登陆时,此时的游戏资源A(玩家账号)会被分配到第二服务器上,与第一服务器不同,因此,在将游戏资源A连接到第一服务器进行服务之前,需要通过redis的get A指令始终获取游戏资源A当前所在的第二服务器,有利于在后续资源连接中,能连接到游戏资源A真实所在的第二服务器上。
在其中一些实施例中,获取后端服务器中的空闲服务器包括:获取存储在redis中的空闲服务器的ID,服务发现协议通过ID定位到空闲服务器,其中,服务发现协议有很多,例如Consul、Zookeeper、Etcd和Eureka等。可选的,系统进程获取存储在redis中的空闲服务器的ID,服务发现协议通过轮询法、随机发、哈希法、最小连接数和权重等负载均衡算法,通过ID定位到获取的空闲服务器中。此外,只要启动系统进程,就能通过服务发现协议获取新增设的后端服务器。
在其中一些实施例中,第一服务器与游戏资源的绑定关系过期包括:在第一服务器宕机或游戏玩家退出登陆的情况下,第一服务器与游戏资源的绑定关系过期。可选的,在服务器宕机或者游戏玩家账号退出登录的情况下,服务器与游戏资源的绑定关系会过期,游戏资源会被重新分配。
需要说明的是,在上述流程中或者附图的流程图中示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
本实施例还提供了一种有状态服务器负载均衡的系统,该系统用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述。如以下所使用的,术语“模块”、“单元”、“子单元”等可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
图4是根据本申请实施例的有状态服务器负载均衡的结构框图,如图4所示,该系统包括获取模块41、分配模块42、定时续期模块43和再分配模块44:
获取模块41,用于获取后端服务器中的空闲服务器,该空闲服务器为第一服务器;分配模块42,用于通过redis的setex指令将游戏资源分配到第一服务器上;定时续期模块43,用于将游戏资源连接到第一服务器进行服务,并在预设间隔时间内,第一服务器通过redis与游戏资源的绑定关系进行续期;再分配模块44,用于在经过redis中的预设时间没有续期的情况下,第一服务器与游戏资源的绑定关系过期,游戏资源进行重新分配。
通过上述系统,获取模块41相比于现有技术中采用hash的方式进行负载均衡分配,本实施例模块能直接外部增设后端服务器,实现服务器的动态扩容;分配模块42通过redis集群将游戏资源分配到第一服务器上,与现有技术中通过一个中心服对负载资源进行分配会产生单点故障相比,通过redis集群能有效避免单点问题,即在主从点出现故障的时候,从节点可以代替故障主节点进行服务;定时续期模块43可以在游戏资源被系统告知分配到第一服务器之后,游戏资源连接到第一服务器进行服务,并每隔一段时间比如30秒,第一服务器会通过redis与游戏资源A的绑定关系进行续期;再分配模块44通过redis的lua脚本实现一个原子操作,即对游戏资源进行动态分配,能实现资源的动态负载均衡。整个系统解决了在有状态服务器中对游戏资源进行分配时,负载分配不均、系统出现单点故障和服务器难以动态扩容的问题,实现了游戏资源的动态负载均衡,以及服务器的动态扩容,去除了系统的单点故障。
在其中一些实施例中,分配模块42还用于在将游戏资源连接到第一服务器进行服务之前,通过redis的get指令始终获取游戏资源当前所在的服务器,该服务器为第二服务器,其中,redis的get指令用于获取指定key的值,如果key不存在,返回nil;如果key储存的值不是字符串类型,则返回一个错误,例如,get A是指获取游戏资源A当前所在的第二服务器。可选的,由于并发操作,即一个游戏玩家的账号在两个终端设备上登陆时,此时的游戏资源A(玩家账号)会被分配到第二服务器上,与第一服务器不同,因此,在将游戏资源A连接到第一服务器进行服务之前,需要通过redis的get A指令始终获取游戏资源A当前所在的第二服务器,有利于在后续资源连接中,能连接到游戏资源A真实所在的第二服务器上。
在其中一些实施例中,获取模块41还用于获取存储在redis中的空闲服务器的ID,服务发现协议通过ID定位到空闲服务器,其中,服务发现协议有很多,例如Consul、Zookeeper、Etcd和Eureka等。可选的,系统进程获取存储在redis中的空闲服务器的ID,服务发现协议通过轮询法、随机发、哈希法、最小连接数和权重等负载均衡算法,通过ID定位到获取的空闲服务器中。此外,只要启动系统进程,就能通过服务发现协议获取新增设的后端服务器。
在其中一些实施例中,再分配模块44还用于在第一服务器宕机或游戏玩家退出登陆的情况下,第一服务器与游戏资源的绑定关系过期,可选的,在服务器宕机或者游戏玩家账号退出登录的情况下,服务器与游戏资源的绑定关系会过期,游戏资源会被重新分配。
下面结合应用场景对本发明进行详细的说明。
本发明的目的是提供一种有状态服务器负载均衡的方法和系统,本实施例中的有状态服务器负载均衡的技术方案的流程步骤包括:
S1,在游戏资源A需要申请一个有状态服务器的情况下,首先通过服务发现协议获取一个后端服务器中比较空闲的第一服务器服务器S;
S2,通过redis的setex A60S尝试将游戏资源A绑定到第一服务器S上,然后再通过redis的get A始终获取游戏资源A当前真实所在第二服务器,其中,由于并发操作的存在,这里第二服务器不一定就是第一服务器;
S3,游戏资源A被告知分配到了第一服务器S上,接着游戏资源A连接到第一服务器S进行服务;
S4,游戏资源A在第一服务器S上服务时,第一服务器S每隔一段时间比如30秒,会通过redis与游戏资源A的绑定关系进行定时续期;
S5,在60秒后没有续期的情况下,游戏资源A的绑定数据会过期,资源A会通过上述步骤重新进行负载分配,其中,一般情况下,如果服务器SS宕机或游戏玩家登出均会导致绑定关系过期。
本实施例还提供了一种电子装置,包括存储器和处理器,该存储器中存储有计算机程序,该处理器被设置为运行计算机程序以执行上述任一项方法实施例中的步骤。
可选地,上述电子装置还可以包括传输设备以及输入输出设备,其中,该传输设备和上述处理器连接,该输入输出设备和上述处理器连接。
另外,结合上述实施例中的有状态服务器负载均衡的方法,本申请实施例可提供一种存储介质来实现。该存储介质上存储有计算机程序;该计算机程序被处理器执行时实现上述实施例中的任意一种有状态服务器负载均衡的方法。
在一个实施例中,图5是根据本申请实施例的电子设备的内部结构示意图,如图5所示,提供了一种电子设备,该电子设备可以是服务器,其内部结构图可以如图5所示。该电子设备包括通过系统总线连接的处理器、存储器、网络接口和数据库。其中,该电子设备的处理器用于提供计算和控制能力。该电子设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该电子设备的数据库用于存储数据。该电子设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种有状态服务器负载均衡的方法。
本领域技术人员可以理解,图5中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的电子设备的限定,具体的电子设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,该计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
本领域的技术人员应该明白,以上所述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。
- 有状态服务器负载均衡的方法、系统、装置和存储介质
- 设备状态检测装置、设备状态检测方法、设备状态检测服务器及设备状态检测系统、生活者异常探测装置、生活者异常探测系统及生活者异常探测方法以及设备状态数据库维护服务器