Zookeeper学习:Zookeeper应用场景之命名服务

1. 命名服务

命名服务(Name Service)也是分布式系统中比较常见的一类场景,是分布式系统最基本的公共服务之一。在分布式系统中,被命名的实体通常可以是集群中的机器、提供的服务地址或远程对象等 —— 这些我们都可以统称它们为名字(Name),其中较为常见的就是一些分布式服务框架(如RPC、RMI)中的服务地址列表,通过使用命名服务,客户端应用能够根据指定名字来获取资源的实体、服务地址和提供者的信息等。

Zookeeper 提供的命名服务功能能够帮助应用系统通过一个资源引用的方式来实现对资源的定位与使用。另外,广义上命名服务的资源定位都不是真正意义的实体资源 —— 在分布式环境中,上层应用仅仅需要一个全局唯一的名字,类似于数据库中的唯一主键。

2. 案例

如何使用ZooKeeper来实现一套分布式全局唯一ID的分配机制

所谓 ID,就是一个能够唯一标识某个对象的标识符。在我们熟悉的关系型数据库中,各个表都需要一个主键来唯一标识每条数据库记录,这个主键就是这样的唯一ID。在过去的单库单表型系统中,通常可以使用数据库字段自带的auto_increment 属性来自动为每条数据库记录生成一个唯一的ID,数据库会保证生成的这个ID在全局唯一。但是随着数据库数据规模的不断增大,分库分表随之出现,而 auto_increment 属性仅能针对单一表中的记录自动生成ID,因此在这种情况下,就无法再依靠数据库的 auto_increment 属性来唯一标识一条记录了。于是,我们必须寻求一种能够在分布式环境下生成全局唯一 ID 的方法。

一说起全局唯一 ID,大家都会联想到UUID。没错,UUID 是通用唯一识别码(Universally Unique ldentifier)的简称,是一种在分布式系统中广泛使用的用于唯一标识元素的标准确实,UUID 是一个非常不错的全局唯一ID生成方式,能够非常简便地保证分布式环境中的唯一性。一个标准的UUID是一个包含32位字符和4个短线的字符串,例如"e70f1357-f260-46ff-a32d-53a086c57ade"。UUID的优势自然不必多说,我们重点来看看它的缺陷

  • 长度过长
    UUID最大的问题就在于生成的字符串过长。显然,和数据库中的INT类型相比,存储一个UID需要花费更多的空间。
  • 含义不明
    上面我们已经看到一个典型的UUID是类似于"e70f1357-f260-46ffa32d-53a086c57ade"的一个字符串。根据这个字符串,开发人员从字面上基本看不出任何其表达的含义,这将会大大影响问题排查和开发调试的效率。

== 解决方案==
结合一个分布式任务调度系统,使用Zookeepe来实现这类全局唯一ID的生成。之前我们已经提到,通过调用ZooKeeper节点创建的API接口可以创建一个顺序节点,并且在API返回值中会返回这个节点的完整名字。利用这个特性,我们就可以借助Zookeeper来生成全局唯一的ID 了,如下图∶

说明:对于一个任务列表的主键,使用ZooKeeper生成唯一ID的基本步骤∶

  1. 所有客户端都会根据自己的任务类型,在指定类型的任务下面通过调用 create() 方法来创建一个
    顺序节点,例如创建"job-"节点。
  2. 节点创建完毕后,create() 方法会返回一个完整的节点名,例如"job-00000003"。
  3. 客户端拿到这个返回值后,拼接上 type 类型,例如 “type2-job-000000003”,这就可以作为一个全局唯一的ID了。

在ZooKeeper中,每一个数据节点都能够维护一份子节点的顺序序列,当客户端对其创建一个顺序子节点的时候 ZooKeeper会自动以后缀的形式在其子节点上添加一个序号,在这个场景中就是利用了Zookeeper的这个特性

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值