对服务器集群进行配置的方法及配置中心服务器的制造方法
【专利摘要】本发明公开了对服务器集群进行配置的方法及配置中心服务器,其中,该方法包括:判断信号处理函数是否为预设退出值,如果是,则退出;否则:确定接收到来自待配置服务器的配置请求;从共享内存获取写锁,从数据库获取配置信息,写入共享内存中,释放写锁;若在获取写锁与释放写锁之间接收退出信号,则将信号处理函数设置为预设退出值;从共享内存获取读锁,从共享内存中读取配置信息,下发读取的配置信息,释放读锁,返回执行所述判断信号处理函数是否为预设退出值的步骤;若在获取读锁与释放读锁之间接收退出信号,则将信号处理函数设置为预设退出值。本发明方案能够避免异常退出而导致死锁,实现将配置信息成功下发给待配置服务器。
【专利说明】对服务器集群进行配置的方法及配置中心服务器
【技术领域】
[0001] 本发明涉及服务器配置技术,尤其涉及对服务器集群进行配置的方法及配置中心 服务器。
【背景技术】
[0002] 目前,随着互联网业务的普及,用户量极大增加;针对某项业务,单台服务器已经 远远不能提供服务,基于此,大规模的服务器集群应运而生。服务器集群指互联网业务中, 协作完成一个或者多个特定功能的一批服务器。对服务器集群的所有服务器的配置由配置 系统完成,配置系统的配置中心服务器从数据库中读取配置信息,下发给服务器。
[0003] 现有技术中对服务器集群进行配置的方案包括:配置中心服务器接收来自待配置 服务器的配置请求后,从本地共享内存获取写锁,从配置中心的数据库获取配置信息写入 共享内存中,释放写锁;获取读锁,从本地共享内存中读取配置信息,将读取的配置信息发 送给待配置服务器,释放读锁。
[0004] 写锁和读锁都存储在配置中心服务器的共享内存中。读锁和写锁用于linux进程 间的通信,读锁也叫做共享锁,写锁也叫做独占锁;读锁和写锁常合称为读写锁,当读写锁 以读模式锁住时,是以共享模式锁住的,当读写锁以写模式锁住时,是以独占模式锁住的。 也即是,多个进程或线程,可以同时处于读模式下的读写锁,而当处于写模式下的读写锁 时,只有一个进程是独占的。
[0005] 上述流程中,写锁和释放写锁之间,以及读锁和释放读锁之间的处理时间较长,也 就是写入数据和读取数据需要较长的时间。一旦在写锁和释放写锁之间出现异常,接收到 退出信号,进程将退出,将来不及释放共享内存中保存的写锁;如果后续配置中心服务器接 收到来自待配置服务器的配置请求,将导致死锁,从数据库获取配置信息后将无法写入共 享内存,后续也就无法从共享内存中读取配置信息并下发给待配置服务器。类似地,一旦在 读锁和释放读锁之间出现异常,进程将退出,将来不及释放共享内存中保存的读锁;如果后 续配置中心服务器接收到来自待配置服务器的配置请求,却没有可用的读锁,将导致死锁, 无法将配置信息下发给待配置服务器。
[0006] 综上,现有对服务器集群进行配置的方案存在以下缺陷:出现异常退出时,将导致 死锁,无法将配置信息成功下发给待配置服务器。
【发明内容】
[0007] 本发明提供了一种对服务器集群进行配置的方法,该方法能够避免异常退出而导 致死锁,实现将配置信息成功下发给待配置服务器。
[0008] 本发明提供了一种对服务器集群进行配置的配置中心服务器,该配置中心服务器 能够避免异常退出而导致死锁,实现将配置信息成功下发给待配置服务器。
[0009] -种对服务器集群进行配置的方法,设置信号处理函数,该方法包括:
[0010] 判断信号处理函数是否为预设退出值,如果是,则退出,结束流程;否则: toon] 确定接收到来自待配置服务器的配置请求;
[0012] 从共享内存获取写锁,从数据库获取配置信息,写入共享内存中,释放写锁;若在 获取写锁与释放写锁之间接收退出信号,则将信号处理函数设置为预设退出值;
[0013] 从共享内存获取读锁,从共享内存中读取配置信息,将读取的配置信息发送给待 配置服务器,释放读锁,返回执行所述判断信号处理函数是否为预设退出值的步骤;若在获 取读锁与释放读锁之间接收退出信号,则将信号处理函数设置为预设退出值。
[0014] 一种对服务器集群进行配置的配置中心服务器,该配置中心服务器包括设置单 元、函数判断单元、配置请求处理单元、写入处理单元和读取处理单元;
[0015] 所述设置单元,设置信号处理函数,并接收来自所述写入处理单元和所述读取处 理单元的设置指令,将信号处理函数设置为预设退出值;
[0016] 所述函数判断单元,判断信号处理函数是否为预设退出值,如果是,则不向所述配 置请求处理单元发送启动指令;否则,向所述配置请求处理单元发送启动指令;
[0017] 所述配置请求处理单元,接收来自所述函数判断单元的启动指令,确定接收到来 自待配置服务器的配置请求,向所述写入处理单元发送写入指令;
[0018] 所述写入处理单元,接收来自所述配置请求处理单元的写入指令后,从本地共享 内存获取写锁,从数据库获取配置信息,写入共享内存中,释放写锁,向所述读取处理单元 发送读取指令;若在获取写锁与释放写锁之间接收退出信号,则向所述设置单元发送设置 指令;
[0019] 所述读取处理单元,接收来自所述写入处理单元的读取指令,从共享内存获取读 锁,从共享内存中读取配置信息,将读取的配置信息发送给待配置服务器,释放读锁;若在 获取读锁与释放读锁之间接收退出信号,则向所述设置单元发送设置指令。
[0020] 从上述方案可以看出,本发明中,先对信号处理函数进行判断,如果信号处理函数 不为预设退出值,且接收到来自待配置服务器的配置请求,则从共享内存获取写锁,从数据 库获取配置信息,写入共享内存中,释放写锁;若在获取写锁与释放写锁之间接收退出信 号,则将信号处理函数设置为预设退出值;然后,从共享内存获取读锁,从共享内存中读取 配置信息,将读取的配置信息发送给待配置服务器,释放读锁,返回执行所述判断信号处理 函数是否为预设退出值的步骤;若在获取读锁与释放读锁之间接收退出信号,则将信号处 理函数设置为预设退出值。对于在写锁和释放写锁之间,以及读锁和释放读锁之间接收到 退出信号的情况,本发明结合信号处理函数,在释放完写锁和读锁之后才执行退出信号,避 免了因异常退出而导致的死锁,实现了将配置信息成功下发给待配置服务器。
【专利附图】
【附图说明】
[0021] 图1为本发明对服务器集群进行配置的方法示意性流程图;
[0022] 图2为本发明对服务器集群进行配置的方法流程图实例;
[0023] 图3为本发明对服务器集群进行配置的配置中心服务器的结构示意图。
【具体实施方式】
[0024] 为使本发明的目的、技术方案和优点更加清楚明白,下面结合实施例和附图,对本 发明进一步详细说明。
[0025] 对于在写锁和释放写锁之间,以及读锁和释放读锁之间接收到退出信号的情况, 本发明结合信号处理函数,在释放完写锁和读锁之后才执行退出信号,避免了因异常退出 而导致的死锁。参见图1,为本发明对服务器集群进行配置的方法示意性流程图,本发明方 法预先设置信号处理函数,初始时,可将信号处理函数设置默认值,例如为〇 ;后续流程中, 如果在获取写锁与释放写锁之间,或者在获取读锁与释放读锁之间接收退出信号,则将信 号处理函数设置为预设退出值,例如为1。
[0026] 图1的流程包括以下步骤:
[0027] 步骤101,判断信号处理函数是否为预设退出值,如果是,则退出,结束流程;否 贝1J,执行步骤102。
[0028] 对信号处理函数的判断可随机执行,也可周期性地执行。
[0029] 步骤102,确定接收到来自待配置服务器的配置请求。
[0030] 判断出信号函数不为预设退出值时,如果确定出没有接收到来自待配置服务器的 配置请求,可返回执行步骤101,直到接收到来自待配置服务器的配置请求。
[0031] 步骤103,从共享内存获取写锁,从数据库获取配置信息,写入共享内存中,释放写 锁;若在获取写锁与释放写锁之间接收退出信号,则将信号处理函数设置为预设退出值。
[0032] 对于配置信息没有更新,仍为旧版的情况,无需向本地的共享内存重新写入配置 信息,可直接执行步骤104。为了简化流程,本步骤之前,还可具体包括:判断配置信息是否 有更新,如果有,则执行步骤103 ;否则,执行步骤104。共享内存中配置信息是否有更新可 通过标注实现,具体如:如果配置中心的数据库存储的配置信息进行了更新,则向配置中心 服务器发送带有最新版本号的更新指示,配置中心服务器接收更新指示后确定配置信息有 更新。
[0033] 步骤104,从共享内存获取读锁,从共享内存中读取配置信息,将读取的配置信息 发送给待配置服务器,释放读锁,返回执行步骤101 ;若在获取读锁与释放读锁之间接收退 出信号,则将信号处理函数设置为预设退出值。
[0034] 由于服务器集群中包含较多服务器,且配置信息容量大,每次为待配置服务器下 发配置信息将占用加大的流量资源。本发明中,为了改进该缺陷,可在步骤102的配置请求 中携带待配置服务器当前使用的配置信息的版本号,配置中心服务器接收配置请求后,进 行版本号比较,如果版本号不相同,才进行配置信息的下发;具体地,可采用下述两种实现 方式:
[0035] 方式一,图1流程的步骤104之前,该方法还包括:判断配置请求包含的版本号与 共享内存中配置信息的版本号是否相同,如果是,则向待配置服务器反馈无需更新的响应 消息,否则,执行步骤104。
[0036] 方式二,步骤104获取读锁之后,该方法还包括:判断配置请求包含的版本号与共 享内存中配置信息的版本号是否相同,如果是,则向待配置服务器反馈无需更新的响应消 息,释放读锁,否则,执行步骤104中所述从本地共享内存中获取配置信息的步骤。
[0037] 采用本发明方案,对于在写锁和释放写锁之间,以及读锁和释放读锁之间接收到 退出信号的情况,本发明结合信号处理函数,在释放完写锁和读锁之后才执行退出信号,避 免了因异常退出而导致的死锁,实现了将配置信息成功下发给待配置服务器。
[0038] 下面通过图2,对本发明为服务器集群进行配置的方法进行实例说明,该实例预先 设置信号处理函数,图2的流程包括以下步骤:
[0039] 步骤201,判断信号处理函数是否为预设退出值,如果是,则退出,结束流程;否则 执行步骤202。
[0040] 将信号处理函数的默认值设置为0,预设退出值设置为1。
[0041] 信号处理函数的设置与关于信号处理函数是否为预设退出值的判断,两者是异步 的。当退出信号发生时,会立即对信号处理函数进行设置;而对信号处理函数是否为预设退 出值的判断,可周期性地或随机地执行。具体实现时,信号处理函数(g_iShutDown )可采用 下述配置方式:
[0042] int g_iShutDown = 0; --------将 g_iShutDown 设置为 0 void SetShutDownFlag(int signo) { if(signo == SIGQUIT) { printf("catch SIGQUIT!\n〃); g_iShutDown = 1; ]--如果捕获到设置指令SIGQUIT,则将gJShutDown设置为1 if(signo == SIGUSR1) { printf(〃catch SIGUSR1!\n〃); g-iShutDown = 1; }--如i捕获到设置指令SIGQUIT1,则将gJShutDown设置为1 }
[0043] 其中,SIGQUIT在为写锁与释放写锁之间接收到退出信号时的设置指令,SIGQUIT1 为在读锁与释放读锁之间接收到退出信号时的设置指令。
[0044] 步骤202,判断是否接收到来自待配置服务器的配置请求,如果是,则执行步骤 203 ;否则,返回执行步骤201。
[0045] 配置请求中包含版本号,本步骤中,如果没有接收到配置请求,则继续对信号处理 函数进行判断。
[0046] 步骤203,判断配置信息是否有更新,如果是,则执行步骤204,否则执行步骤208。
[0047] 配置信息由工作人员录入配置中心的数据库中,之后工作人员可对数据库中的配 置信息进行更新,更新后,数据库向配置中心服务器发送包含最新版本号的更新指示,配置 中心服务器将更新项设置为已更新。本步骤中,如果配置中心服务器获知更新项设置为已 更新,则确定出配置信息有更新。
[0048] 步骤204,从共享内存中获取写锁。
[0049] 写锁和读锁都保存在配置中心服务器的共享内存中。
[0050] 写锁和读锁都存储在配置中心服务器的共享内存中。读锁和写锁用于linux进程 间的通信,读锁也叫做共享锁,写锁也叫做独占锁;读锁和写锁常合称为读写锁,当读写锁 以读模式锁住时,是以共享模式锁住的,当读写锁以写模式锁住时,是以独占模式锁住的。 也即是,多个进程或线程,可以同时处于读模式下的读写锁,而当处于写模式下的读写锁 时,只有一个进程是独占的。
[0051] 步骤205,从数据库中获取配置信息,将获取的配置信息写入共享内存。
[0052] 写锁进行写入的过程中,不能进行读取,避免读取的数据不完整。将获取的配置信 息写入共享内存,将覆盖共享内存中之前存储的配置信息,以进行更新。
[0053] 步骤206,接收退出信号,将信号处理函数设置为预设退出值。
[0054] 步骤207,释放写锁。
[0055] 步骤208,从共享内存中获取读锁。
[0056] 具体实践时,可采用Fork子进程实现读锁、版本号判断、数据读取、数据下发以及 释放读锁的步骤。
[0057] 步骤209,判断配置请求包含的版本号与共享内存中配置信息的版本号是否相同, 如果是,则向待配置服务器反馈无需更新的响应消息,否则,从共享内存中读取配置信息, 将读取的配置信息发送给待配置服务器。
[0058] 步骤210,释放读锁,返回执行步骤201。
[0059] 执行步骤201时,由于步骤206中已经信号处理函数设置为预设退出值,则执行退 出,结束流程。
[0060] 采用上述流程方案,如果在步骤204写锁和步骤207释放写锁之间,步骤208读锁 和步骤210释放读锁之间接收到退出信号,将暂时不对退出信号进行响应;将继续执行后 续的步骤,直到释放完写锁和读锁之后,再执行退出。这样,对于在写锁和释放写锁之间, 以及读锁和释放读锁之间接收到退出信号的情况,可在释放完写锁和读锁之后进行退出, 避免了现有技术中在这种情况下的死锁;并且,通过对版本号进行比较,减少了下发的数据 量,节省了资源,简化了流程。
[0061] 配置中心包括配置中心服务器和数据库,数据库用于存储配置信息,在需要时,配 置中心服务器可从数据库获取配置信息。参见图3,为本发明配置中心服务器的结构示意 图,其包括设置单元、函数判断单元、配置请求处理单元、写入处理单元和读取处理单元; [0062] 所述设置单元,设置信号处理函数,并接收来自所述写入处理单元和所述读取处 理单元的设置指令,将信号处理函数设置为预设退出值;
[0063] 所述函数判断单元,判断信号处理函数是否为预设退出值,如果是,则不向所述配 置请求处理单元发送启动指令;否则,向所述配置请求处理单元发送启动指令;
[0064] 所述配置请求处理单元,接收来自所述函数判断单元的启动指令,确定接收到来 自待配置服务器的配置请求,向所述写入处理单元发送写入指令;
[0065] 所述写入处理单元,接收来自所述配置请求处理单元的写入指令后,从本地共享 内存获取写锁,从数据库获取配置信息,写入共享内存中,释放写锁,向所述读取处理单元 发送读取指令;若在获取写锁与释放写锁之间接收退出信号,则向所述设置单元发送设置 指令;
[0066] 所述读取处理单元,接收来自所述写入处理单元的读取指令,从共享内存获取读 锁,从共享内存中读取配置信息,将读取的配置信息发送给待配置服务器,释放读锁;若在 获取读锁与释放读锁之间接收退出信号,则向所述设置单元发送设置指令。
[0067] 较佳地,所述配置请求包含版本号,所述读取处理单元包括第一版本号判断子单 元和第一读取子单元;
[0068] 所述第一版本号判断子单元,接收来自所述写入处理单元的读取指令,判断来自 待配置服务器的配置请求包含的版本号与共享内存中配置信息的版本号是否相同,如果 是,则向待配置服务器反馈无需更新的响应消息;否则向所述第一读取子单元发送启动指 令;
[0069] 所述第一读取子单元,接收来自所述版本号判断子单元的启动指令,从共享内存 获取读锁,从共享内存中读取配置信息,将读取的配置信息发送给待配置服务器,释放读 锁;若在获取读锁与释放读锁之间接收退出信号,则向所述设置单元发送设置指令。
[0070] 较佳地,所述配置请求包含版本号,所述读取处理单元包括第二版本号判断子单 元和第二读取子单元;
[0071] 所述第二读取子单元,接收来自所述写入处理单元的读取指令,从共享内存获取 读锁,向所述第二版本号判断子单元发送版本号判断指令;接收来自所述第二版本号判断 子单元的配置信息读取指令,从共享内存中读取配置信息,将读取的配置信息发送给待配 置服务器,释放读锁;若在获取读锁与释放读锁之间接收退出信号,则向所述设置单元发送 设置指令;
[0072] 所述第二版本号判断子单元,接收来自所述第二读取子单元的版本号判断指令, 判断来自待配置服务器的配置请求包含的版本号与共享内存中配置信息的版本号是否相 同,如果是,则向待配置服务器反馈无需更新的响应消息,释放读锁;否则向所述第二读取 子单元发送配置信息读取指令。
[0073] 较佳地,所述写入处理单元包括更新判断子单元和写入子单元;
[0074] 所述更新判断子单元,接收来自所述配置请求处理单元的写入指令后,判断配置 信息是否有更新,如果有,则向所述写入子单元发送启动指令,否则,向所述读取处理单元 发送读取指令;
[0075] 所述写入子单元,接收来自所述更新判断子单元的启动指令,从共享内存获取写 锁,从数据库获取配置信息,写入共享内存中,释放写锁,向所述读取处理单元发送读取指 令;若在获取写锁与释放写锁之间接收退出信号,则向所述设置单元发送设置指令。
[0076] 以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精 神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。
【权利要求】
1. 一种对服务器集群进行配置的方法,其特征在于,设置信号处理函数,该方法包括: 判断信号处理函数是否为预设退出值,如果是,则退出,结束流程;否则: 确定接收到来自待配置服务器的配置请求; 从共享内存获取写锁,从数据库获取配置信息,写入共享内存中,释放写锁;若在获取 写锁与释放写锁之间接收退出信号,则将信号处理函数设置为预设退出值; 从共享内存获取读锁,从共享内存中读取配置信息,将读取的配置信息发送给待配置 服务器,释放读锁,返回执行所述判断信号处理函数是否为预设退出值的步骤;若在获取读 锁与释放读锁之间接收退出信号,则将信号处理函数设置为预设退出值。
2. 如权利要求1所述的方法,其特征在于,所述配置请求包含版本号,所述获取读锁之 前,该方法还包括: 判断配置请求包含的版本号与共享内存中配置信息的版本号是否相同,如果是,则向 待配置服务器反馈无需更新的响应消息,否则,执行所述获取读锁的步骤。
3. 如权利要求1所述的方法,其特征在于,所述配置请求包含版本号,所述获取读锁之 后,该方法还包括: 判断配置请求包含的版本号与共享内存中配置信息的版本号是否相同,如果是,则向 待配置服务器反馈无需更新的响应消息,释放读锁,否则,执行所述从本地共享内存中获取 配置信息的步骤。
4. 如权利要求1所述的方法,其特征在于,所述获取写锁之前,该方法还包括:判断配 置信息是否有更新,如果有,则执行所述获取写锁的步骤;否则,执行所述获取读锁的步骤。
5. 如权利要求1所述的方法,其特征在于,所述判断信号处理函数是否为预设退出值 为:周期性地判断信号处理函数是否为预设退出值。
6. 如权利要求1至5中任一项所述的方法,其特征在于,判断出信号函数不为预设退出 值时,如果确定出没有接收到来自待配置服务器的配置请求,则返回执行所述判断信号函 数是否为预设退出值的步骤。
7. -种对服务器集群进行配置的配置中心服务器,其特征在于,该配置中心服务器包 括设置单元、函数判断单元、配置请求处理单元、写入处理单元和读取处理单元; 所述设置单元,设置信号处理函数,并接收来自所述写入处理单元和所述读取处理单 元的设置指令,将信号处理函数设置为预设退出值; 所述函数判断单元,判断信号处理函数是否为预设退出值,如果是,则不向所述配置请 求处理单元发送启动指令;否则,向所述配置请求处理单元发送启动指令; 所述配置请求处理单元,接收来自所述函数判断单元的启动指令,确定接收到来自待 配置服务器的配置请求,向所述写入处理单元发送写入指令; 所述写入处理单元,接收来自所述配置请求处理单元的写入指令后,从本地共享内存 获取写锁,从数据库获取配置信息,写入共享内存中,释放写锁,向所述读取处理单元发送 读取指令;若在获取写锁与释放写锁之间接收退出信号,则向所述设置单元发送设置指 令; 所述读取处理单元,接收来自所述写入处理单元的读取指令,从共享内存获取读锁,从 共享内存中读取配置信息,将读取的配置信息发送给待配置服务器,释放读锁;若在获取读 锁与释放读锁之间接收退出信号,则向所述设置单元发送设置指令。
8. 如权利要求7所述的配置中心服务器,其特征在于,所述配置请求包含版本号,所述 读取处理单元包括第一版本号判断子单元和第一读取子单元; 所述第一版本号判断子单元,接收来自所述写入处理单元的读取指令,判断来自待配 置服务器的配置请求包含的版本号与共享内存中配置信息的版本号是否相同,如果是,则 向待配置服务器反馈无需更新的响应消息;否则向所述第一读取子单元发送启动指令; 所述第一读取子单元,接收来自所述版本号判断子单元的启动指令,从共享内存获取 读锁,从共享内存中读取配置信息,将读取的配置信息发送给待配置服务器,释放读锁;若 在获取读锁与释放读锁之间接收退出信号,则向所述设置单元发送设置指令。
9. 如权利要求7所述的配置中心服务器,其特征在于,所述配置请求包含版本号,所述 读取处理单元包括第二版本号判断子单元和第二读取子单元; 所述第二读取子单元,接收来自所述写入处理单元的读取指令,从共享内存获取读锁, 向所述第二版本号判断子单元发送版本号判断指令;接收来自所述第二版本号判断子单元 的配置信息读取指令,从共享内存中读取配置信息,将读取的配置信息发送给待配置服务 器,释放读锁;若在获取读锁与释放读锁之间接收退出信号,则向所述设置单元发送设置指 令; 所述第二版本号判断子单元,接收来自所述第二读取子单元的版本号判断指令,判断 来自待配置服务器的配置请求包含的版本号与共享内存中配置信息的版本号是否相同,如 果是,则向待配置服务器反馈无需更新的响应消息,释放读锁;否则向所述第二读取子单元 发送配置信息读取指令。
10. 如权利要求7、8或9所述的配置中心服务器,其特征在于,所述写入处理单元包括 更新判断子单元和写入子单元; 所述更新判断子单元,接收来自所述配置请求处理单元的写入指令后,判断配置信息 是否有更新,如果有,则向所述写入子单元发送启动指令,否则,向所述读取处理单元发送 读取指令; 所述写入子单元,接收来自所述更新判断子单元的启动指令,从共享内存获取写锁,从 数据库获取配置信息,写入共享内存中,释放写锁,向所述读取处理单元发送读取指令;若 在获取写锁与释放写锁之间接收退出信号,则向所述设置单元发送设置指令。
【文档编号】G06F15/177GK104063355SQ201310091366
【公开日】2014年9月24日 申请日期:2013年3月21日 优先权日:2013年3月21日
【发明者】邢玉东 申请人:腾讯科技(北京)有限公司