一种分布式系统中生成机器ID的方法、装置及系统与流程

文档序号:18000897发布日期:2019-06-25 22:50阅读:260来源:国知局
一种分布式系统中生成机器ID的方法、装置及系统与流程

本说明书实施例方案属于计算机软件技术领域,尤其涉及一种分布式系统中生成机器id的方法、装置及系统。



背景技术:

在分布式系统中会存在许多台服务器对外提供服务,许多场景下都需要为服务器分配在系统内的唯一id号,用来区分同一个服务请求具体是由哪台服务器来提供的服务。例如打印日志生成的日志文件名称增加id号,来区分不同服务器打印的日志;使用雪花算法生成分布式唯一序列所使用的机器id号;有多个服务组成的一个完整需求场景,可以使用id号来进行服务日志追踪等等。

目前,在分布式系统中为服务器生成唯一id号的方式有多种:一是在发布的程序版本中,直接为每个服务器的启动脚本人工设定唯一机器id。这种方式的缺点是,在服务启动脚本或配置文件中设定机器id,会使分布式服务在不同机器上的发布版本不一致,不利于服务的集中发布管理,维护成本较高,而且由于需要人工保证id号不重复,所以出错率也比较高。二是根据服务器特定属性设定机器id。这种方式的缺点是,当机器属性规则发生变化时,有可能会造成机器id重复,也就是,在运行环境产生变化时会导致不同服务器使用相同机器id的风险,严重时甚至会产生系统故障。例如根据网络协议地址ip最后一段数值确定机器id,当增加服务器处于不同网段时,就可能产生机器id重复风险,如网络协议地址ip为11.22.33.44,则使用44作为本机器的id号,这样要求所有机器必须在同一个网段,否则就会出现严重的机器id重复风险。三是通过数据库配置等方式统一进行机器id维护,在服务器启动时进行加载。这种方式的缺点是,会使应用程序与运行环境产生依赖,因为服务只能在特定环境或特定前提条件下才可以发布使用,所以这种依赖性往往是不可取的,此外,这种方式的开发维护成本也比较高。

因此,业内亟需一种可以在分布式系统中为服务器生成唯一id号时不需要人工参与、保证版本一致、便于系统统一发布管理维护的解决方案。



技术实现要素:

本说明书实施例目的在于提供一种分布式系统中生成机器id的方法、装置及系统,不仅可以为服务器生成唯一的机器id且在服务重启时保持不变,而且也可以避免人工参与造成的风险、保证版本的一致性、便于系统开发及维护。

一方面本申请提供了一种分布式系统中生成机器id的方法,包括:

在分布式系统的zookeeper上创建根节点;

获取分布式系统中目标服务器的网络协议地址,基于zookeeper判断所述根节点下是否存在以所述网络协议地址命名的叶节点;

确定所述根节点下不存在以所述网络协议地址命名的叶节点时,基于zookeeper在所述根节点下创建顺序节点以及叶节点,获取与所述顺序节点对应的顺序号,根据所述顺序号为所述目标服务器生成机器id,其中,所述叶节点是以所述网络协议地址命名的,所述叶节点中的信息包括所述顺序节点对应的顺序号。

本说明书提供的所述方法的另一个实施例中,还包括:

确定所述根节点下存在以所述网络协议地址命名的叶节点时,获取所述叶节点中的信息,根据所述信息为所述目标服务器生成机器id。

本说明书提供的所述方法的另一个实施例中,所述机器id的生成是在所述目标服务器服务启动过程中完成的。

本说明书提供的所述方法的另一个实施例中,所述获取分布式系统中目标服务器的网络协议地址,基于zookeeper判断所述根节点下是否存在以所述网络协议地址命名的叶节点,包括:

服务启动时,获取所述目标服务器的网络协议地址;

确定连接上zookeeper时,基于zookeeper查询所述根节点下的叶节点,获得所述根节点下的所有叶节点;

判断所述所有叶节点中是否存在以所述网络协议地址命名的叶节点。

本说明书提供的所述方法的另一个实施例中,所述获取与所述顺序节点对应的顺序号,包括:

获取与所述顺序节点对应的顺序节点名称;

截取所述顺序节点名称中预设部分,作为与所述顺序节点对应的顺序号。

本说明书提供的所述方法的另一个实施例中,还包括:

通过zookeeper客户端查询所述根节点下的信息,获得机器id与服务器网络协议地址的对应关系。

