发明内容
本发明的目的是提供一种多机集群中主从调度方法,解决多机集群系统中主从态指定的问题,从而克服现有大型空管自动化系调度上方法的不足。
本发明的基本思路是:
在多机集群环境中进行进程主从状态指定的策略,在多个服务器上部署同样的应用系统,通过对应用系统进程进行分组,实现在多台主机上对进程组的主从状态的均衡分配;在多机集群出现单点故障时,将该主机上运行为主态的进程迁移到其他主机上运行;当某个服务器上某个主态应用进程退出时,将其功能迁移到负载相对较低的其他主机上。
本发明的目的是这样达到的:
一种多机集群中主从调度方法,其特征在于:在每台集群主机上安装运行一个相同的集群控制软件,集群控制软件提供编程开发接口库,每个需要使用集群功能的进程使用这个库,并按照接口要求,调用接口获取主从状态并定时上报接口状态。集群各个主机使用相同的集群配置文件,在配置文件中指定集群主机间心跳的时间间隔,主机之间通过心跳报文进行信息传递。在配置文件中还设置进程组划分信息,进程实施按组组合,调度的粒度是进程组,每个组里的进程在运行正常行时保持一个运行优先级,每个组里进程按数据供应链的顺序优先级由高到低排列。每个进程组根据运行时对CPU的占用率配置负载因子,负载因子采用进程组中进程CPU占用率的和。管理机由集群中的主机选举产生,由启动时间小的主机或IP地址字符串较小的主机充当。集群的调度满足集群负载均衡调度的方法,所述均衡调度的方法是将主态进程组从较高负载的服务器上切换到与该进程组具有相同优先因子且整机的负载总和最低的服务器上去,直到无法再进行切换为止,切换时满足进程组切换的充分条件。
所述每个组里的进程在运行正常行时保持一个运行优先级,每个组里进程按数据供应链的顺序优先级由高到低排列,假设一个进程组由n个进程组成,则数据供应链顶端的进程优先级为2n,次优先的优先级为2n-1……依次类推,由此得到进程组的总的优先级,并进行不同主机相同进程组的优先级比较。
所述主机之间通过心跳报文进行信息传递是每隔一段时间T1发送一次,且在接收后立即处理不放入队列。
所述集群的调度满足集群负载均衡调度的方法,其具体步骤是:
定义一个系统中不可能出现的最大负载值MAX_LOAD,当系统满足了进行负载均衡切换的条件后,首先在集群系统中查找当前负载小于参数所指定负载MAX_LOAD的服务器中的最高负载的服务器,由它们组成一个最高负载服务器链表;然后依次遍历链表的每个服务器上处于主态的进程组;假设某最高负载服务器上的n号进程组是处于主态的,于是在当前存活服务器中查找与该主态进程组n具有相同进程组优先因子的最低负载服务器;如果找到则计算两台服务器切换前后的负载差值,如果切换后的差值小于切换前的则说明切换后负载更趋向均衡,那么进行切换,依此类推,直至遍历完该主机上的所有主态进程组为止;如果对该主机的遍历过程中发生了进程组主从切换,那么则跳出对最高负载服务器链表的循环,重新进行处理,进入下一次递归,此时传递的参数仍然是MAX_LOAD,直至遍历完所有最高负载主机上的主态进程组;如果遍历完成而没有发生切换,那么就将此时系统中的最高负载总值作为参数传递到下一次递归运算中。
所述集群切换时满足进程组切换的充分条件,其充分条件是同时满足下列条件:
(1)当前主态进程组的优先因子降低,并且其优先因子已经低于或等于当前其他服务器的该进程组优先因子;
(2)从态进程组的优先因子升高,其优先因子大于或等于其他服务器的该进程组优先因子。
所述集群管理软件与被管理进程间的通信使用TCP协议,集群管理软件为TCP的服务端,被管理进程位于客户端。
所述在每台集群主机上安装运行一个相同的集群控制软件,其集群控制软件是软件cluster,该软件提供不同平台的版本,这些版本内核完全一致;所述集群控制软件提供编程开发接口库,其编程开发接口库是cluster_client。
集群负载均衡调度的方法是对当前集群主机与进程组信息的副本S2进行的操作,在真正实施切换的过程中,逐一比较副本和系统当前的集群主机与进程组信息S1,副本记录最后切换的结果,对其中由主态变为从态的进程组先发出切换命令,然后进入等待,将在第一轮切换完成以后再实施第二轮切换,切换由S1到S2时需要从从态切换为主态的进程组,完成切换过程,在从S1到S2的切换过程中,集群中的主管理机对外部对集群的控制命令不予处理,对于心跳报文只记录收到的时间。
本发明的优点是:本发明充分利用均衡算法的优势,实现了对多机集群系统的负载自动调度,调度更加科学、合理。本调度方法是通用的,实用性广,可以用在类似的集群调度系统里,具有较大的应用前景和价值。
具体实施方式
本发明能支持2至32台主机,这些主机可以在硬件配置、操作系统平台上不一致,但要求部署的进程一致。本发明将主从状态指定到个主机中不同进程中,并具有较强的容错功能。
进程实施按组组合是为了满足:某些进程存在基于本机的IPC(进程间通讯),如果将这些进程的主从分布在不同主机,将出现某主态进程传递的信息送入从态进程而无法进行后续处理的问题,也就是数据供应链断链。所以调度的粒度应该是进程组,当将主机所有进程作为一组时,等同于以主机为单位的切换。
进程组是调度的单位,本例支持100个进程组。每个组里的进程在运行时如果运行正常,可以保持一个运行优先级,如果该进程退出或功能失效,该优先级为零;每个组里进程按数据供应链的顺序优先级由高到低排列,如果一个进程组由n个进程组成,那么数据供应链顶端的进程优先级为2n,次优先的优先级为2n-1……依次类推。这样,进程组的总的优先级就可以由此得到,并可以进行不同主机相同进程组的优先级比较。
集群中一个主机可以有很多个进程组,这些进程组之间没有特别的联系,每个进程组根据运行时对CPU的占用率配置负载因子。负载因子在系统运行中在主机进程组进程运行稳定后,采用进程组中进程CPU占用率的和。
由当前进程组优先因子最高者作为主态向外提供服务,在具有最高进程组优先因子的服务器不止一台时,根据特定的负载均衡算法来决定由哪个服务器上的该进程组成为主态。
主机之间通过心跳报文进行信息传递,由于是多机、不使用传统的RS232接口。心跳报文使用网络数据包的方式传送,使用UDP或链路层协议进行传输,每隔一段时间T1发送一次。心跳信息在处理时不同于一般的网络数据先放入消息队列以后再进行处理,而是在接收后立即处理,心跳信息报文定义如下:
typedef struct
{
SDWORD count; //包号
time_t start_time; //本机启动时间
WORD host_device_code;//报告当前主从状态的主机的设备编号
CHAR ready_status; //本主机的准备就绪态,0:初始态1:正常
态
bool bIsManager; //是否是主管理进程
//WORD wManagerDevice; //本机的当前主管理机设备号
CHAR group_num; //进程组的个数
CHAR local_ready;
struct
{
WORD wGroupCode; //进程组号,从1到n,n为组数
tagRowColBit tagAllRunProcPrior;//同组内所有进程的优先级图
BYTE btStatus; //进程组的状态,0:从态,1为主
态,0xff为中间态
}group_info[MAX_GROUP]; //进程组的信息
}ClusterHeartBeat;
其中:count为一个不断累加的计数器;start_time为启动时间;host_device_code为应用系统中每个主机的编号,该编号不重复;ready_status为主机准备就绪状态,当主机发现集群中已经存在主管理机或者自己即为主管理机时,认为本机就绪可以参加集群调度;bIsManager标识本机是否为管理机;wManagerDevice本机所在集群的主管理机;group_num本机进程组个数;local_ready为本就绪信息,在主机启动的初始阶段,集群管理进程会等待一段时间,这个时间是一般情况下本机所有被管理进程均启动并开始稳定运行的时间,在这个时间以后才能进入主管理机判定的工作;group_info为每个进程组里每个进程的运行状态,其中tagAllRunProcPrior为一个进程组里进程的存活状态,每个进程用1个位表示,其中0为退出,1为运行,按照进程优先级按字节位由低到高表示,这种方法可以使进程存活信息的比较可以在字节一级快速完成;btStatus为进程组的主从态。
心跳信息除了在每个时间间隔到达时发送外,在集群管理主机发现某个进程组中进程发生异常退出或重新运行时,心跳报文将立即发送到其他集群主机。
本发明的管理机是由集群中的主机选举产生,选举方法如下:1.启动时间(秒级)小的主机充当管理机;2.如果两个主机启动时间一致,选取调用对主机IP地址字符串执行inet_addr得到值较小的主机充当管理机。依照此方法总能推选出一个且唯一一个主管理机。
任一集群主机在开始运行时,在一个指定时间T2(一般是心跳周期数倍)的时间里等待其他主机的心跳信息,在收到已存在管理机的报文时提前结束等待,本机为被管理机;在不能收到其他主机心跳信息时,本机为管理机。在集群运行中,如果管理机退出,可按照选举方法推选出管理机;在运行过程中管理机发现存在另一个管理机(这种情况发生在一个原来的管理机突然并入现有系统),可以采用上述两个条件进行判断,选举出新的管理机。在运行过程中,集群可以响应来自监控系统对主管理机的重新指定,这时集群系统立即将当前主管理机降为一般主机,然后将指定主机升级为主管机。在这台新主管理机没有出现故障时,主管理机不遵循当前的推选算法。
本发明集群管理软件与被管理进程间的通信使用TCP协议,集群管理软件为TCP的服务端,被管理进程位于客户端。这样可以使用TCP通信中的一个技术特征:当客户端退出时,服务端如果使用了select多路复用机制,那么服务端与客户端进行TCP通信的Fd将被触发,这时对该Fd调用recv函数,返回值将小于或等于0,这样管理软件就可以实时地获知被管理进程的异常退出,然后进行相应的处理。
集群管理软件与被管理进程间包括如下通信报文:1.从被管理进程发送至管理软件的定时主从状态上报ProcInfoReport;2.从管理进程发送到被管理进程的状态指定报文StatusDef。ProcInfoReport的报文内容定义如下:
typedef struct
{ unsigned short proctype;
int pid;
unsigned char pristat;}ProcInfoReport;
其中proctype为被管理进程的进程类型,该类型由应用系统内部指定,pid为进程的ID,通过操作系统获得,pristat为被管理进程当前的主从态,其取值为如下3个值:主态,从态、中间态;被管理进程初始运行时报告为中间态,相当于向管理进程申请主从状态。
StatusDef报文很简单,仅一个字节,该字节信息有3种可能:主态,从态、中间态。
本发明的重点是集群的负载均衡调度的方法。
集群中进程组切换的充分条件是满足下面的2个条件中的一个,或同时满足:1.当前主态进程组的“存活优先因子”以下简称“优先因子”降低,并且其优先因子已经低于或等于当前其他服务器的该进程组优先因子;2.从态进程组的优先因子升高,使得其优先因子已经大于或等于其他服务器的该进程组优先因子。第一种种情况的出现可能是由进程退出或进程相关的硬件故障引起的,第二种情况肯能是退出的进程开始运行或进程相关的硬件故障恢复。
集群的负载均衡调度方法采用的均衡算法是一种递归算法,算法的基本原则是将主态进程组从较高负载的服务器上切换到与该进程组具有相同优先因子且整机的负载总和最低的服务器上去,直到无法再进行切换为止。具体实现细节如下:定义一个系统中不可能出现的最大负载值MAX_LOAD,当系统满足了进行负载均衡切换的条件后,首先在集群系统中查找当前负载小于参数所指定负载(MAX_LOAD)的服务器中的最高负载的服务器,由它们组成一个“最高负载服务器链表”;然后依次遍历链表的每个服务器上处于主态的进程组。假设某最高负载服务器上的n号进程组是处于主态的,于是在当前存活服务器中查找与该主态进程组n具有相同进程组优先因子的最低负载服务器。如果找到则计算两台服务器切换前后的负载差值,如果切换后的差值小于切换前的则说明切换后负载更趋向均衡,那么进行切换,依此类推,直至遍历完该主机上的所有主态进程组为止。如果对该主机的遍历过程中发生了进程组主从切换,那么则跳出对“最高负载服务器链表”的循环,因为由于发生了切换,所以此时在最高负载服务器链表中的服务器负载总合可能已经不再是系统中的最高负载了,因此重新进行处理,进入下一次递归,此时传递的参数仍然是MAX_LOAD,直至遍历完所有最高负载主机上的主态进程组。如果遍历完成而没有发生切换,那么就将此时系统中的最高负载总值作为参数传递到下一次递归运算中。递归的终点是:在集群中再也找不到具有比传入参数更小的负载总值的服务器了。此刻集群系统中各主机的负载达到了最大程度的平衡。
调度算法是对当前集群主机与进程组信息的副本这里记为S2进行的操作,在真正实施切换的过程如下:逐一比较副本和系统当前的集群主机与进程组信息(这里记为S1),副本记录的是最后切换的结果,对其中由主态变为从态的进程组先发出切换命令,然后进入等待,在第一轮切换完成以后(这时状态为S3)再实施第二轮切换,切换由S1到S2时需要从从态切换为主态的进程组,完成切换过程,两段式切换是为了使系统中不出现两个主态进程组的问题。在从S1到S2的切换过程中,集群中的主管理机对外部对集群的控制命令不予处理,对于心跳报文只记录收到的时间,这样做的目的是为了避免从S1到S2切换过程中引起新的调度。
需要说明的是,本方法在实施的过程中,调度方法位于集群管理软件中,软件还包括进程运行、退出的检查,异常检查等。对集群管理软件来讲,1.初始运行时需要等待一个可配置的时间段,在这个时间段里等待所有进程组的所有进程与管理软件建立TCP连接,这个时间是一个测试值,以通常情况下这些进程能够运行并建立的时间为依据;2.在管理软件经过这个时间以后,开始进入主管理机的推选,这时先连续发出心跳信息,作为请求主管理机的报文,当主管理机收到该报文时,发现该主机仅本机就绪而集群状态未就绪(即等待主管理机给出应答)则立即对该机发出心跳报文,结束其等待,并调用负载调度方法进行主从态指定。3.在运行过程中,如果发现某主机无心跳信息,某进程退出/重新运行,或收到人工干预要求强制负载均衡是都将调用负载均衡方法的程序,而方法调用后的两步实施如前所述。
在实施过程中,网络通信非常重要。网络通信是联系集群管理软件和被管理进程、不同主机集群管理软件,控制软件与集群管理软件之间的纽带。
集群管理软件和被管理进程:这两类软件均在一台集群主机上运行,可选的IPC通信方案很多,为了更好地实现跨平台的特性,本方案选用的是所谓的主机loopback IP地址“127.0.0.1”,协议为TCP协议。管理站作为服务端在一个固定端口上侦听;被管理进程联接这个端口。管理站设计为一个单进程程序,内部使用select多路复用机制,被管理站与管理进程的通信部分中接收模块为一个线程,该线程中一样使用select多路复用机制。TCP协议通信的任何一端退出时,另一端调用recv会返回小于或等于零,在本方案中使用这一技术来作为双方判断对方是否退出的依据,并决定响应动作。当管理软件发现被管理软件退出时将立即发出心跳报文,触发新的负载调度;当被管理软件发现管理软件退出时,应立即将进程设置为中间态,以免对现有集群环境造成不利影响。
集群管理软件间:集群管理软件间的通信主要是心跳信息,使用心跳信息既完成了新加入主机的状态申请,又完成了进程组进程退出、运行产生的负载调度方法的调用请求。
控制软件与集群管理软件间:集群运行不能完全靠管理软件自动完成,必须提供外界人工干预的接口,本发明提供如下控制功能:
1.指定主管理机;2.指定某主机某进程组由主态切换为从态,这样的指定将导致主管理机选择剩余主机中负载最低的主机中该进程组为主态,这样可能导致主机间负载不均,但为了维护人工指定的权威性,将一直维持该状态,一直到满足负载调度方法调用的条件出现为止;
3.指定某主机某进程组由从态切换为主态,主管理机将首先关闭当前为主态的进程组,然后将指定主机指定进程组变为主态,这样同样可能导致这样可能导致主机间负载不均,但处理方法同2;强制现在集群进行负载均衡,强制主管理机调用负载调度方法对集群实施负载均衡。