一种基于分布式的数据同步方法及***
技术领域
本发明涉及网络通信技术,特别涉及一种基于分布式的数据同步方法及***。
背景技术
随着网络的普及,网络用户在不断增加,网络通信***规模也在不断扩大。网络通信***中包括大量网络设备来支持数量众多的网络用户之间的通信,为此,各个网络设备之间要实现诸如用户在线状态等数据的同步。比如:对于即时通讯(IM,Instant Messaging)***来说,每一即时通讯服务器要保存全局的用户在线状态信息(即:当前即时通信***中所有用户的在线状态信息),以便用户能够登录即时通讯服务器查询特定用户信息或获取好友在线情况等,并且基于该全局的用户在线状态信息才能准确高效的实现通信,因此,各个即时通讯服务器上保存的全局用户在线状态信息要保持一致(即:同步)。
现有的实现数据同步的技术大致可以分为两类:1、中心控制服务器定时轮询的方式,2、分支服务器主动上报的方式。其中,在即时通讯***中,包括:中心控制服务器及其连接的多个分支服务器。图1为现有数据同步方法的处理流程示意图。本图中,中心控制服务器连接分支服务器1和分支服务器2,中心控制服务器、分支服务器1和分支服务器2分别保存全局的用户数据(即:***管辖的所有用户的数据)。并且,分支服务器1和分支服务器2能够获知各自所辖用户的数据变化,并能实时更新各自所辖用户的数据。下面分别以分支服务器1和分支服务器2与中心控制服务器之间的数据同步方式为例,对上述两类数据同步方式加以说明。其中,中心控制服务器与分支服务器1之间的同步方式为定时轮询方式;中心控制服务器与分支服务器2之间的同步方式为主动上报方式。
所谓中心控制服务器轮询的方式就是:中心控制服务器定时查询各个分支服务器的数据。如图1所示,中心控制服务器定时发送查询请求给分支服务器1,分支服务器1再向中心控制服务器返回自身当前的用户数据。当有分支服务器的用户数据出现更新时,中心控制服务器更新自身的全局用户数据并发送更新后的全局用户数据给其它各个分支服务器,以更新其它各个分支服务器的全局用户数据。
所谓分支服务器主动上报的方式为:各个分支服务器在自身用户数据发生变化(比如:有新用户登录或有用户刚刚离线)时,主动向中心控制服务器上报自身当前最新的用户数据。如图1所示,分支服务器2在自身用户数据发生变化时,主动发送当前最新的用户数据至中心控制服务器。中心控制服务器在接收到分支服务器主动上报的用户数据之后,对自身保存的全局用户数据进行更新,并将更新后的全局用户数据发送给其它各个分支服务器,从而各个其它分支服务器也能及时更新各自的全局用户数据,以实现数据同步。
现有的两种同步技术在各自的应用领域内可以一定程度满足需求,但在应用于大容量***时,都存在比较严重的问题。当采用中心控制服务器定时轮询的方式时,中心控制服务器输入输出的数据包量将达到不可接受的程度,并且这个数据包量将随着***规模的扩大而呈线性增长,从而使得中心控制服务器几乎无法实现;当采用分支服务器主动上报的方式时,虽然能一定程度减少中心控制服务器输出的数据包量,但不能有效减少输入的数据包量,该种方式同样无法应用于大容量的***之中。
发明内容
有鉴于此,本发明的主要目的在于提供一种基于分布式的数据同步方法及***,能实现分布式的数据同步,减轻中心控制服务器的处理负担,适于大容量通信***的数据同步。
为达到上述目的,本发明的技术方案是这样实现的:
本发明公开了一种基于分布式的数据同步方法,该方法应用于包括:中心控制服务器和至少一个分支服务器的***;将所述至少一个分支服务器划分为至少一个同步链,每一同步链为由至少一个分支服务器链接成的非交叉链、且仅包括一个作为头节点的分支服务器;该方法还包括:
每一分支服务器在自身所辖用户的用户数据发生变化时或定时主动上报自身所辖用户数据给中心控制服务器,该中心控制服务器按所收到的用户数据对自身保存的全局用户数据进行更新,所述全局用户数据为整个***管辖的所有用户的数据;
该中心控制服务器定时发送自身当前保存的全局用户数据至各个作为头节点的分支服务器,每一作为头节点的分支服务器在收到来自中心控制服务器的全局用户数据后对自身所在同步链内各个分支服务器所保存的全局用户数据进行更新。
其中,所述分支服务器主动上报自身所辖用户数据给中心控制服务器为:该分支服务器当前自身所辖所有用户的最新用户数据或自身所辖用户的用户数据中当前发生变化的用户数据。
其中,当同步链仅包括一个分支服务器时,该分支服务器为所述作为头节点的分支服务器;
所述作为头节点的分支服务器对自身所在同步链内各个分支服务器所保存的全局用户数据进行更新的方法包括:该作为头节点的分支服务器按来自中心控制服务器的全局用户数据,对自身保存的全局用户数据中除自身所辖用户数据之外的所有用户数据进行更新。
其中,当同步链包括多个分支服务器时,该同步链进一步包括:作为尾节点的分支服务器;
所述作为头节点的分支服务器对自身所在同步链内各个分支服务器所保存的全局用户数据进行更新的方法包括:
该作为头节点的分支服务器按来自中心控制服务器的全局用户数据,对自身保存的全局用户数据中除自身所辖用户数据之外的所有用户数据进行更新,再输出更新后的全局用户数据至所述作为尾节点的分支服务器;该作为尾节点的分支服务器在收到所述更新后的全局用户数据后更新自身保存的全局用户数据。
其中,当同步链包括多于两个的分支服务器时,该同步链进一步包括:至少一个作为中间节点的分支服务器;
所述作为头节点的分支服务器对自身所在同步链内各个分支服务器所保存的全局用户数据进行更新的方法中,所述作为头节点的分支服务器输出更新后的全局用户数据至作为尾节点的分支服务器的处理包括:
该作为头节点的分支服务器输出更新后的全局用户数据至自身连接的作为中间节点的分支服务器;每一作为中间节点的分支服务器在收到来自作为头节点或中间节点的分支服务器的更新后的全局用户数据之后对自身保存的全局用户数据进行更新,并输出更新后的全局用户数据至自身连接的作为中间节点或尾节点的分支服务器;所述作为尾节点的分支服务器从所述作为中间节点的分支服务器接收所述更新后的全局用户数据。
其中,所述用户数据为用户在线状态信息,所述全局用户数据为全局用户在线状态信息。
其中,所述全局用户在线状态信息以全局在线状态表的形式存在于中心控制服务器和各个分支服务器之中。
本发明还公开了一种基于分布式的数据同步***,该***包括:中心控制服务器和至少一个分支服务器;该***包括:由所述至少一个分支服务器划分成的至少一个同步链;每一同步链为由至少一个分支服务器链接成的非交叉链、且仅包括一个作为头节点的分支服务器;
每一分支服务器,用于在自身所辖用户的用户数据发生变化时、或定时输出自身所辖用户数据给中心控制服务器;在每一同步链中,所述作为头节点的分支服务器用于从所述中心控制服务器接收全局用户数据,并对自身所在同步链内各个分支服务器所保存的全局用户数据进行更新,所述全局用户数据为该***管辖的所有用户数据;
所述中心控制服务器,用于从所述分支服务器接收用户数据并对自身保存的全局用户数据进行更新,定时发送自身当前保存的全局用户数据至各个作为头节点的分支服务器。
其中,当同步链仅包括一个分支服务器时,该分支服务器为所述作为头节点的分支服务器,在该同步链中,所述作为头节点的分支服务器用于按所述来自中心控制服务器的全局用户数据,对自身保存的全局用户数据中除自身所辖用户数据之外的所有用户数据进行更新;
当同步链包括多个分支服务器时,该同步链进一步包括:作为尾节点的分支服务器;所述作为头节点的分支服务器用于按所述来自中心控制服务器的全局用户数据,对自身保存的全局用户数据中除自身所辖用户数据之外的所有用户数据进行更新,并输出更新后的全局用户数据至所述作为尾节点的分支服务器;该作为尾节点的分支服务器用于在收到所述更新后的全局用户数据后更新自身保存的全局用户数据。
其中,当同步链包括多于两个的分支服务器时,该同步链进一步包括:至少一个作为中间节点的分支服务器;
所述作为头节点的分支服务器用于输出更新后的全局用户数据至自身连接的作为中间节点的分支服务器;
每一作为中间节点的分支服务器用于在收到更新后的全局用户数据之后对自身保存的全局用户数据进行更新,并输出更新后的全局用户数据至自身连接的作为中间节点或尾节点的分支服务器;
所述作为尾节点的分支服务器用于从所述作为中间节点的分支服务器接收所述更新后的全局用户数据。
由上述方案可以看出,本发明的关键在于:各个分支服务器主动上报各自用户数据的更新情况给中心控制服务器;将各个分支服务器划分为至少一个同步链,中心控制服务器以同步链为单位对各个分支服务器的用户数据进行更新。
因此,本发明所提供的基于分布式的数据同步方法及***,能以同步链为单位(即以分布的方式)实现各个分支服务器的数据同步,并同时利用主动上报的方式来实时更新中心控制服务器的数据,从而利于实现大容量***的数据同步,相对于现有技术能显著减少中心控制服务器输入输出的数据包量,易于中心控制服务器的实现与扩容。
附图说明
图1为现有数据同步方法的处理流程示意图;
图2为本发明***一较佳实施例的连接关系示意图;
图3为本发明方法中分支服务器更新中心控制服务器数据的处理流程图;
图4为本发明方法中中心控制服务器更新各分支服务器数据的处理流程图;
图5为本发明一较佳实施例的数据同步处理示意图。
具体实施方式
下面结合附图及具体实施例对本发明再作进一步详细的说明。
本发明提供了一种基于分布式的数据同步***,该***由中心控制服务器和一个以上(即:一个或多个,也可称为至少一个)分支服务器构成。其中,中心控制服务器作为中心控制节点,而所述一个以上的分支服务器则组成一个以上的同步链。在每一同步链中,每一节点就是一个分支服务器,各个节点依次相连呈非交叉链状结构,并且仅有一个头节点。所谓非交叉链结构就是说各个节点呈“一”字形排列;其中,如果非交叉链中仅包括一个节点,则仅包括头节点,如果非交叉链中包括两个节点,则包括头节点及其连接的尾节点;如果非交叉链中包括多于两个节点,则包括头节点、至少一个中间节点和尾节点,该头节点仅连接一个下一级节点(即中间节点),而每一中间节点仅连接一个上一级节点(头节点或中间节点)、且仅连接一个下一级节点(中间节点或尾节点),尾节点则仅连接一个上一级节点(中间节点)。另外,中心控制节点仅向各个同步链的头节点输出数据,各个同步链中的节点也只能向各自的下一级节点输出数据;而另一方面,同步链中的各个节点(即:分支服务器)均直接连接中心控制节点(即:中心控制服务器),这样,各个分支服务器可分别向中心控制服务器主动上报各自用户数据的更新情况,使中心控制服务器能够实时得到最新的全局用户数据。
图2为本发明***一较佳实施例的连接关系示意图。如图2所示,作为中心控制节点的中心控制服务器连接三条同步链的头节点,这三条同步链包括:同步链1、同步链2和同步链3;其各自的头节点分别为:头节点1、头节点2和头节点3。在同步链1中,包括:头节点1及其连接的下一级节点——节点11,以及该节点11连接的下一级节点——节点12;在同步链2中,包括:头节点2及其连接的下一级节点——节点21;在同步链3中,包括:头节点3及其连接的下一级节点——节点31,该节点31连接的下一级节点——节点32,该节点32连接的下一级节点——节点33。这里,除中心控制节点之外,每一节点均代表一个分支服务器,以下所述中心控制节点代表中心控制服务器,而除中心控制节点以外的其它节点就代表分支服务器。实际上,除中心控制节点之外的每一节点均连接中心控制节点,在图2中,为使同步链的连接关系更为清晰,并未示出这些节点与中心控制节点的连接。
其中,除中心控制节点以外的其它各个节点均管辖着一定范围的用户,它们可以实时获知各自所辖用户的数据变化,比如:用户上线/离线的情况。当某一节点的用户数据发生变化时,比如:有新的用户上线或者刚刚有用户离线时,该节点将主动向中心控制节点上报自身当前最新的用户数据(比如:用户在线状态信息)。这样,中心控制节点能够实时得到最新的全局用户数据。这里,各个节点向中心控制节点上报的最新用户数据可以为自身所辖所有用户当前最新的用户数据,也可以为自身所辖用户的用户数据中当前发生变化的用户数据。
同时,中心控制节点还定时对各个其它节点的全局用户数据进行更新,以保证***中各个节点保存的全局用户数据能够同步。该中心控制节点对其它各个节点的更新是以同步链为单位进行的。首先,中心控制节点将自身当前最新的全局用户数据分别输出至自身连接的各个同步链的头节点,如图2的头节点1、头节点2和头节点3。然后,各个头节点再在本同步链内部进行全局用户数据的更新处理。
在同步链1中,头节点1在收到来自中心控制节点的全局用户数据后对自身保存的全局用户数据进行更新,然后发送更新后的全局用户数据至自身连接的下一级节点(即:节点11);该节点11按所收到的全局用户数据对自身保存的全局用户数据进行更新,并输出更新后的全局用户数据至自身连接的下一级节点(即:节点12)。该节点12将自身保存的全局用户数据更新为从节点11收到的全局用户数据,结束本同步链1的全局用户数据的更新处理。在同步链2中,头节点2在收到来自中心控制节点的全局用户数据后对自身保存的全局用户数据进行更新,然后发送更新后的全局用户数据至自身连接的下一级节点(即:节点21);该节点21按所收到的全局用户数据对自身保存的全局用户数据进行更新,从而结束本同步链2的全局用户数据的更新处理。类似的,在同步链3中,头节点3将自身保存的全局用户数据更新为来自中心控制节点的最新的全局用户数据,并输出更新后的全局用户数据至自身连接的下一级节点(即:节点31);该节点31也将自身保存的全局用户数据更新为从上一级节点(即:头节点3)收到的全局用户数据,并向自身连接的下一级节点(即:节点32)输出最新的全局用户数据;该节点32与节点31的处理相同,按来自上一级节点(即:节点31)的全局用户数据更新自身保存的全局用户数据,并将更新后的全局用户数据输出给下一级节点(即:节点33);该节点33收到来自节点32的全局用户数据后,更新自身保存的全局用户数据,从而结束本同步链3的全局用户数据更新处理。这里,上述各个节点在更新了自身保存的全局用户数据之后,可即时下发更新后的全局用户数据给其下一级节点,也可按预设的周期定时向其下一级节点发送自身保存的最新的全局用户数据。这里,每一中间节点在按来自上一级节点的全局用户数据更新自身保存的全局用户数据时,更新的是全局用户数据中除自身所辖用户数据之外的其它用户数据,即:将自身保存的全局用户数据中除自身所辖用户数据之外的其它用户数据更新为来自上一级节点的全局用户数据中除该中间节点所辖用户数据之外的其它用户数据。
基于上述本发明***的连接关系和工作原理,本发明还提出了一种基于分布式的数据同步方法,该方法主要包括两个部分:一、分支服务器更新中心控制服务器数据,即:各个分支服务器在自身保存的用户数据发生变化时或定时主动上报自身所辖用户数据给中心控制服务器,该中心控制服务器按各个分支服务器主动上报的用户数据实时更新自身保存的全局用户数据;二、中心控制服务器更新各分支服务器的全局用户数据,即:中心控制服务器定时向各个同步链下发最新的全局用户数据,各个同步链各自分别完成本同步链内部各个分支服务器全局用户数据的更新。下面结合图3和图4对本发明方法的处理加以详细阐述,本方法的实施例中,要进行同步的用户数据为用户在线状态信息,则全局用户数据就为全局用户在线状态信息。
图3为本发明方法中分支服务器更新中心控制服务器数据的处理流程图。如图3所示,对于一个分支服务器而言,其更新中心控制服务器数据的处理具体包括:
步骤301:分支服务器定时检测自身所辖各个用户的在线状态。
步骤302:判断是否检测到有新用户刚刚上线、或者有用户刚刚离线,如果是,则执行步骤303;否则返回步骤301。
步骤303:该分支服务器对自身保存的用户在线状态信息进行更新,并主动上报自身当前保存的用户在线状态信息给中心控制服务器。这里,分支服务器上报的用户在线状态信息可以为其当前保存的自身所辖所有用户最新的用户在线状态信息,也可为自身所辖所有用户的用户在线状态信息中发生变化的用户在线状态信息(比如:刚刚离线和/或刚刚上线的用户的在线状态信息、)
步骤304:中心控制服务器按接收到的用户在线状态信息更新自身保存的全局用户在线状态信息,然后返回步骤301。其中,如果收到的是发生变化的用户的在线状态信息,则更新自身保存的全局用户在线状态信息中这些发生变化的用户的在线状态信息;如果收到的是某分支服务器所辖所有用户最新的用户在线状态信息,则将当前保存的该分支服务器所辖所有用户的用户在线状态信息全部替换为所收到的该分支服务器所辖所有用户最新的用户在线状态信息。
图4为本发明方法中中心控制服务器更新各分支服务器数据的处理流程图。中心控制服务器要针对每一由若干分支服务器构成的同步链进行数据更新处理,其中针对一个同步链进行的更新处理如图4所示,具体步骤包括:
步骤401:中心控制服务器定时向当前同步链中作为头节点的分支服务器请求更新全局用户在线状态信息,并发送自身当前保存的全局用户在线状态信息至该作为头节点的分支服务器
步骤402:该作为头节点的分支服务器按来自中心控制服务器的全局用户在线状态信息,对自身保存的全局用户在线状态信息中除自身所辖用户的用户在线状态信息之外的所有用户在线状态信息进行更新(即:将自身保存的全局用户在线状态信息中除自身所辖所有用户在线状态信息之外的其它用户在线状态信息全部更新为来自中心控制服务器的全局用户在线状态信息中除该作为头节点的分支服务器管辖的用户在线状态信息之外的其它用户在线状态信息),并输出该更新后的全局用户在线状态信息给自身连接的作为下一级节点的分支服务器。
当同步链仅包括一个分支服务器时,该分支服务器就是作为头节点的分支服务器,那么当该作为头节点的分支服务器更新了自身保存的全局在线状态信息之后,就不必向作为下一级节点的分支服务器输出全局用户在线状态信息了,后续的步骤403也不必执行。
当同步链包括两个分支服务器时,该同步链除了包括作为头节点的分支服务器之外还包括:作为尾节点的分支服务器;此时,本步骤402中从作为头节点的分支服务器接收全局用户在线状态信息的作为下一级节点的分支服务器就是该作为尾节点的分支服务器,那么当该作为尾节点的分支服务器收到所述更新后的全局用户在线状态信息后就更新自身保存的全局用户在线状态信息,从而结束该同步链的更新处理,所以下面的步骤403也不必执行。
当同步链包括多于两个的分支服务器时,该同步链处理包括作为头节点和尾节点的分支服务器还进一步包括:至少一个作为中间节点的分支服务器;本步骤402中从作为头节点的分支服务器接收全局用户在线状态信息的作为下一级节点的分支服务器就是作为中间节点的分支服务器。
步骤403:每一作为中间节点的分支服务器在收到来自上一级节点(头节点或中间节点)的全局用户在线状态信息之后,对自身全局用户在线状态信息进行更新,再向自身连接的作为下一级节点(中间节点或尾节点)的分支服务器发送全局用户在线状态信息;而作为尾节点的分支服务器则在收到来自上一级节点(中间节点)的全局用户在线状态信息之后,对自身全局用户在线状态信息进行更新,从而结束本同步链的更新处理
图5为本发明一较佳实施例的数据同步处理示意图。在本实施例中,包括:中心控制服务器和两条同步链——同步链1和同步链2。其中,同步链1仅包括分支服务器N,该分支服务器N作为该同步链1的头节点并同时也作为同步链1的尾节点;同步链2包括:分支服务器C、分支服务器B和分支服务器A,该分支服务器C为头节点,而分支服务器A为尾节点。
参见图5中各个指向中心控制服务器的虚线箭头,各个分支服务器还分别与中心控制服务器相连,用于分别在自身所辖用户的在线状态发生变化时或按预定周期定时向中心控制服务器主动上报当前自身所辖用户在线状态信息的变化情况。从而,中心控制服务器能实时保存全局的用户在线状态信息,该全局用户状态信息可以全局在线状态表的形式保存在中心控制服务器中,那么所谓更新全局用户在线状态信息就是更新该全局在线状态表。
在另一方面,中心控制服务器还定时向各个作为头节点的分支服务器请求更新。如图5所示,中心控制服务器定时向分支服务器N和分支服务器C请求更新,并同时下发当前最新的全局用户在线状态信息至分支服务器N和分支服务器C。分支服务器N在收到来自中心控制服务器的全局用户在线状态信息后更新自身保存的全局用户在线状态信息,从而完成同步链1的全局用户在线状态信息的更新。另外,分支服务器C在收到来自中心控制服务器的全局用户在线状态信息后也更新自身保存的全局用户在线状态信息,并输出该更新后的全局用户在线状态信息给其下一级节点——分支服务器B;分支服务器B将自身保存的全局用户在线状态信息中除自身所辖用户在线状态信息之外的其它用户在线状态信息更新为来自分支服务器C的全局用户在线状态信息中除该分支服务器B所辖用户在线状态信息之外的其它用户在线状态信息,并输出该更新后的全局用户在线状态信息给其下一级节点——分支服务器A;该分支服务器A即为该同步链2的尾节点,则仅按接收到的全局用户在线状态信息更新自身保存的全局用户状态信息,从而完成该同步链2的全局用户在线状态信息同步。这里,各个分支服务器也可以全局在线状态表的形式保存该全局用户在线状态信息,那么更新全局用户在线状态信息就是更新该全局在线状态表。
此外,在图5中,分支服务器A负责管理用户终端A,分支服务器N则管理用户终端B,由于采用本发明后分支服务器A和分支服务器N能够以较高效率实现全局用户在线状态信息的同步,因此,分支服务器N同样也能准确保存用户终端A的用户在线状态信息,从而用户终端B能够登录分支服务器N准确查询得到用户终端A的用户在线状态信息。
根据以上实施例可知,本发明通过分支服务器主动上报的方式来实时更新中心控制服务器的全局用户数据,以减少输入中心控制服务器的数据包量,同时通过基于同步链的更新分支服务器中全局用户数据的机制,还能显著减少中心控制服务器输出的数据包量,从而能大大减轻中心控制服务器的处理负担,利于大容量***的实现和扩容。并且,由于各个分支服务器能够高效快速实现全局用户数据的同步,***中某项业务的用户就能够快速地获得自己好友或者其他人的在线状态信息,从而有利于提高业务质量。
以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。