CN108712457B - 基于Nginx反向代理的后端服务器动态负载调整方法及装置 - Google Patents

基于Nginx反向代理的后端服务器动态负载调整方法及装置 Download PDF

Info

Publication number
CN108712457B
CN108712457B CN201810288911.7A CN201810288911A CN108712457B CN 108712457 B CN108712457 B CN 108712457B CN 201810288911 A CN201810288911 A CN 201810288911A CN 108712457 B CN108712457 B CN 108712457B
Authority
CN
China
Prior art keywords
end server
zookeeper
server information
nginx
worker
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201810288911.7A
Other languages
English (en)
Other versions
CN108712457A (zh
Inventor
李强乙
朱恒
高辉
尤良栋
姚平
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
SuningCom Co ltd
Original Assignee
SuningCom Co ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by SuningCom Co ltd filed Critical SuningCom Co ltd
Priority to CN201810288911.7A priority Critical patent/CN108712457B/zh
Publication of CN108712457A publication Critical patent/CN108712457A/zh
Application granted granted Critical
Publication of CN108712457B publication Critical patent/CN108712457B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L67/00Network arrangements or protocols for supporting network services or applications
    • H04L67/50Network services
    • H04L67/56Provisioning of proxy services
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5083Techniques for rebalancing the load in a distributed system
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/544Buffers; Shared memory; Pipes
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L67/00Network arrangements or protocols for supporting network services or applications
    • H04L67/01Protocols
    • H04L67/02Protocols based on web technology, e.g. hypertext transfer protocol [HTTP]
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L67/00Network arrangements or protocols for supporting network services or applications
    • H04L67/01Protocols
    • H04L67/10Protocols in which an application is distributed across nodes in the network
    • H04L67/1001Protocols in which an application is distributed across nodes in the network for accessing one among a plurality of replicated servers
    • H04L67/1004Server selection for load balancing

Abstract

本发明实施例公开了一种动态负载的调整方法及装置,涉及计算机技术领域,能够在Nginx做反向代理时,快速且低成本得对后端服务器进行动态负载的调整。本发明包括:从ZooKeeper中获取Nginx反向代理的后端服务器信息;当检测到所述ZooKeeper中的后端服务器信息发生变化时,将变化后的后端服务器信息和版本号更新至共享内存,其中,以所述后端服务器信息被获取的次数作为所获取的后端服务器信息的版本号;向已建立的worker进程发送更新信号,其中,所述更新信号用于更新所述worker进程的内存中的反向代理路由表。本发明适用于在Nginx做反向代理时,对后端服务器进行动态负载的调整。

Description

基于Nginx反向代理的后端服务器动态负载调整方法及装置
技术领域
本发明涉及计算机技术领域,尤其涉及一种动态负载的调整方法及装置。
背景技术
Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。在实际的工程应用中,Nginx做反向代理服务器时,所负载的后端服务器信息是写在配置文件中的。当需要根据业务量大小动态扩容或者缩容后端服务器时,现有技术存在如下问题:1、需要修改Nginx的配置文件,然后执行reload操作,而reload操作会重启worker进程,最终导致业务请求的平均响应时间增加了;2、使用Nginx-upsync-module模块,需要每个worker进程与consul建立长连接,当Nginx的worker进程多而且大量系统都采用Nginx做反向代理时,会消耗大量的资源,成本很高。
因此,在Nginx做反向代理时,需要实现快速且低成本地对后端服务器进行动态负载调整。
发明内容
本发明的实施例提供一种动态负载的调整方法及装置,能够在Nginx做反向代理时,快速且低成本得对后端服务器进行动态负载的调整。
为达到上述目的,本发明的实施例采用如下技术方案:
本实施例中,通过ZooKeeper持久化保存后端服务器信息,即一个Nginx集群的后端服务器信息只保存在ZooKeeper的一个节点上,保证一个Nginx集群的后端服务器信息只保存在一个地方。其中,Nginx的master进程连接ZooKeeper获取后端服务器信息并记录版本号,master进程将这些信息放到共享内存中。每个worker进程都是从共享内存中获取后端服务器信息及版本号,worker进程将后端服务器信息直接更新到内存中的反向代理路由表中。worker进程收到用户请求时,直接查找内存的路由表,找到合适的后端服务器,并将请求转发给后端服务器进行处理。
本实施例中通过使用master进程连接ZooKeeper并获取后端服务器信息,大大减少了连接数量、网络传输数据量和系统资源消耗。master使用共享内存和worker进程进行数据交换加上master进程利用版本号检查的机制,保证每个worker进程获取的数据是一致的。ZooKeeper的事件处理机制保证变更
ZooKeeper中的数据,可以立即反映到Nginx中。worker进程直接更新内存中的反向代理路由表,不用重启,不影响业务请求,节约了业务调整的成本。从而实现了在Nginx做反向代理时,快速且低成本得对后端服务器进行动态负载的调整。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
图1a、图1b为本发明实施例提供的架构示意图;
图2为本发明实施例提供的方法流程示意图;
图3、图4、图5为本发明实施例提供的具体实例的示意图。
具体实施方式
为使本领域技术人员更好地理解本发明的技术方案,下面结合附图和具体实施方式对本发明作进一步详细描述。下文中将详细描述本发明的实施方式,所述实施方式的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施方式是示例性的,仅用于解释本发明,而不能解释为对本发明的限制。本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本发明的说明书中使用的措辞“包括”是指存在所述特征、整数、步骤、操作、元件和/或组件,但是并不排除存在或添加一个或多个其他特征、整数、步骤、操作、元件、组件和/或它们的组。应该理解,当我们称元件被“连接”或“耦接”到另一元件时,它可以直接连接或耦接到其他元件,或者也可以存在中间元件。此外,这里使用的“连接”或“耦接”可以包括无线连接或耦接。这里使用的措辞“和/或”包括一个或更多个相关联的列出项的任一单元和全部组合。本技术领域技术人员可以理解,除非另外定义,这里使用的所有术语(包括技术术语和科学术语)具有与本发明所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一样定义,不会用理想化或过于正式的含义来解释。
本实施例中的方法流程,具体可以执行在一种如图1a所示的系统中,其中包括:后端服务器、Nginx、Zookeeper和用户设备(客户端)。
本实施例中所述的用户设备,具体可以实现为单独一台装置,或整合于各种不同的媒体数据播放装置中,诸如智能手机、平板电脑(Tablet Personal Computer)、膝上型电脑(Laptop Computer)、个人数字助理(personal digital assistant,简称PDA)或可穿戴式设备(Wearable Device)等。用户设备上具体可以运行客户端,客户端用于向Nginx发起请求。
本实施例中所述的后端服务器,具体可以是刀片机、工作站、超级计算机等设备。
本实施例中所述的Nginx/Nginx是一种高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx目前主要作为一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。其特点是占有内存少,并发能力强,被广泛应用在各大电商的网页服务器中。在硬件层面上具体可以是刀片机、工作站、超级计算机等设备。
本实施例中所述的Zookeeper(分布式系统的可靠协调系统),ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。在硬件层面上,Zookeeper具体可以运行在刀片机、工作站、超级计算机等设备上。本实施例中的Zookeeper对外通过Portal或API(Application Programming Interface,应用程序编程接口)接口进行通信。其中Portal认证通常也称为Web认证,未认证用户上网时,设备强制用户登录到特定站点,用户可以免费访问其中的服务。当用户需要使用互联网中的其它信息时,必须在门户网站进行认证,只有认证通过后才可以使用互联网资源。
进一步的,如图1b所示的,本实施例中所述的后端服务器,也可以由多个服务器组成的一种用于数据处理的服务器集群系统,一般会将这种设备集群称为后端服务器集群。具体的,后端服务器在软件层面上可以是Apache Tomcat、JBoss Application Server、GlassFish等Web应用服务器。在实际生产中,后端服务器通常是以集群的方式出现的。例如:部署了Apache Tomcat的计算机有4台,这些Apache Tomcat应用服务器提供相同的功能,他们可以组成一个后端服务器集群。当用户(客户端)向Nginx发起请求时,Nginx根据一定的转发规则,将请求转发给这4台Apache Tomcat服务器中的一台进行处理。这样,当大量的用户请求访问Nginx时,请求被分散到了4台Apache Tomcat服务器上,大大提高了网站的处理能力。
本实施例中所述的Nginx,也可以由多个服务器组成的一种用于数据处理的服务器集群系统,一般会将这种设备集群称为Nginx集群。
本发明实施例提供一种动态负载的调整方法,如图2所示,包括:
S1、从ZooKeeper中获取Nginx反向代理的后端服务器信息。
例如:如图3所示的,当Nginx启动时,master进程调用ZooKeeper的同步API以从ZooKeeper中获取后端服务器信息,并监听ZooKeeper中后端服务器信息是否变化(图中标记2)。在本实施例中,所述的master进程是Nginx的一个进程。Nginx启动时会创建一个master进程,多个worker进程,worker进程是master进程创建出来的子进程。master进程负责管理worker进程、从ZooKeeper中同步数据等;worker进程负责将客户端的请求转发到后端服务器上。
ZooKeeper通过Portal或API接口将Nginx反向代理的后端服务器信息持久化保存在ZooKeeper中。所提供的API接口可以将本专利与其他运维管理系统结合,其他运维管理系统全自动地更新ZooKeerper中的配置(后端服务器信息),从而实现全自动地对后端服务器进行动态负载的调整(图中标记1)。
本实施例中,后端服务器信息的具体内容主要包但不限于:后端服务器的IP地址和服务监听的端口号;后端服务器的权重,权重越大,客户端的请求被Nginx转发到该后端服务器上的机率越大;Nginx与后端服务器通信失败的次数,通信失败超过该次数,则Nginx认为该后端服务器不能继续使用,不会转发新的请求到该后端服务器上;后端服务器是否可用的标志,如果该后端服务器被标记为不可用,则Nginx不会转发请求到该后端服务器上。
S2、当检测到所述ZooKeeper中的后端服务器信息发生变化时,将变化后的后端服务器信息和版本号更新至共享内存。
其中,以所述后端服务器信息被获取的次数作为所获取的后端服务器信息的版本号。例如:如图3所示的,在已有后端服务器无法满足性能需求的情况下,使用Portal或API接口向ZooKeeper中增加节点(图中标记7),ZooKeeper中后端服务器信息发生变化,master进程会收到相应的事件,利用ZooKeeper多线程的异步API从ZooKeeper中获取最新的后端服务器信息(图中标记2),连同版本号一起放入共享内存中(图中标记3),并向worker进程发送信号(图中标记6)。
S3、向已建立的worker进程发送更新信号。
其中,所述更新信号用于更新所述worker进程的内存中的反向代理路由表。例如:如图3所示的,worker进程收到master进程发送的信号后,更新worker进程内存中的反向代理路由表(图中标记5),更新共享内存中的后端服务器信息的版本号(图中标记4)。其中,master进程利用版本号检查机制,保证所有的worker进程更新成功。
当用户设备上运行的客户端向Nginx发起请求时(图中标记8),worker进程会接收到该请求,查找内存中的反向代理路由表(图中标记9),并根据反向代理路由表中的后端服务器信息,及转发规则,将请求转发到后端真实的服务器进行处理(图中标记10)。
目前现有的主要方案主要有3种:
方法1:修改Nginx的配置文件,然后执行reload操作。但是,方法1的reload操作会重启worker进程,导致业务请求的平均响应时间增加50%,影响时间通常持续8~10s。另外对于同一个系统的Nginx集群,需要修改多台Nginx的配置文件,操作繁琐,还存在同一个集群的Nginx配置不一致的风险。
方法2:使用Nginx-upsync-module模块,后端服务器的信息配置在consul中,Nginx定时去consul中拉取数据,动态修改Nginx的路由表。但是,方法2的Nginx-upsync-module模块采用每个worker进程与consul建立长连接,当Nginx的worker进程多而且大量系统都采用Nginx做反向代理时,会消耗大量的资源。而且每个worker进程独自拉取数据,存在同一台Nginx机器,worker进程读取的数据不一致的风险。
方法3:使用ngx_http_dyups_module模块动态修改Nginx的路由表。但是,方法3的ngx_http_dyups_module模块是通过RESTful接口将后端服务器信息写入到Nginx的内存中,没有做持久化,执行reload操作或者重启Nginx,就会导致后端服务器信息丢失。另外,对于同一个系统的Nginx集群,需要访问每一台Nginx的RESTful接口写入后端服务器信息,操作繁琐,还存在同一个集群的Nginx配置不一致的风险。
本实施例中,通过ZooKeeper持久化保存后端服务器信息,即一个Nginx集群的后端服务器信息只保存在ZooKeeper的一个节点上,保证一个Nginx集群的后端服务器信息只保存在一个地方。其中,Nginx的master进程连接ZooKeeper获取后端服务器信息并记录版本号,master进程将这些信息放到共享内存中。每个worker进程都是从共享内存中获取后端服务器信息及版本号,worker进程将后端服务器信息直接更新到内存中的反向代理路由表中。worker进程收到用户请求时,直接查找内存的路由表,找到合适的后端服务器,并将请求转发给后端服务器进行处理。
且master进程会定时检查worker进程获取的后端服务器信息的版本号与master进程保存的版本号是否一致,如果不一致,master进程会发信号给worker进程,worker进程会重新从共享内存中读取后端服务器信息,直到版本号一致。另外,ZooKeeper的事件处理机制保证变更ZooKeeper中的数据,可以立即通知到master进程,并反映到worker进程的反向代理路由表中。从而实现了只通过master一个进程连接并拉数据,减少了连接数,同时还保证了每个worker中的数据是一致的。因此,本实施例中通过使用master进程连接ZooKeeper并获取后端服务器信息,大大减少了连接数量、网络传输数据量和系统资源消耗。master使用共享内存和worker进程进行数据交换加上master进程利用版本号检查的机制,保证每个worker进程获取的数据是一致的。ZooKeeper的事件处理机制保证变更ZooKeeper中的数据,可以立即反映到Nginx中。worker进程直接更新内存中的反向代理路由表,不用重启,不影响业务请求。
进一步的,在向已建立的worker进程发送更新信号之前,还包括:
将所述后端服务器信息存入共享内存;
当worker进程被创建时,从所述共享内存中读取所述后端服务器信息和版本号。例如:如图3所示的,master进程将获取的后端服务器信息放入共享内存中,并以获取的次数作为后端服务器信息的版本号保存在共享内存中(图中标记3)。
进一步的,本实施例中还提供一种保障多进程信息一致性的方案,具体在向已建立的worker进程发送更新信号之后,还包括:
检测每个worker进程的后端服务器信息的版本号,是否与所述master进程的一致。
通过所述master进程向版本号不一致的worker进程发送所述更新信号,直到所有的worker进程的后端服务器信息的版本号与master进程的一致。
例如:如图3所示的,master进程定时检查共享内存中每个worker进程和master进程的后端服务器信息的版本号是否一致,master进程会继续向版本号不一致的worker进程发送信号,直到所有的worker进程和master进程的版本号一致。以此保证每个worker进程的后端服务器信息一致(图中标记6)。worker进程收到master进程发送的信号后,更新worker进程内存中的反向代理路由表(图中标记5),更新共享内存中的后端服务器信息的版本号(图中标记4)。master进程利用版本号检查机制,保证所有的worker进程更新成功。
在Nginx做反向代理时,不影响业务请求的情况下,实现每个worker进程一致地、动态地负载后端服务器,并且实现了统一管理后端服务器,便于操作和维护。避免了目前现有的3种主要方案的问题。并且,本实施例也实现了修改一处配置,一个集群中的每台Nginx都可以一致地、动态负载后端服务器,由于是直接更新内存中的反向代理路由表实现动态负载后端服务器的,所以对业务请求没有影响,因此无需对前端系统进行大规模改造,使得本实施例的应用范围广,对原有系统的改造成本低。
进一步的,本实施例中还提供一种Nginx与ZooKeeper发生连接断开后的处理方案,具体在从ZooKeeper中获取Nginx反向代理的后端服务器信息之后,还包括:
当所述Nginx与所述ZooKeeper发生连接断开时。所述master进程通过所述ZooKeeper的API会重新连接所述ZooKeeper,当所述master进程连接上所述ZooKeeper后,会重新从ZooKeeper中获取所述Nginx反向代理的后端服务器信息并存入所述共享内存。向已建立的worker进程发送所述更新信号。
例如:如果Nginx运行过程中,Nginx与ZooKeeper的连接断开(如会话过期、ZooKeeper服务器重启等原因导致的),master进程使用的ZooKeeper的API会自动尝试重新连接ZooKeeper,master进程连接上ZooKeeper后,会重新从
ZooKeeper中获取后端服务器信息,放入共享内存中,并通过信号,让每个worker进程都更新路由表。保证Nginx与ZooKeeper连接断开期间,ZooKeeper中后端服务器信息的变更也能反映到Nginx中。更新ZooKeeper中的数据,有Portal和API接口两种方式,Portal方便管理员手动操作。API接口可以与其他运维管理系统结合,实现全自动地更新、配置后端服务器信息。
进一步的,本实施例中还提供一种worker进程的维护方案,具体在将变化后的后端服务器信息和版本号更新至共享内存之后,还包括:
所述Nginx创建各个worker进程时,从所述共享内存中读取所述后端服务器信息和版本号。将所创建的worker进程的PID(ProcessID,进程标识,即操作系统的内核用于唯一标识进程的一个数值)和所述版本号记录在所述共享内存中,并所述后端服务器信息更新到worker进程的内存中的反向代理路由表。
例如:如图3所示的,Nginx创建每个worker进程时,都从共享内存中读取后端服务器信息及版本号,并将该进程的PID和后端服务器信息的版本号记录在共享内存中(图中标记4)。Nginx将获取到的后端服务端信息直接更新到worker进程内存的反向代理路由表中(图中标记5)。
进一步的,本实施例中还提供一种实时动态调整系统容量的方案,具体在从ZooKeeper中获取Nginx反向代理的后端服务器信息之后,还包括:
当ZooKeeper中增加或者减少节点时,记录所述ZooKeeper中的后端服务器信息的变化情况,并获取变化后的后端服务器信息和版本号。
例如:如图3所示的,在已有后端服务器无法满足性能需求的情况下,使用Portal或API接口向ZooKeeper中增加节点(图中标记7),ZooKeeper中后端服务器信息发生变化,master进程会收到相应的事件,利用ZooKeeper多线程的异步API从ZooKeeper中获取最新的后端服务器信息(图中标记2),连同版本号一起放入共享内存中(图中标记3),并向worker进程发送信号(图中标记6)。
参照如图3所示的系统交互状态,本实施例在具体应用中,所实现的流程包括:
步骤S1:使用Portal或API接口将Nginx反向代理的后端服务器信息持久化保存在ZooKeeper中。所提供的API接口可以将本专利与其他运维管理系统结合,实现全自动地更新配置(图中标记1)。
步骤S2:Nginx启动时,master进程利用ZooKeeper的同步API从ZooKeeper中获取后端服务器信息。并监听ZooKeeper中后端服务器信息是否变化(图中标记2)。
步骤S3:master进程将获取的后端服务器信息放入共享内存中,并以获取的次数作为后端服务器信息的版本号保存在共享内存中(图中标记3)。
步骤S4:Nginx创建每个worker进程时,都从共享内存中读取后端服务器信息及版本号,并将该进程的PID和后端服务器信息的版本号记录在共享内存中(图中标记4)。
步骤S5:Nginx将获取到的后端服务端信息直接更新到worker进程内存的反向代理路由表中(图中标记5)。
步骤S6:master进程定时检查共享内存中每个worker进程和master进程的后端服务器信息的版本号是否一致,master进程会继续向版本号不一致的worker进程发送信号,直到所有的worker进程和master进程的版本号一致。以此保证每个worker进程的后端服务器信息一致(图中标记6)。
步骤S7:在已有后端服务器无法满足性能需求的情况下,使用Portal或API接口向ZooKeeper中增加节点(图中标记7),ZooKeeper中后端服务器信息发生变化,master进程会收到相应的事件,利用ZooKeeper多线程的异步API从ZooKeeper中获取最新的后端服务器信息(图中标记2),连同版本号一起放入共享内存中(图中标记3),并向worker进程发送信号(图中标记6)。
步骤S8:worker进程收到master进程发送的信号后,更新worker进程内存中的反向代理路由表(图中标记5),更新共享内存中的后端服务器信息的版本号(图中标记4)。master进程利用版本号检查机制,保证所有的worker进程更新成功。
步骤S9:客户端向Nginx发起请求时(图中标记8),worker进程会接收到该请求,查找内存中的反向代理路由表(图中标记9),并根据反向代理路由表中的后端服务器信息,及转发规则,将请求转发到后端真实的服务器进行处理(图中标记10)。本发明是直接更新内存中的反向代理路由表实现动态负载后端服务器的,所以对业务请求没有影响。
进一步的,在实际应用中也会采用如图1b所示的集群式的系统,因此参照如图4所示的系统交互状态,本实施例在具体应用中,所实现的流程如图5所示。
步骤S1:Nginx反向代理的后端服务器信息持久化保存在ZooKeeper中。一个集群的Nginx的后端服务器信息,存储在ZooKeeper的一个节点上。某个Nginx集群的后端服务器信息变更时,只需要修改该集群对应的ZooKeeper节点中的数据即可。
步骤S2:Nginx启动时,master进程和ZooKeeper建立连接。
a)如果10ms内连接建立成功,master进程利用ZooKeeper的同步API从ZooKeeper中获取后端服务器信息,并监听ZooKeeper中后端服务器信息的变化和master进程与ZooKeeper的连接状态
b)如果10ms内连接建立失败,则监听连接的状态,如果后续连接建立成功,则再调用ZooKeeper的异步API获取后端服务器信息
步骤S3:master进程将获取到的后端服务器信息放入共享内存中,并以获取的次数作为后端服务器信息的版本号保存在共享内存中。
步骤S4:Nginx创建每个worker进程时,都从共享内存中读取后端服务器信息及版本号,并将该进程的PID和后端服务器信息的版本号记录在共享内存中。
步骤S5:Nginx将获取到的后端服务端信息直接更新到worker进程内存的反向代理路由表中。
步骤S6:master进程定时检查共享内存中每个worker进程和master进程的后端服务器信息的版本号是否一致,master进程会继续向版本号不一致的worker进程发送信号,直到所有的worker进程和master进程的版本号一致。以此保证每个worker进程的后端服务器信息是一致的。如果共享内存中没有后端服务器信息,则不更新路由表。
步骤S7:系统在运行中,如果已有后端服务器无法满足性能需求的情况下,使用Portal或API接口向ZooKeeper中增加节点,ZooKeeper中后端服务器信息发生变化,master进程会收到相应的事件,利用ZooKeeper多线程的异步API从ZooKeeper中获取最新的后端服务器信息,连同版本号一起放入共享内存中,并向worker进程发送信号。
步骤S8:worker进程收到master进程发送的信号后,更新worker进程内存中的反向代理路由表,更新共享内存中的后端服务器信息的版本号。master进程利用版本号检查机制,保证所有的worker进程更新成功。
步骤S9:客户端向Nginx发起请求时,worker进程会接收到该请求,查找内存中的反向代理路由表,并根据反向代理路由表中的后端服务器信息,及转发规则,将请求转发到后端真实的服务器进行处理。本发明是直接更新内存中的反向代理路由表实现动态负载后端服务器的,所以对业务请求没有影响。
步骤S10:如果Nginx运行过程中,Nginx与ZooKeeper的连接断开(如会话过期、ZooKeeper服务器重启等原因导致的),master进程使用的ZooKeeper的API会自动尝试重新连接ZooKeeper,master进程连接上ZooKeeper后,会重新从ZooKeeper中获取后端服务器信息,放入共享内存中,并通过信号,让每个worker进程都更新路由表。保证Nginx与ZooKeeper连接断开期间,ZooKeeper中后端服务器信息的变更也能反映到Nginx中。
步骤S11:更新ZooKeeper中的数据,有Portal和API接口两种方式,Portal方便管理员手动操作。API接口可以与其他运维管理系统结合,实现全自动地更新、配置后端服务器信息。
本发明实施例还提供一种动态负载的调整装置,包括:
处理器、网络接口、存储器、通信总线,所述通信总线用于各组件之间的连接通信;
所述存储器中存储用于所述处理器执行的计算机程序,所述处理器所执行的计算机程序包括:
提取模块,用于从ZooKeeper中获取Nginx反向代理的后端服务器信息;
预处理模块,用于当检测到所述ZooKeeper中的后端服务器信息发生变化时,将变化后的后端服务器信息和版本号更新至共享内存,其中,以所述后端服务器信息被获取的次数作为所获取的后端服务器信息的版本号;
数据管理模块,用于向已建立的worker进程发送更新信号,其中,所述更新信号用于更新所述worker进程的内存中的反向代理路由表。
其中,所述数据管理模块,还用于将所述后端服务器信息存入共享内存,当worker进程被创建时,从所述共享内存中读取所述后端服务器信息和版本号;
还包括:检测模块,用于检测每个worker进程的后端服务器信息的版本号,是否与所述master进程的一致;并通过所述master进程向版本号不一致的worker进程发送所述更新信号,直到所有的worker进程的后端服务器信息的版本号与master进程的一致。
进一步的,还包括:
链接管理模块,用于当所述Nginx与所述ZooKeeper发生连接断开时,所述master进程通过所述ZooKeeper的API重新连接所述ZooKeeper;
所述数据管理模块,还用于所述master进程连接上所述ZooKeeper后,重新从ZooKeeper中获取所述Nginx反向代理的后端服务器信息并存入所述共享内存;并向已建立的worker进程发送所述更新信号;
所述数据管理模块,还用于当ZooKeeper中增加或者减少节点时,记录所述ZooKeeper中的后端服务器信息的变化情况,并获取变化后的后端服务器信息和版本号。
进一步的,还包括:
进程管理模块,用于在所述Nginx创建各个worker进程时,从所述共享内存中读取所述后端服务器信息和版本号;并将所创建的worker进程的PID和所述版本号记录在所述共享内存中,并所述后端服务器信息更新到worker进程的内存中的反向代理路由表。
本实施例中,通过ZooKeeper持久化保存后端服务器信息,即一个Nginx集群的后端服务器信息只保存在ZooKeeper的一个节点上,保证一个Nginx集群的后端服务器信息只保存在一个地方。其中,Nginx的master进程连接ZooKeeper获取后端服务器信息并记录版本号,master进程将这些信息放到共享内存中。每个worker进程都是从共享内存中获取后端服务器信息及版本号,worker进程将后端服务器信息直接更新到内存中的反向代理路由表中。worker进程收到用户请求时,直接查找内存的路由表,找到合适的后端服务器,并将请求转发给后端服务器进行处理。
且master进程会定时检查worker进程获取的后端服务器信息的版本号与master进程保存的版本号是否一致,如果不一致,master进程会发信号给worker进程,worker进程会重新从共享内存中读取后端服务器信息,直到版本号一致。另外,ZooKeeper的事件处理机制保证变更ZooKeeper中的数据,可以立即通知到master进程,并反映到worker进程的反向代理路由表中。从而实现了只通过master一个进程连接并拉数据,减少了连接数,同时还保证了每个worker中的数据是一致的。因此,本实施例中通过使用master进程连接ZooKeeper并获取后端服务器信息,大大减少了连接数量、网络传输数据量和系统资源消耗。master使用共享内存和worker进程进行数据交换加上master进程利用版本号检查的机制,保证每个worker进程获取的数据是一致的。ZooKeeper的事件处理机制保证变更ZooKeeper中的数据,可以立即反映到Nginx中。worker进程直接更新内存中的反向代理路由表,不用重启,不影响业务请求。
在Nginx做反向代理时,不影响业务请求的情况下,实现每个worker进程一致地、动态地负载后端服务器,并且实现了统一管理后端服务器,便于操作和维护。避免了目前现有的3种主要方案的问题。并且,本实施例也实现了修改一处配置,一个集群中的每台Nginx都可以一致地、动态负载后端服务器,由于是直接更新内存中的反向代理路由表实现动态负载后端服务器的,所以对业务请求没有影响,因此无需对前端系统进行大规模改造,使得本实施例的应用范围广,对原有系统的改造成本低。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于设备实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。

