本发明涉及互联网技术领域,具体地,涉及一种分布式dns主辅同步的方法和系统。
背景技术:
dns(domainnamesystem)即域名系统,是互联网基础资源的核心服务,是用于实现域名和ip地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的ip数字串。
随着访问流量的增大,为保证域名解析服务的质量,一般在网络中部署主、辅两台(或更多)dns服务器。其中辅服务器从主服务器获取区数据文件,起到备份主服务器区数据和负载均衡的作用,减轻主服务器的负载压力并一定程度上提高域名解析服务的效率。
目前的dns主辅同步采用的是遵循axfr(全量区传送,rfc5936)、ixfr(增量区传送,rfc1995)、notify(dns数据变化通知,rfc1996)的dns数据同步机制。采用master-slave架构(即主辅架构),主辅服务器数据同步流程如下:
1.主服务器接收数据更新后,向辅服务器发送notify信息,表明数据有更新;
2.辅服务器接收到notify后,向主服务器返回一个notifyresponse消息并发送soaquery消息查询主服务器区的soa信息。
3.主服务器返回soaresponse消息,辅服务器收到soaresponse消息后,会根据主服务器soa记录的序列号判断是否有必要进行数据同步。若辅服务器soa记录序列号与主服务器soa记录序列号一致,则不进行主辅同步。否则会向主服务器发送zonetransferrequest消息请求区数据传送。
4.主服务器收到请求后返回zonetransferresponse消息,将数据发送给辅服务器。然后辅服务器进行数据更新。
上述技术方案中,由于主服务器和辅服务器的角色是在配置文件中配置的,角色是固定的,因此数据更新只能发送给主服务器不能发给辅服务器。在dns主辅同步中,服务器是单点的。当主服务器宕机后,除非人工介入(修复主服务器,或者将其中一台辅服务器配置为主服务器),否则整个系统将无法进行数据更新并且一段时间后将无法提供域名解析服务,不具备高可用性。
主服务器在数据修改完成后才会通知辅服务器,而且辅服务器的数据同步需要2次交互(第一次为查询soa,第二次为请求更新的数据)。因此在上述技术体系下,一定时间内主服务器和辅服务器数据并不完全一致,导致这段时间内落在不同服务器的dns查询请求会返回不同的数据结果,无法保证域名解析服务的一致性。
技术实现要素:
针对现有技术的缺陷,本发明的目的在于提供一种分布式的、高可用的、高一致性的dns主辅同步方法及系统。在该机制下,由算法自动决定主、辅服务器角色,无需提前人工配置。同时也不存在单点故障,当主服务器故障后,系统会自动选出新的主服务器,不需要人为对配置进行修改;当旧的主服务器恢复后,会自动设置为辅服务器,接收数据更新。而且在整个系统中,主辅服务器均可接收数据更新且数据更新同时生效,保证了整个系统对外的高一致性。
本发明的第一方面,提供了一种分布式dns主辅同步的方法,包括:
将集群中所有启动后的服务器均预先设定为辅服务器角色;
各服务器监听其它服务器发送的角色信息,当判断未存在主服务器时,基于选举机制确定多个服务器中的一个为主服务器,其它自动转换为辅服务器;
所述主服务器每间隔一个时间段向其它辅服务器发送心跳信息,如所述辅服务器超时后仍未收到所述心跳信息,则修改自己的角色为主候选角色,并重新按照前述选举机制确定一个新的主服务器。
进一步地,当服务器收到外部的数据更新包时,先判断本服务器的角色是否是主服务器,如是,则进行更新操作,并在更新完成后同步给其它辅服务器,如否,则将收到的数据更新包转发给主服务器。
进一步地,数据更新时,发送端保存有集群中所有的服务器端口地址,所述数据更新包发送给任一一台服务器,当其中一台发送失败后,再尝试发送给其它服务器。
进一步地,集群中每台服务器均保存有其它服务器的ip地址,并在启动后,都会监听数据管理端口和数据同步端口的消息。
进一步地,所述主服务器收到外部的数据更新包或其它辅服务器转发的数据更新包后,先将更新数据追加到本地日志的最后,并将日志的index加一,完成本地更新操作,然后将数据更新包发送给其它所有辅服务器的数据同步端口,并等待辅服务器的更新日志回应。
进一步地,在设定时间段内,多数辅服务器都回应数据日志更新成功的消息后,所述主服务器就写一条提交数据到日志中,并将该提交日志下发给其它所有辅服务器,同时对真实的dns数据进行更新并生效。
进一步地,所述辅服务器监听数据同步端口的消息,当接收到主服务器发送的数据更新包的消息时,就将该消息追加到本地日志中,同时回应主服务器,并继续等待主服务器更新生效的消息,并在收到更新生效的消息后,写入日志,将生效的数据在dns数据中更新。
进一步地,当老的主服务器从故障中恢复后,继续向其它服务器申请成为主服务器,其它服务器则将包含新的主服务器的消息返回给老的主服务器,所述老的主服务器收到其它所有服务器的回应后,调整自己的角色为辅服务器。
进一步地,所述选举机制包括:所有的服务器当发现集群中不存在主服务器时,将自己的角色调整为主候选服务器,并等待一个随机时间,根据具申请成为主服务器的请求时间先后,最先发送申请的服务器作为主服务器。
本发明的另一方面,还提供了一种分布式dns主辅同步的系统,所述系统包括:
预设置模块,将所有的服务器在启动时预先设定为辅服务器角色;
主服务器生成模块,在判断未存在主服务器时,基于选举机制确定多个服务器中的一个为主服务器,其它自动转换为辅服务器;
主服务器更新模块,所述主服务器每间隔一个时间段向其它辅服务器发送心跳信息,如所述辅服务器超时后仍未收到所述心跳信息,则修改自己的角色为主候选角色,并重新按照前述选举机制确定一个新的主服务器。
与现有技术相比,本发明提供的一种分布式dns主辅同步的方法及系统,达到了如下技术效果:
1、本发明采用选举机制,由系统自动判断主辅服务器的角色分配。主、辅服务器之间通过心跳消息判断主服务器工作状态,宕机后可以自动选举出新的主服务器提供服务,解决了现有的主辅同步技术中服务器角色固定、仅主服务器可以接收数据更新和服务器单点部署导致发生故障后需人工干预的缺陷,保障了dns系统的高可用性。
2、数据更新可发送至集群中的任一服务器,通过主服务器进行数据更新,之后同步给辅服务器。采用更新生效消息保障主辅数据服务器数据生效的同步性,解决了现有的主辅同步技术中主辅服务器数据更新存在延迟,一定时间内主辅服务器数据不完全一致的缺陷,保障了dns系统的高一致性。
附图说明
图1是本发明的现有技术中dns主辅同步方法的流程示意图。
图2是本发明实施例中的分布式dns主辅同步方法进行角色转换的示意图。
图3是本发明实施例中的分布式dns主辅同步方法的流程示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。显然,所描述的实施例为实施本发明的较佳实施方式,所述描述是以说明本发明的一般原则为目的,并非用以限定本发明的范围。本发明的保护范围应当以权利要求所界定者为准,基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明将集群中的服务器分为三种角色,即主服务器、辅服务器和主候选服务器。且该系统服务器之间构成一个dns集群,集群中的每台服务器都知道其他服务器的ip地址,每台服务器启动后,都会监听一个管理端口(553端口),用于集群的数据通信,和一个数据同步端口(554端口),用于集群的数据同步。
参照图2、图3所示,本发明实施例所公开的一种分布式dns主辅同步的方法,主要包括三个过程,第一是主辅选举机制,用于确定集群中的主服务器角色,第二是数据更新机制,用于新的数据更新包在主服务器和辅服务器之间的数据传输和更新,第三是主服务器出现故障及故障恢复后的工作机制,以协调保证整个集群工作的稳定性。下面来对前述三个过程进行详述。
一、主辅选举机制。
首先,将集群中所有启动后的服务器均预先设定为辅服务器角色;在最开始阶段,所有服务器启动后都处于辅服务器的角色。
其次,各服务器监听其它服务器发送的角色信息,当判断未存在主服务器时,基于选举机制确定多个服务器中的一个为主服务器,其它自动转换为辅服务器;
最后,所述主服务器每间隔一个时间段向其它辅服务器发送心跳信息,如所述辅服务器超时后仍未收到所述心跳信息,则修改自己的角色为主候选角色,并重新按照前述选举机制确定一个新的服务器作为主服务器。
具体来说,当所有的服务器发现集群中没有主服务器的时候,就会将自己的角色换成主候选服务器,并等待一个随机时间(最大值为100ms),将申请成为主服务器的消息发送给集群中的其他服务器。由于每台服务器都会等待一个随机时间,所以发送的顺序有先后。这样整个系统就会选取最先发送的那台服务器为主服务器,其他的服务器会记录主服务器的信息,同时将自己的角色变换为辅服务器。主服务器确定后,会每隔一定时间,如500ms,向所有的辅服务器发送心跳信息;辅服务器本地会有超时机制,当一定时间内,如1000ms,没有收到主服务器的心跳信息,就会启动超时机制,将角色修改为主候选,按照开始阶段的流程去申请成为新的主;辅服务器每次收到主服务器的心跳信息,会将超时器重置,用于下次超时计算。采用选举机制,由系统自动判断主辅服务器的角色分配。主辅服务器之间通过心跳消息判断主服务器工作状态,宕机后可以自动选举出新的主服务器提供服务。
二、数据更新机制。
其中,数据更新机制包括数据的更新发送、数据的更新接收、主服务器更新数据流程和辅服务器同步数据流程四个方面。
数据更新发送:数据更新可以发给集群中的任何一台服务器,但为了防止发送的目的服务器不可用,发送端也需要保存集群中的所有服务器ip地址,当一台发送失败后,可以尝试剩下的服务器,提高可用性。
数据更新接收:当服务器接收到外部的数据更新包,会判断本服务器的角色是否是主服务器,如果是主服务器,就进入到主服务器更新数据流程;否则,就会把数据更新包转发给集群中的主服务器,让它进行更新操作,再同步给其他辅服务器。
主服务器更新数据流程:主服务器收到外部的更新数据包,或者从辅服务器转发来的数据更新包后,首先将更新数据追加到本地日志的最后,并将日志index加一,完成本地操作后,将数据更新包发送给所有辅服务器的数据端口,等待辅服务器更新日志回应,当在一定时间内,如200ms,多数辅服务器都回应数据更新成功,那么就写一条提交数据到日志中,并将该提交日志也下发给所有辅服务器,同时对真实的dns数据进行更新。
辅服务器同步数据流程:辅服务器监听数据端口的消息,当接收到主服务器发送过来的数据更新的消息,就将该消息追加到本地日志中,同时回应主服务器:追加成功。继续等待更新生效的消息,等收到更新生效的消息后,写入日志,同时将需要生效的数据在dns数据中进行更新。
本发明中数据的更新可发送至集群中的任一服务器,通过主服务器进行数据更新,之后同步给辅服务器,采用更新生效消息保障主辅数据服务器数据生效的同步性。
三、主服务器出现故障及老的主服务器故障恢复后的工作机制。
主服务器故障后新主服务器生成机制:当主服务器故障后,辅服务器在等待心跳消息时会超时(如超过1000ms仍未收到心跳信息),这时候所有的辅服务器就会根据之前的选举机制开始竞争成为新的主服务器,等其中有一个辅服务器成为新的主服务器后,其他服务器都会变成辅服务器,继续正常工作。在此过程中,即使老的主服务器故障恢复,其他的服务器也都会认为老的主服务器角色已经变成辅服务器。
老主服务器故障恢复后变成辅服务器机制:当老的主服务器从故障中恢复,它会继续尝试申请成为主服务器(即向其他服务器发送申请成为主服务器的消息),但此时整个集群已经有了新的主服务器,所有服务器会将包含新的主服务器的消息返回给老的主服务器,当老的主服务器收到所有服务器的回应后,就会把自己的角色变成辅服务器,从而保证整个集群的稳定。
本领域技术人员应理解,实现上述实施例方法中的部分或全部步骤是可以通过程序来指令相关的硬件来完成,所述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,包括上述实施例方法的相应步骤,而所述的存储介质可以是:rom/ram、磁碟、光盘、存储卡等。
与上述方法相对应的,本发明的另一实施例还同时提供了一种分布式dns主辅同步的系统,该系统包括:
预设置模块,将所有的服务器在启动时预先设定为辅服务器角色;
主服务器生成模块,在判断未存在主服务器时,基于选举机制确定多个服务器中的一个为主服务器,其它自动转换为辅服务器;
主服务器更新模块,所述主服务器每间隔一个时间段向其它辅服务器发送心跳信息,如所述辅服务器超时后仍未收到所述心跳信息,则修改自己的角色为主候选角色,并重新按照前述选举机制确定一个新的主服务器。
其中,数据更新可发送至集群中的任一服务器,通过主服务器进行数据更新,之后同步给辅服务器。
本发明实施例中的系统中的各个模块,用于执行前述实施例中的方法,未详尽之处,请参照方法实施例所述,在此不作赘述。
参照图3所示,以5台服务器a、b、c、d、e构成集群的分布式dns主辅同步系统为例:
(1)启动5台服务器,此时由于处于开始阶段,全部服务器均处于辅服务器角色。启动后,全部服务器立即将本服务器的角色信息通过统一管理端口(本实例中采用553端口)发送给集群中的其他4个服务器。
(2)集群中的每台服务器在接收到其他服务器的角色信息后发现当前集群中没有主服务器时,将自己的角色转换主候选服务器,在等待一个随机时间(最大值为100ms)后,将申请成为主服务器的消息发送给集群中的其他服务器。由于每台服务器等待时间是随机的,因此5台服务器间发送成为主服务器的申请有先后之分。由于选举机制,最先发送成为主服务器申请的服务器将被系统选为主服务器。在本实例中,服务器b等待的随机时间最短,最早发出了成为主服务器申请,经过其他4个服务器的投票成为主服务器。服务器b将角色信息(主服务器)同步至其他服务器,其他4个服务器记录主服务器信息,并自动转换为辅服务器。
(3)集群正常向外提供域名解析服务,每隔一定时间(本实例中采用500ms)服务器b会向其他4个辅服务器发送心跳消息,表明自己处于正常工作状态。
(4)当dns数据发生更新后,数据更新包可通过数据同步端口(本实例中采用554端口)发送至集群中任一服务器,由于发送端保存集群中所有服务器数据,因此一旦发送失败仍可将更新数据发送至其他服务器。当集群中有服务器收到数据更新包后会立即判断自己是否为主服务器。若是,则进入数据跟新流程;否则会将更新数据转发至主服务器。本实例中共进行三次试验:首先将更新数据发送至服务器b(主服务器),可以正常进入数据更新流程;其次将更新数据发送至服务器a(辅服务器),服务器a收到更新数据后将数据转发至服务器b,服务器b收到更新数据后可以正常进入数据更新流程;最后为模拟数据发送失败,暂停服务器a,更新数据发送至服务器a后因探测到发送失败,发送端转而将更新数据发送至服务器b,此时因服务器b刚好为主服务器,直接正常进入数据更新流程。重启服务器a,服务器a默认为辅服务器。
(5)主服务器b收到数据更新包后,首先将更新数据追加到本地日志的最后,并将日志中index值加一,完成本地操作后,服务器b将数据更新包通过554端口发送至其他4个辅服务器,等待辅服务器回应,在200ms内,由于服务器a、c、d、e均完成数据更新并回应服务器b数据更新成功,服务器b收到了多数服务器的数据更新成功回应后将一条提交数据(包含变更生效信息)写入日志中,并将该日志下发给所有辅服务器,并对真实dns数据进行更新。
(6)辅服务器a、c、d、e收到主服务器b发送的变更生效信息后即对真实dns数据进行更新。
(7)主服务器故障后系统会自动选举出新的主服务器提供服务。在本实例中为模拟主服务器故障,暂时暂停服务器b。此时服务器b无法再定期发送心跳信号,辅服务器具备超时机制,当一定时间内(本实例中采用1000ms)没有收到主服务器的心跳消息即认为主服务器宕机,启动超时机制。本实例中,当服务器b宕机后,辅服务器a、c、d、e均会启动超时机制,将各自的角色修改为主候选服务器,类似步骤2)过程,重新竞争选出新的主服务器。在本实例中,服务器e成为新的主服务器。
(8)重启老的主服务器b,此时服务器b仍会继续尝试申请成为主服务器,但此时由于集群中存在新的主服务器e,因此所有服务器会将包含新的主服务器的消息返回给服务器b,服务器b接收到消息后会转变为辅服务器提供服务。
上述说明示出并描述了本发明的若干优选实施例,但如前所述,应当理解本发明并非局限于本文所披露的形式,不应看作是对其他实施例的排除,而可用于各种其他组合、修改和环境,并能够在本文所述发明构想范围内,通过上述教导或相关领域的技术或知识进行改动。而本领域人员所进行的改动和变化不脱离本发明的精神和范围,则都应在本发明所附权利要求的保护范围内。
1.一种分布式dns主辅同步的方法,其特征在于,所述方法包括:
将集群中所有启动后的服务器均预先设定为辅服务器角色;
各服务器监听其它服务器发送的角色信息,当判断未存在主服务器时,基于选举机制确定多个服务器中的一个为主服务器,其它自动转换为辅服务器;
所述主服务器每间隔一个时间段向其它辅服务器发送心跳信息,如所述辅服务器超时后仍未收到所述心跳信息,则修改自己的角色为主候选角色,并重新按照前述选举机制确定一个新的主服务器。
2.根据权利要求1所述的方法,其特征在于,当服务器收到外部的数据更新包时,先判断本服务器的角色是否是主服务器,如是,则进行更新操作,并在更新完成后同步给其它辅服务器,如否,则将收到的数据更新包转发给主服务器。
3.根据权利要求2所述的方法,其特征在于,数据更新时,发送端保存有集群中所有的服务器端口地址,所述数据更新包发送给任一一台服务器,当其中一台发送失败后,再尝试发送给其它服务器。
4.根据权利要求2所述的方法,其特征在于,集群中每台服务器均保存有其它服务器的ip地址,各服务器在启动后,都会监听各自的数据管理端口和数据同步端口的消息。
5.根据权利要求3或4所述的方法,其特征在于,所述主服务器收到外部的数据更新包或其它辅服务器转发的数据更新包后,先将更新数据追加到本地日志的最后,并将日志的index加一,完成本地更新操作,然后将数据更新包发送给其它所有辅服务器的数据同步端口,并等待辅服务器的更新日志回应。
6.根据权利要求5所述的方法,其特征在于,在设定时间段内,多数辅服务器都回应数据日志更新成功的消息后,所述主服务器就写一条提交数据到日志中,并将该提交日志下发给其它所有辅服务器,同时对真实的dns数据进行更新并生效。
7.根据权利要求5所述的方法,其特征在于,所述辅服务器监听数据同步端口的消息,当接收到主服务器发送的数据更新包的消息时,就将该消息追加到本地日志中,同时回应主服务器,并继续等待主服务器更新生效的消息,并在收到更新生效的消息后,写入日志,将生效的数据在dns数据中更新。
8.根据权利要求1所述的方法,其特征在于,当老的主服务器从故障中恢复后,继续向其它服务器申请成为主服务器,其它服务器则将包含新的主服务器的消息返回给老的主服务器,所述老的主服务器收到其它所有服务器的回应后,调整自己的角色为辅服务器。
9.根据权利要求1所述的方法,其特征在于,所述选举机制包括:所有的服务器当发现集群中不存在主服务器时,将自己的角色调整为主候选服务器,并等待一个随机时间,根据申请成为主服务器的请求时间先后,最先发送申请的服务器作为主服务器。
10.一种分布式dns主辅同步的系统,其特征在于,所述系统包括:
预设置模块,将所有的服务器在启动时预先设定为辅服务器角色;
主服务器生成模块,在判断未存在主服务器时,基于选举机制确定多个服务器中的一个为主服务器,其它自动转换为辅服务器;
主服务器更新模块,所述主服务器每间隔一个时间段向其它辅服务器发送心跳信息,如所述辅服务器超时后仍未收到所述心跳信息,则修改自己的角色为主候选角色,并重新按照前述选举机制确定一个新的主服务器。
技术总结