本说明书提供的所述方法的另一个实施例中,还包括:

如果对所述分布式系统中的所有服务器进行服务重构,则通过zookeeper客户端删除所述机器id对应的根节点,然后重启服务生成新的机器id;

如果预设数服务器的网络协议地址变更,则通过zookeeper客户端删除所述根节点下以所述网络协议地址命名的叶节点,重启服务生成新的机器id,所述预设数小于所述分布式系统中所有服务器的总数量。

另一方面,本说明书实施例还提供一种分布式系统中生成机器id的装置,所述装置包括:

根节点创建模块,用于在分布式系统的zookeeper上创建根节点;

叶节点判断模块,用于获取分布式系统中目标服务器的网络协议地址,基于zookeeper判断所述根节点下是否存在以所述网络协议地址命名的叶节点;

机器id第一生成模块,用于确定所述根节点下不存在以所述网络协议地址命名的叶节点时,基于zookeeper在所述根节点下创建顺序节点以及叶节点,获取与所述顺序节点对应的顺序号,根据所述顺序号为所述目标服务器生成机器id,其中,所述叶节点是以所述网络协议地址命名的,所述叶节点中的信息包括所述顺序节点对应的顺序号。

本说明书提供的所述装置的另一个实施例中,所述装置还包括:

机器id第二生成模块,用于确定所述根节点下存在以所述网络协议地址命名的叶节点时,获取所述叶节点中的信息,根据所述信息为所述目标服务器生成机器id。

本说明书提供的所述装置的另一个实施例中,所述叶节点判断模块,包括:

网络协议地址获取单元,用于服务启动时,获取所述目标服务器的网络协议地址;

叶节点获得单元,用于确定连接上zookeeper时,基于zookeeper查询所述根节点下的叶节点,获得所述根节点下的所有叶节点;

叶节点判断单元,用于判断所述所有叶节点中是否存在以所述网络协议地址命名的叶节点。

本说明书提供的所述装置的另一个实施例中,所述获取与所述顺序节点对应的顺序号,包括:

顺序节点名称获取单元,用于获取与所述顺序节点对应的顺序节点名称;

顺序号获取单元,用于截取所述顺序节点名称中预设部分,作为与所述顺序节点对应的顺序号。

本说明书提供的所述装置的另一个实施例中,还包括:

对应关系获得单元,用于通过zookeeper客户端查询所述根节点下的信息,获得机器id与服务器网络协议地址的对应关系。

本说明书提供的所述装置的另一个实施例中,还包括:

机器id第一更新单元,用于如果对所述分布式系统中的所有服务器进行服务重构,则通过zookeeper客户端删除所述机器id对应的根节点,然后重启服务生成新的机器id;

机器id第二更新单元,用于如果预设数服务器的网络协议地址变更,则通过zookeeper客户端删除所述根节点下以所述网络协议地址命名的叶节点,重启服务生成新的机器id,所述预设数小于所述分布式系统中所有服务器的总数量。

另一方面,本说明书实施例提供一种分布式系统中生成机器id的设备,包括处理器及用于存储处理器可执行指令的存储器,所述指令被所述处理器执行时实现包括以下步骤:

在分布式系统的zookeeper上创建根节点;

获取分布式系统中目标服务器的网络协议地址,基于zookeeper判断所述根节点下是否存在以所述网络协议地址命名的叶节点;

确定所述根节点下不存在以所述网络协议地址命名的叶节点时,基于zookeeper在所述根节点下创建顺序节点以及叶节点,获取与所述顺序节点对应的顺序号,根据所述顺序号为所述目标服务器生成机器id,其中,所述叶节点是以所述网络协议地址命名的,所述叶节点中的信息包括所述顺序节点对应的顺序号。

另一方面,本说明书实施例提供一种分布式系统中生成机器id的系统,包括至少一个处理器以及存储计算机可执行指令的存储器,所述处理器执行所述指令时实现上述任意一个实施例所述方法的步骤。