Claims (10)

1.一种基于Nginx反向代理的后端服务器动态负载调整方法,其特征在于,包括:
master进程从ZooKeeper中获取Nginx反向代理的后端服务器信息;
当检测到所述ZooKeeper中的后端服务器信息发生变化时,将变化后的后端服务器信息和版本号更新至共享内存,其中,以所述后端服务器信息被获取的次数作为所获取的后端服务器信息的版本号;
向已建立的worker进程发送更新信号,其中,所述更新信号用于更新所述worker进程的内存中的反向代理路由表。
2.根据权利要求1所述的方法,其特征在于,在向已建立的worker进程发送更新信号之前,进一步包括:
将所述后端服务器信息存入共享内存,当worker进程被创建时,从所述共享内存中读取所述后端服务器信息和版本号。
3.根据权利要求1所述的方法,其特征在于,在向已建立的worker进程发送更新信号之后,进一步包括:
检测每个worker进程的后端服务器信息的版本号,是否与master进程的一致;
通过所述master进程向版本号不一致的worker进程发送所述更新信号,直到所有的worker进程的后端服务器信息的版本号与master进程的一致。
4.根据权利要求3所述的方法,其特征在于,在从ZooKeeper中获取Nginx反向代理的后端服务器信息之后,进一步包括:
当所述Nginx与所述ZooKeeper发生连接断开时,所述master进程通过所述ZooKeeper的API重新连接所述ZooKeeper;
所述master进程连接上所述ZooKeeper后,重新从ZooKeeper中获取所述Nginx反向代理的后端服务器信息并存入所述共享内存;
向已建立的worker进程发送所述更新信号。
5.根据权利要求3所述的方法,其特征在于,在将变化后的后端服务器信息和版本号更新至共享内存之后,进一步包括:
所述Nginx创建各个worker进程时,从所述共享内存中读取所述后端服务器信息和版本号;
将所创建的worker进程的进程标识(PID)和所述版本号记录在所述共享内存中,并所述后端服务器信息更新到worker进程的内存中的反向代理路由表。
6.根据权利要求3所述的方法,其特征在于,在从ZooKeeper中获取Nginx反向代理的后端服务器信息之后,进一步包括:
当ZooKeeper中增加或者减少节点时,记录所述ZooKeeper中的后端服务器信息的变化情况,并获取变化后的后端服务器信息和版本号。
7.一种基于Nginx反向代理的后端服务器动态负载调整装置,其特征在于,包括:
处理器、网络接口、存储器、通信总线,所述通信总线用于各组件之间的连接通信;
所述存储器中存储用于所述处理器执行的计算机程序,所述处理器所执行的计算机程序包括:
提取模块,用于从ZooKeeper中获取Nginx反向代理的后端服务器信息;
预处理模块,用于当检测到所述ZooKeeper中的后端服务器信息发生变化时,将变化后的后端服务器信息和版本号更新至共享内存,其中,以所述后端服务器信息被获取的次数作为所获取的后端服务器信息的版本号;
数据管理模块,用于向已建立的worker进程发送更新信号,其中,所述更新信号用于更新所述worker进程的内存中的反向代理路由表。
8.根据权利要求7所述的动态负载的调整装置,其特征在于,所述数据管理模块,还用于将所述后端服务器信息存入共享内存,当worker进程被创建时,从所述共享内存中读取所述后端服务器信息和版本号;
检测模块,用于检测每个worker进程的后端服务器信息的版本号,是否与master进程的一致;并通过所述master进程向版本号不一致的worker进程发送所述更新信号,直到所有的worker进程的后端服务器信息的版本号与master进程的一致。
9.根据权利要求8所述的动态负载的调整装置,其特征在于,还包括:
链接管理模块,用于当所述Nginx与所述ZooKeeper发生连接断开时,所述master进程通过所述ZooKeeper的API重新连接所述ZooKeeper;
所述数据管理模块,还用于所述master进程连接上所述ZooKeeper后,重新从ZooKeeper中获取所述Nginx反向代理的后端服务器信息并存入所述共享内存;并向已建立的worker进程发送所述更新信号;
所述数据管理模块,还用于当ZooKeeper中增加或者减少节点时,记录所述ZooKeeper中的后端服务器信息的变化情况,并获取变化后的后端服务器信息和版本号。
10.根据权利要求9所述的动态负载的调整装置,其特征在于,还包括:
进程管理模块,用于在所述Nginx创建各个worker进程时,从所述共享内存中读取所述后端服务器信息和版本号,并将所创建的worker进程的PID和所述版本号记录在所述共享内存中,并所述后端服务器信息更新到worker进程的内存中的反向代理路由表。
CN201810288911.7A 2018-04-03 2018-04-03 基于Nginx反向代理的后端服务器动态负载调整方法及装置 Active CN108712457B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201810288911.7A CN108712457B (zh) 2018-04-03 2018-04-03 基于Nginx反向代理的后端服务器动态负载调整方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201810288911.7A CN108712457B (zh) 2018-04-03 2018-04-03 基于Nginx反向代理的后端服务器动态负载调整方法及装置

Publications (2)

Publication Number Publication Date
CN108712457A CN108712457A (zh) 2018-10-26
CN108712457B true CN108712457B (zh) 2022-06-07

Family

ID=63867063

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201810288911.7A Active CN108712457B (zh) 2018-04-03 2018-04-03 基于Nginx反向代理的后端服务器动态负载调整方法及装置

Country Status (1)

Country Link
CN (1) CN108712457B (zh)

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112491940A (zh) * 2019-09-12 2021-03-12 北京京东振世信息技术有限公司 代理服务器的请求转发方法及装置、存储介质及电子设备
CN111045721B (zh) * 2019-10-29 2023-08-18 平安科技(深圳)有限公司 动态修改Nginx配置参数的方法、装置及存储介质
CN111221668A (zh) * 2020-01-13 2020-06-02 北京奇艺世纪科技有限公司 一种rs信息更新方法、装置、电子设备及存储介质
CN113541987A (zh) * 2020-04-16 2021-10-22 北京沃东天骏信息技术有限公司 一种更新配置数据的方法和装置
CN111984289A (zh) * 2020-07-31 2020-11-24 广州市百果园信息技术有限公司 一种服务更新方法、装置、设备及存储介质
CN114866418A (zh) * 2021-01-18 2022-08-05 网宿科技股份有限公司 一种配置信息的动态配置方法、系统及服务器
CN112860708A (zh) * 2021-03-16 2021-05-28 深圳前海微众银行股份有限公司 数据一致性修复方法、系统、装置及设备
CN113342492A (zh) * 2021-06-08 2021-09-03 杭州遥望网络科技有限公司 一种任务指令下发方法、装置、系统、电子设备和介质
CN114785686A (zh) * 2022-04-22 2022-07-22 北京金山云网络技术有限公司 配置更新方法、装置和电子设备

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102244685B (zh) * 2011-08-11 2013-09-18 中国科学院软件研究所 一种支持负载均衡的分布式缓存动态伸缩方法及系统
US10404523B2 (en) * 2015-03-09 2019-09-03 Vapor IO Inc. Data center management with rack-controllers
CN106506703B (zh) * 2016-12-28 2018-06-08 掌阅科技股份有限公司 基于共享内存的服务发现方法、装置及系统、服务器
CN106953758A (zh) * 2017-03-20 2017-07-14 北京搜狐新媒体信息技术有限公司 一种基于Nginx服务器的动态配置管理方法及系统