本说明书实施例提供的一种分布式系统中生成机器id的方法、装置及系统,一方面,通过使用zookeeper顺序节点机制,为不同服务器生成唯一的机器id,既保证了为所有服务器生成唯一机器id,且在服务维护重启时机器id保持不变,也避免了人工参与造成网络协议地址重复的风险。另一方面,通过在分布式系统的zookeeper上创建根节点,当服务启动时,获取目标服务器的网络协议地址,然后在根节点查找是否存在以所述网络协议地址命名的叶节点,确定存在时,读取叶节点的内容作为目标服务器的机器id;确定不存在时,基于zookeeper在根节点下创建一个顺序节点和一个以所述网络协议地址命名的叶节点,将顺序节点对应的顺序号作为叶节点的内容和目标服务器的机器id,由于每个服务器在第一次启动时主动到zookeeper中进行注册生成唯一的机器id,所以可以保证应用程序版本的一致性,有利于服务的统一发布管理。此外,采用本说明书提供的实施方案,可以通过zookeeper客户端对已经注册的机器id进行查询,获取并维护根节点下的所有节点信息,更加便于系统维护。

附图说明

为了更清楚地说明本说明书实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1是本说明书提供的一种分布式系统中生成机器id方法的一个实施例的流程示意图;

图2是本说明书提供的一种分布式系统中生成机器id方法的一个具体实施例的流程示意图;

图3是本说明书提供的一种分布式系统中生成机器id装置的一个实施例的模块结构示意图;

图4是本说明书提供的一种分布式系统中生成机器id系统的一个实施例的模块结构示意图。

具体实施方式

为了使本技术领域的人员更好地理解本说明书中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本说明书中的一部分实施例,而不是全部的实施例。基于本说明书中的一个或多个实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本说明书实施例保护的范围。

本说明书提供的一种实施方案可以应用到分布式系统中为服务器分配在系统内唯一id的场景中,所述分布式系统可以包括多个服务器。

本说明书提供的一个或多个实施方案中,通过zookeeper进行机器id生成,所以应用程序中需要预先引入zookeeper开发所需要的api包,同时需要部署zookeeper服务器。由于zookeeper是一个开源项目,所以服务端可集群部署也可单机部署,具体可根据系统实际情况进行选择。其中,zookeeper是一个开放源码的分布式应用程序协调服务,是google的chubby一个开源的实现,是hadoop和hbase的重要组件,是为分布式应用提供一致性服务的软件,其提供的功能包括:配置维护、域名服务、分布式同步、组服务等。由于zookeeper的api包和zookeeper的服务器都是开源的,所以无需单独开发zookeeper的功能,只需要部署引用即可。

本说明书提供的一个或多个实施方案中,在zookeeper服务器部署完成后,通过在zookeeper上创建根节点,当服务启动时,获取目标服务器的网络协议地址,在根节点查找是否存在以所述网络协议地址命名的叶节点,如果不存在,则基于zookeeper在根节点下创建一个顺序节点和一个以所述网络协议地址命名的叶节点,将顺序节点对应的顺序号作为叶节点的内容和目标服务器的机器id。这样,不仅可以为不同服务器生成唯一机器id,避免了人工参与造成id重复的风险,而且也可以保证应用程序版本的一致性,利于服务的统一发布管理,便于系统维护。

下面以一个具体的应用场景为例对本说明书实施方案进行说明。具体的,图1是本说明书提供的一种分布式系统中生成机器id方法的一个实施例的流程示意图。虽然本说明书提供了如下述实施例或附图所示的方法操作步骤或装置结构,但基于常规或者无需创造性的劳动在所述方法或装置中可以包括更多或者部分合并后更少的操作步骤或模块单元。在逻辑性上不存在必要因果关系的步骤或结构中,这些步骤的执行顺序或装置的模块结构不限于本说明书实施例或附图所示的执行顺序或模块结构。所述的方法或模块结构的在实际中的装置、服务器或终端产品应用时,可以按照实施例或者附图所示的方法或模块结构进行顺序执行或者并行执行(例如并行处理器或者多线程处理的环境、甚至包括分布式处理、服务器集群的实施环境)。

当然,下述实施例的描述并不对基于本说明书的其他可扩展到的技术方案构成限制。

具体的一种实施例如图1所示,本说明书提供的一种分布式系统中生成机器id方法的一种实施例中,所述方法可以包括:

s1:在分布式系统的zookeeper上创建根节点。

zookeeper提供一个多层级的节点命名空间,其数据模型的结构整体上可以看作是一棵树,包括多个节点,每个节点都可以通过其路径唯一标识,比如一个节点的路径可以是/workid/ip。另外,zookeeper将所有数据存储在内存中,每个节点都可以设置关联的数据,即每个节点上都会保存自己的数据内容,同时还会保存一系列属性信息。

根节点是树的一个组成部分,也叫树根。所有非空的二叉树中,都有且仅有一个根节点。它是同一棵树中除本身外所有节点的祖先,没有父节点。

本说明书一个实施例中,可以根据分布式系统需求,在zookeeper上预先创建一系列根节点,所述创建方式为:通过zookeeper客户端工具或者在系统中调用zookeeper客户端的api(api应用程序编程接口)。

s2:获取分布式系统中目标服务器的网络协议地址,基于zookeeper判断所述根节点下是否存在以所述网络协议地址命名的叶节点。

网络协议地址是区分不同服务器的标准,即只要服务器的网络协议地址不同,就认为是不同的服务器,就需要生成不同的机器id。本说明书一个或多个实施例中,网络协议地址具体可以是ip地址,也可以是能够区分不同服务器、唯一标识一台服务器的标识,对此不作限制。优选地,本说明书实施例中网络协议地址是ip地址。

叶节点就是树中最底端的节点,即叶节点没有子节点。

本说明书一个实施例中,机器id的生成是在目标服务器服务启动过程中完成的。具体地,目标服务器在启动过程中,通过连接zookeeper服务器,使用zookeeper自身的顺序节点机制实现机器id的自动生成。如果生成机器id失败,就说明服务启动失败。因此,对于技术人员需要在业务应用启动中优先加载机器id生成服务,并对其进行初始化,不能在运行时期生成机器id。这样可以避免服务运行期使用机器id时报错。

其中,zookeeper自身的顺序节点机制也就是zookeeper持久顺序节点相比普通节点的额外特性,即在zookeeper中每个父节点会为其第一级子节点维护一份时序,会记录每个子节点创建的先后顺序。基于这个特性,在创建子节点的时候,可以设置这个属性,这样在创建节点过程中,zookeeper会自动为给定节点名加上一个数字后缀,作为新的节点名。例如:在创建节点的时候,只传入节点前缀“/test_”,zookeeper会自动给“test_”后面补充数字。需要说明的是,所述数字后缀的范围是整型的最大值;本说明书中使用的顺序节点都是指持久顺序节点,即一旦节点在树形结构上被创建了,除非主动对该节点进行移除操作,否则这个节点将一直保存在zookeeper上,也就是说,该节点不会因为创建该节点的客户端会话失效而消失。

本说明书一个实施例中,在目标服务器的服务启动时,获取自身的网络协议地址,当确定连接上zookeeper时,基于zookeeper查询所述根节点下的叶节点,获得所述根节点下的所有叶节点,然后判断所述所有叶节点中是否存在以所述网络协议地址命名的叶节点。

s3:确定所述根节点下不存在以所述网络协议地址命名的叶节点时,基于zookeeper在所述根节点下创建顺序节点以及叶节点,获取与所述顺序节点对应的顺序号,根据所述顺序号为所述目标服务器生成机器id,其中,所述叶节点是以所述网络协议地址命名的,所述叶节点中的信息包括所述顺序节点对应的顺序号。

由于顺序节点与普通节点相比有额外的特性,所以,本说明书一个实施例中,在创建子节点的时候,可以通过预先设置这个特性,然后zookeeper会自动为给定节点名加上一个数字后缀,作为新的节点名。其中,数字后缀可以作为顺序节点对应的顺序号。

本说明书一个实施例中,通过查询根节点下的所有叶节点,然后判断所述所有叶节点中是否存在以所述网络协议地址命名的叶节点。在一些实施例中,当确定所述根节点下不存在以所述网络协议地址命名的叶节点时,通过连接zookeeper,在根节点下创建一个顺序节点,在顺序节点创建成功后,zookeeper返回相应的节点名称给分布式系统,目标服务器获取与所述顺序节点对应的顺序节点名称,截取所述顺序节点名称中预设部分,作为与所述顺序节点对应的顺序号,然后将该顺序号作为为目标服务器生成的机器id。同时,基于zookeeper在所述根节点下创建一个以所述网络协议地址命名的叶节点,并把上述获取的顺序号作为该叶节点的信息内容。其中,预设部分可以是zookeeper在顺序节点名后加的数字后缀。

在另一些实施例中,通过判断所述所有叶节点中是否存在以所述网络协议地址命名的叶节点后,确定所述根节点下存在以所述网络协议地址命名的叶节点,则可以通过获取所述叶节点中的信息,根据所述信息为所述目标服务器生成机器id。具体地,可以通过读取叶节点内容,将读取的内容作为目标服务器的机器id。

在另一些实施例中,通过判断所述所有叶节点中是否存在以所述网络协议地址命名的叶节点后,在确定所述根节点下存在以所述网络协议地址命名的叶节点时,可以通过获取所述叶节点中的信息,根据所述信息为所述目标服务器生成机器id;在确定所述根节点下不存在以所述网络协议地址命名的叶节点时,基于zookeeper在所述根节点下创建顺序节点以及叶节点,获取与所述顺序节点对应的顺序号,根据所述顺序号为所述目标服务器生成机器id,其中,所述叶节点是以所述网络协议地址命名的,所述叶节点中的信息包括所述顺序节点对应的顺序号。

需要说明的是,分布式系统中,在根节点下创建顺序节点或者叶节点时,需要连接zookeeper完成,在zookeeper中查询判断节点以及读取节点内容是可以统一处理的。此外,zookeeper服务器可以保证在根节点下生成的顺序号唯一,这样也就保证了不同网络协议地址可以生成不同的顺序号。在为目标服务器生成机器id后,生成机器id的服务就结束。

本说明书一个实施例中,还可以通过zookeeper客户端查询所述根节点下的信息,获得机器id与服务器网络协议地址的对应关系。具体地,可以通过zookeeper客户端查询根节点下所有内容,从而获得所有机器id与真实机器网络协议地址的对应关系,即某个网络协议地址的服务器被分配的机器id是多少或某个机器id对应的服务器网络协议地址是多少,这样就可以很方便地对系统进行维护。

另外,zookeeper中的节点信息,均可以通过zookeeper客户端进行管理(包括修改)。由于所有服务器生成的id都是在zookeeper中进行维护,所以当需要重新规划服务器生成的id时,只需要通过zookeeper客户端维护注册的机器id即可。

本说明书一个实施例中,如果对所述分布式系统中的所有服务器进行服务重构,则通过zookeeper客户端删除所述机器id对应的根节点,然后重启服务生成新的机器id;如果预设数服务器的网络协议地址变更,则通过zookeeper客户端删除所述根节点下以所述网络协议地址命名的叶节点,重启服务生成新的机器id,所述预设数小于所述分布式系统中所有服务器的总数量。具体地,如果是网络进行重组,大规模的服务器需要变更网络协议地址等信息,则只需要将zookeeper记录的节点全部删除,然后直接重启服务即可;如果只是某个服务器的网络协议地址进行了变更,可以直接删除以所述网络协议地址命名的节点,然后重启服务自动生成新的机器id。例如:某分布式系统中,需要对系统进行比较大的服务重构,所有服务器需要重新生成机器id,则只需要通过zookeeper客户端删除机器id的根节点,然后重启所有服务即可,不需要做任何其他的维护工作。此外,本说明书一个实施例中,当系统进行扩容时可以自动为新增加的服务器分配新的机器id,不对应用版本有任何侵入影响,利于服务的集中维护管理。

本说明书实施例提供的一种分布式系统中生成机器id的方法,一方面,通过使用zookeeper的顺序节点机制,为不同服务器生成唯一的机器id,既保证了为所有服务器生成唯一机器id,且在服务维护重启时机器id保持不变,也避免了人工参与造成网络协议地址重复的风险。另一方面,通过在分布式系统的zookeeper上创建根节点,当服务启动时,获取目标服务器的网络协议地址,然后在根节点查找是否存在以所述网络协议地址命名的叶节点,确定不存在时,基于zookeeper在根节点下创建一个顺序节点和一个以所述网络协议地址命名的叶节点,将顺序节点对应的顺序号作为叶节点的内容和目标服务器的机器id,由于每个服务器在启动时会主动到zookeeper中进行注册生成唯一id,保证了应用程序版本的一致性,有利于服务的统一发布管理。另一方面,由于zookeeper可以对节点进行自动管理,不需要人工参与,所以可以通过zookeeper客户端对已经注册的机器进行查询,获取所有的服务器与其分配的id的对应关系,更便于系统的维护。

为了进一步来验证本方法的实用性和可行性,本说明书还提供了应用上述方案的一个具体实例,如图2所示,图2是本说明书提供的一种分布式系统中生成机器id方法的一个具体实施例的流程示意图,其中,应用程序中已预先引入zookeeper开发所需要的api包,同时也已部署好zookeeper服务器,且在zookeeper操作中预先设定了一个根节点,因为是通过机器ip来唯一标识服务器的,所以本实施例中网络协议地址是ip地址。实施例的执行主体是目标服务器,具体过程和步骤如下:

(1)启动目标服务器的服务时获取本服务器的ip。

(2)连接zookeeper,查询zookeeper中节点内容,判断根节点下是否存在以ip命名的叶节点,如果存在,执行步骤(3);如果不存在,执行步骤(4)-步骤(7)。例如:在zookeeper中设定的一个用来生成机器id的根节点为/workid,则通过连接zookeeper,查询根节点下的所有节点,并判断所有节点中是否存在以步骤(1)获取的ip命名的叶节点,即查询所有节点中是否存在以“/workid/ip”命名的节点,其中,ip为真实服务器的ip地址,以下步骤中ip都表示目标服务器的真实ip地址。

(3)如果以ip命名的叶节点存在,则读取节点内容,把读取的内容作为机器id,生成机器id的服务结束,后续业务处理若需要使用机器id则就使用该id。

(4)如果以ip命名的叶节点不存在,则连接zookeeper,在根节点下创建顺序节点,创建完毕后,通过zookeeper返回顺序节点名称。如:如果节点/workid/ip不存在,连接zookeeper,在根节点下创建顺序节点“/workid/ip_”,创建完毕后,zookeeper返回顺序节点名称“/workid/ip_xxx”,其中xxx为整数型的顺序号。

(5)截取zookeeper返回的顺序节点名称中的顺序号,作为目标服务器的机器id。如:截取zookeeper返回的顺序节点名称“/workid/ip_xxx”中的整数顺序号xxx,作为目标服务器的机器id。

(6)连接zookeeper,在根节点下创建叶节点,并将步骤(5)截取得到的顺序号作为该节点的内容。如:连接zookeeper,在根节点下创建叶节点“/workid/ip”,并将步骤(5)截取得到的整数顺序号xxx作为该节点的内容。

(7)生成机器id的服务结束。

上述实施例提供的方法,通过使用zookeeper的顺序节点机制,首先设定一个机器id生成的根节点,所有需要机器id的服务在启动时首先去根节点寻找是否存在以机器ip命名的叶节点,如果存在,则读取节点内容作为本服务器的机器id;如果不存在,则在跟节点下注册一个顺序节点,得到的顺序号作为服务器的机器id,同时在根节点下创建一个以ip命名的叶节点(非顺序节点),其中,叶节点的内容为创建得顺序节点的顺序号。通过这种方式可以自动生成唯一的机器id,并且在服务重启时保证同一个服务器所使用的机器id保持一致。

基于上述所述的一种分布式系统中生成机器id的方法,本说明书一个或多个实施例还提供一种分布式系统中生成机器id的装置。所述的装置可以包括使用了本说明书实施例所述方法的系统(包括分布式系统)、软件(应用)、模块、组件、服务器、客户端等并结合必要的实施硬件的装置。基于同一创新构思,本说明书实施例提供的一个或多个实施例中的装置如下面的实施例所述。由于装置解决问题的实现方案与方法相似,因此本说明书实施例具体的装置的实施可以参见前述方法的实施,重复之处不再赘述。以下所使用的,术语“单元”或者“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。

具体地,图3是本说明书提供的一种分布式系统中生成机器id装置的一个实施例的模块结构示意图,如图3所示,本说明书提供的一种分布式系统中生成机器id的装置包括:

根节点创建模块101,可以用于在分布式系统的zookeeper上创建根节点;

叶节点判断模块102,可以用于获取分布式系统中目标服务器的网络协议地址,基于zookeeper判断所述根节点下是否存在以所述网络协议地址命名的叶节点;

机器id第一生成模块103,可以用于确定所述根节点下不存在以所述网络协议地址命名的叶节点时,基于zookeeper在所述根节点下创建顺序节点以及叶节点,获取与所述顺序节点对应的顺序号,根据所述顺序号为所述目标服务器生成机器id,其中,所述叶节点是以所述网络协议地址命名的,所述叶节点中的信息包括所述顺序节点对应的顺序号。

所述装置的另一个实施例中,还包括:

机器id第二生成模块,可以用于确定所述根节点下存在以所述网络协议地址命名的叶节点时,获取所述叶节点中的信息,根据所述信息为所述目标服务器生成机器id。

所述装置的另一个实施例中,所述叶节点判断模块102可以包括:

网络协议地址获取单元1021,可以用于服务启动时,获取所述目标服务器的网络协议地址;

叶节点获得单元1022,可以用于确定连接上zookeeper时,基于zookeeper查询所述根节点下的叶节点,获得所述根节点下的所有叶节点;

叶节点判断单元1023,可以用于判断所述所有叶节点中是否存在以所述网络协议地址命名的叶节点。

所述装置的另一个实施例中,所述机器id第一生成模块103中获取与所述顺序节点对应的顺序号,可以包括:

顺序节点名称获取单元,可以用于获取与所述顺序节点对应的顺序节点名称;

顺序号获取单元,可以用于截取所述顺序节点名称中预设部分,作为与所述顺序节点对应的顺序号。

所述装置的另一个实施例中,还包括:

对应关系获得单元,用于通过zookeeper客户端查询所述根节点下的信息,获得机器id与服务器网络协议地址的对应关系。

所述装置的另一个实施例中,还包括:

机器id第一更新单元,用于如果对所述分布式系统中的所有服务器进行服务重构,则通过zookeeper客户端删除所述机器id对应的根节点,然后重启服务生成新的机器id;

机器id第二更新单元,用于如果预设数服务器的网络协议地址变更,则通过zookeeper客户端删除所述根节点下以所述网络协议地址命名的叶节点,重启服务生成新的机器id,所述预设数小于所述分布式系统中所有服务器的总数量。

需要说明的,上述所述的装置根据方法实施例的描述还可以包括其他的实施方式,具体的实现方式可以参照相关方法实施例的描述,在此不作一一赘述。

上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。

本说明书提供的上述实施例所述的方法可以通过计算机程序实现业务逻辑并记录在存储介质上,所述的存储介质可以计算机读取并执行,实现本说明书实施例所描述方案的效果。因此,本说明书还提供一种分布式系统中生成机器id的设备,包括处理器及用于存储处理器可执行指令的存储器,所述指令被所述处理器执行时实现包括以下步骤:

在分布式系统的zookeeper上创建根节点;

获取分布式系统中目标服务器的网络协议地址,基于zookeeper判断所述根节点下是否存在以所述网络协议地址命名的叶节点;

确定所述根节点下不存在以所述网络协议地址命名的叶节点时,基于zookeeper在所述根节点下创建顺序节点以及叶节点,获取与所述顺序节点对应的顺序号,根据所述顺序号为所述目标服务器生成机器id,其中,所述叶节点是以所述网络协议地址命名的,所述叶节点中的信息包括所述顺序节点对应的顺序号。

所述存储介质可以包括用于存储信息的物理装置,通常是将信息数字化后再以利用电、磁或者光学等方式的媒体加以存储。所述存储介质有可以包括:利用电能方式存储信息的装置如,各式存储器,如ram、rom等;利用磁能方式存储信息的装置如,硬盘、软盘、磁带、磁芯存储器、磁泡存储器、u盘;利用光学方式存储信息的装置如,cd或dvd。当然,还有其他方式的可读存储介质,例如量子存储器、石墨烯存储器等等。

需要说明的,上述所述的设备根据方法实施例的描述还可以包括其他的实施方式。具体的实现方式可以参照相关方法实施例的描述,在此不作一一赘述。

本说明书实施例提供的上述一种分布式系统中生成机器id的方法可以在计算机中由处理器执行相应的程序指令来实现,如使用windows操作系统的c++语言在pc端实现、linux系统实现,或其他例如使用android、ios系统程序设计语言在智能终端实现,以及基于量子计算机的处理逻辑实现等。本说明书提供一种分布式系统中生成机器id的系统的一个实施例中,图4是本说明书提供的一种分布式系统中生成机器id系统的实施例的模块结构示意图,如图4所示,本说明书提供的一种分布式系统中生成机器id的系统可以包括处理器131以及用于存储处理器可执行指令的存储器132,处理器131和存储器132通过总线133完成相互间的通信;

所述处理器131用于调用所述存储器132中的程序指令,以执行上述生成机器id方法实施例所提供的方法,例如包括:在分布式系统的zookeeper上创建根节点;获取分布式系统中目标服务器的网络协议地址,基于zookeeper判断所述根节点下是否存在以所述网络协议地址命名的叶节点;确定所述根节点下不存在以所述网络协议地址命名的叶节点时,基于zookeeper在所述根节点下创建顺序节点以及叶节点,获取与所述顺序节点对应的顺序号,根据所述顺序号为所述目标服务器生成机器id,其中,所述叶节点是以所述网络协议地址命名的,所述叶节点中的信息包括所述顺序节点对应的顺序号。

需要说明的是,说明书上述所述的系统根据相关方法实施例的描述还可以包括其他的实施方式,具体的实现方式可以参照方法实施例的描述,在此不作一一赘述。本申请中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于硬件+程序类实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

本说明书实施例提供的一种分布式系统中生成机器id的装置或者设备或者系统,一方面,通过使用zookeeper顺序节点机制,为不同服务器生成唯一的机器id,既保证了为所有服务器生成唯一机器id,且在服务维护重启时机器id保持不变,也避免了人工参与造成网络协议地址重复的风险。另一方面,通过在分布式系统的zookeeper上创建根节点,当服务启动时,获取目标服务器的网络协议地址,然后在根节点查找是否存在以所述网络协议地址命名的叶节点,确定存在时,读取叶节点的内容作为目标服务器的机器id;确定不存在时,基于zookeeper在根节点下创建一个顺序节点和一个以所述网络协议地址命名的叶节点,将顺序节点对应的顺序号作为叶节点的内容和目标服务器的机器id,由于每个服务器在第一次启动时主动到zookeeper中进行注册生成唯一的机器id,所以可以保证应用程序版本的一致性,有利于服务的统一发布管理。此外,采用本说明书提供的实施方案,可以通过zookeeper客户端对已经注册的机器id进行查询,获取并维护根节点下的所有节点信息,更加便于系统维护。

本说明书实施例并不局限于必须是符合行业通信标准、标准计算机数据处理和数据存储规则或本说明书一个或多个实施例所描述的情况。某些行业标准或者使用自定义方式或实施例描述的实施基础上略加修改后的实施方案也可以实现上述实施例相同、等同或相近、或变形后可预料的实施效果。应用这些修改或变形后的数据获取、存储、判断、处理方式等获取的实施例,仍然可以属于本说明书实施例的可选实施方案范围之内。

在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(programmablelogicdevice,pld)(例如现场可编程门阵列(fieldprogrammablegatearray,fpga))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片pld上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logiccompiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(hardwaredescriptionlanguage,hdl),而hdl也并非仅有一种,而是有许多种,如abel(advancedbooleanexpressionlanguage)、ahdl(alterahardwaredescriptionlanguage)、confluence、cupl(cornelluniversityprogramminglanguage)、hdcal、jhdl(javahardwaredescriptionlanguage)、lava、lola、myhdl、palasm、rhdl(rubyhardwaredescriptionlanguage)等,目前最普遍使用的是vhdl(very-high-speedintegratedcircuithardwaredescriptionlanguage)与verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。

控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(applicationspecificintegratedcircuit,asic)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:arc625d、atmelat91sam、microchippic18f26k20以及siliconelabsc8051f320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。

上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、车载人机交互设备、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。

虽然本说明书一个或多个实施例提供了如实施例或流程图所述的方法操作步骤,但基于常规或者无创造性的手段可以包括更多或者更少的操作步骤。实施例中列举的步骤顺序仅仅为众多步骤执行顺序中的一种方式,不代表唯一的执行顺序。在实际中的装置或终端产品执行时,可以按照实施例或者附图所示的方法顺序执行或者并行执行(例如并行处理器或者多线程处理的环境,甚至为分布式数据处理环境)。术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、产品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、产品或者设备所固有的要素。在没有更多限制的情况下,并不排除在包括所述要素的过程、方法、产品或者设备中还存在另外的相同或等同要素。第一,第二等词语用来表示名称,而并不表示任何特定的顺序。

为了描述的方便,描述以上装置时以功能分为各种模块分别描述。当然,在实施本说明书一个或多个时可以把各模块的功能在同一个或多个软件和/或硬件中实现,也可以将实现同一功能的模块由多个子模块或子单元的组合实现等。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

本发明是参照根据本发明实施例的方法、装置(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。

内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flashram)。内存是计算机可读介质的示例。

计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储、石墨烯存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。

本领域技术人员应明白,本说明书一个或多个实施例可提供为方法、系统或计算机程序产品。因此,本说明书一个或多个实施例可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本说明书一个或多个实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本说明书的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。

以上所述仅为本说明书一个或多个实施例的实施例而已,并不用于限制本本说明书一个或多个实施例。对于本领域技术人员来说,本说明书一个或多个实施例可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在权利要求范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1