Also Published As

Publication number Publication date
CN108712457A (zh) 2018-10-26

Similar Documents

Publication Publication Date Title
CN108712457B (zh) 基于Nginx反向代理的后端服务器动态负载调整方法及装置
US9262324B2 (en) Efficient distributed cache consistency
US10387451B2 (en) Synchronization system for multiple client devices
CN109842651B (zh) 一种业务不间断的负载均衡方法和系统
KR101963917B1 (ko) 가장 최근에 사용된 문서 목록들의 자동 동기화 기법
CN110597910A (zh) 一种异地数据同步方法、装置和系统
US9390156B2 (en) Distributed directory environment using clustered LDAP servers
CN110647460B (zh) 一种测试资源管理方法、装置和测试客户端
CN115004673B (zh) 消息推送方法、装置、电子设备及计算机可读介质
US20210173730A1 (en) Predictive Microservice Systems and Methods
CN105653198A (zh) 数据处理方法及装置
CN111049928B (zh) 数据同步方法、系统、电子设备及计算机可读存储介质
CN113452774B (zh) 消息推送方法、装置、设备及存储介质
CN111212135A (zh) 消息订阅方法、装置、系统、电子设备及存储介质
CN112612769A (zh) 文件处理方法、装置及存储介质
CN112148206A (zh) 一种数据读写方法、装置、电子设备及介质
CN113079098B (zh) 路由更新的方法、装置、设备和计算机可读介质
CN116541461A (zh) 应用于数据库的数据处理方法、装置、设备及存储介质
US10795747B2 (en) File synchronizing service status monitoring and error handling
CN111382132A (zh) 医学影像数据云存储系统
CN116932505A (zh) 一种数据查询方法、数据写入方法、相关装置和系统
CN113742376A (zh) 一种同步数据的方法、第一服务器以及同步数据的系统
CN108614873B (zh) 一种数据处理方法及装置
US10708343B2 (en) Data repository for a distributed processing environment
CN112351072B (zh) 一种消息推送方法及终端

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant