============================================================================
原创作品,允许转载。转载时请务必以超链接形式标明原始出处、以及本声明。
请注明转自:http://yunjianfei.iteye.com/blog/
============================================================================
前言
在做分布式系统开发的时候,分布式锁可以说是必需的一个组件。最近做了一些调研和尝试,经过对比,基于ZooKeeper的分布式锁还是很不错的。
参照了IBM的一个帖子:https://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/
其中有一段话描述了ZooKeeper的共享锁(即分布式锁)实现,如下:
共享锁在同一个进程中很容易实现,但是在跨进程或者在不同 Server 之间就不好实现了。Zookeeper 却很容易实现这个功能,实现方式也是需要获得锁的 Server 创建一个 EPHEMERAL_SEQUENTIAL 目录节点,然后调用 getChildren方法获取当前的目录节点列表中最小的目录节点是不是就是自己创建的目录节点,如果正是自己创建的,那么它就获得了这个锁,如果不是那么它就调用 exists(String path, boolean watch) 方法并监控 Zookeeper 上目录节点列表的变化,一直到自己创建的节点是列表中最小编号的目录节点,从而获得锁,释放锁很简单,只要删除前面它自己所创建的目录节点就行了。
通过这段话,大概可以明白其原理。下面我主要写一下基于Python的分布式锁实现。
实现
Google了一下,有个叫Kazoo的python开源包很好的实现了对ZooKeeper的支持。
Kazoo is a Python library designed to make working with Zookeeper a more hassle-free experience that is less prone to errors.
链接如下:https://kazoo.readthedocs.org/en/latest/
GitHub地址: https://github.com/python-zk/kazoo
首先,我们去GitHub,下载其源码包。解压缩之后,进行安装
python setup.py install
OK,准备工作完成,一切尽在代码中:
文件名:zk_lock.py
#!/usr/bin/env python2.7 # -*- coding:utf-8 -*- # # Author : yunjianfei # E-mail : yunjianfei1987@gmail.com # Date : 2014/12/09 # Desc : # import logging, os, time from kazoo.client import KazooClient from kazoo.client import KazooState from kazoo.recipe.lock import Lock class ZooKeeperLock(): def __init__(self, hosts, id_str, lock_name, logger=None, timeout=1): self.hosts = hosts self.id_str = id_str self.zk_client = None self.timeout = timeout self.logger = logger self.name = lock_name self.lock_handle = None self.create_lock() def create_lock(self): try: self.zk_client = KazooClient(hosts=self.hosts, logger=self.logger, timeout=self.timeout) self.zk_client.start(timeout=self.timeout) except Exception, ex: self.init_ret = False self.err_str = "Create KazooClient failed! Exception: %s" % str(ex) logging.error(self.err_str) return try: lock_path = os.path.join("/", "locks", self.name) self.lock_handle = Lock(self.zk_client, lock_path) except Exception, ex: self.init_ret = False self.err_str = "Create lock failed! Exception: %s" % str(ex) logging.error(self.err_str) return def destroy_lock(self): #self.release() if self.zk_client != None: self.zk_client.stop() self.zk_client = None def acquire(self, blocking=True, timeout=None): if self.lock_handle == None: return None try: return self.lock_handle.acquire(blocking=blocking, timeout=timeout) except Exception, ex: self.err_str = "Acquire lock failed! Exception: %s" % str(ex) logging.error(self.err_str) return None def release(self): if self.lock_handle == None: return None return self.lock_handle.release() def __del__(self): self.destroy_lock() def main(): logger = logging.getLogger() logger.setLevel(logging.INFO) sh = logging.StreamHandler() formatter = logging.Formatter('%(asctime)s -%(module)s:%(filename)s-L%(lineno)d-%(levelname)s: %(message)s') sh.setFormatter(formatter) logger.addHandler(sh) zookeeper_hosts = "192.168.10.2:2181, 192.168.10.3:2181, 192.168.10.4:2181" lock_name = "test" lock = ZooKeeperLock(zookeeper_hosts, "myid is 1", lock_name, logger=logger) ret = lock.acquire() if not ret: logging.info("Can't get lock! Ret: %s", ret) return logging.info("Get lock! Do something! Sleep 10 secs!") for i in range(1, 11): time.sleep(1) print str(i) lock.release() if __name__ == "__main__": try: main() except Exception, ex: print "Ocurred Exception: %s" % str(ex) quit()
测试的时候,只需要改一下“zookeeper_hosts ”这个参数,改为你自己的ZooKeeper的server地址即可.
将该测试文件copy到多个服务器,同时运行,就可以看到分布式锁的效果了。
相关推荐
这时,Zookeeper,一个高可用的分布式协调服务,常被用来实现分布式锁。 Zookeeper由Apache基金会开发,它提供了一种可靠的分布式一致性服务,包括命名服务、配置管理、集群同步、领导者选举等功能。Zookeeper基于...
分布式锁是解决多节点系统中同步问题的一种常见技术,ZooKeeper,由Apache基金会开发的分布式协调服务,常被用于实现高效可靠的分布式锁。本文将深入探讨如何利用ZooKeeper来构建分布式锁,并讨论其背后的关键概念和...
Zookeeper提供了一种类似于文件系统的数据模型,可以用于命名服务、配置管理、集群管理、分布式锁等场景。它具有强一致性、高可用性和高性能的特点,是实现分布式锁的理想选择。 **Zookeeper的分布式锁实现原理** ...
下面将详细介绍基于Redis、Zookeeper以及etcd的分布式锁实现方式。 #### 二、基于Redis的分布式锁实现 Redis作为一款高性能的键值存储系统,非常适合用来实现分布式锁。以下是一个简单的示例代码: - **获取锁**...
在Python编程中,分布式锁是一种在分布式系统中用于协调不同节点间访问共享资源的重要机制。在上述场景中,我们讨论的是分布式系统中的并发问题,尤其是秒杀活动这种高并发操作,如果不加以控制,可能会导致数据一致...
Zookeeper,是由Apache开发的开源分布式协调服务,它基于Paxos等一致性算法实现,并提供了更高级别的API,使得开发者能够更容易地实现分布式锁、配置管理、命名服务等功能。Zookeeper的主要特性包括: 1. **原子性*...
- Zookeeper 提供了一种创建临时有序节点的方式来实现分布式锁。 - 利用 Zookeeper 的 watch 机制,当某个节点释放锁后,下一个等待的节点可以自动获取锁。 **1.4 优缺点分析** - **优点**: - 可以有效地控制...
下面是一个使用Redis实现分布式锁的Python示例代码: ```python import redis import time def acquire_lock(conn, lock_name, timeout=10): end_time = time.time() + timeout while time.time() if conn....
5. **分布式锁**:Zookeeper可以实现分布式锁,包括读锁和写锁。这在多线程或分布式环境下的并发控制中非常有用,保证了操作的顺序性和互斥性。 6. **分桶路由**:通过Zookeeper,分布式应用可以实现负载均衡和分桶...
6. **Chubby锁服务**: Google的分布式锁服务,基于Paxos算法。Python实现可能包括锁的申请、释放以及超时处理机制。 7. **Gossip协议**: 用于分布式系统的成员发现和信息传播,如EPAXOS、Kubernetes中的心跳机制。...
5. **分发及锁服务**:Zookeeper支持分布式同步和队列,可以实现分布式锁和分布式队列的功能。 Zookeeper的架构由三部分组成:服务器(Server)、客户端(Client)和数据存储(ZNode)。每个Zookeeper服务器都维护...
Zookeeper在分布式应用中扮演着重要角色,例如在分布式配置管理、命名服务、分布式锁、集群管理等方面都有广泛的应用。 标题"zookeeper-3.6.3.zip"指的是Zookeeper的3.6.3版本的压缩包文件,这通常包含了该版本的...
Zookeeper的设计理念源自于Google的Chubby,它提供了一种高可用、高性能的服务,用于解决分布式环境下的命名服务、配置管理、集群管理、分布式锁等挑战。Zookeeper基于一个简单的模型,即所有数据存储在一个树形结构...
### Zookeeper分布式锁的实现 Zookeeper提供了一种实现分布式锁的方法,基于临时节点(ephemeral nodes)和顺序节点(sequential nodes)。创建一个临时节点表示获取锁,删除该节点表示释放锁。通过比较节点顺序来...
4. **分布式锁**:Zookeeper可以提供分布式锁服务,用于解决分布式环境中的并发控制问题。 5. **顺序编号**:在分布式环境中,Zookeeper可以生成全局唯一的序列号,如分布式ID生成器。 6. **分布式事件通知**:...
- ZooKeeper 支持创建临时和顺序节点,这使得它可以实现分布式锁。临时节点在客户端断开连接时自动删除,而顺序节点则可以用于实现公平的锁策略。 5. **集群管理**: - ZooKeeper 可以作为集群的元数据中心,存储...
此外,分布式锁、分布式任务队列如Celery、分布式调度器如Airflow和Luigi,以及分布式文件系统如HDFS等,都是Python开发者在构建分布式系统时可能会用到的工具和库。 最后,学习和掌握这些资源需要时间和实践,建议...
它提供了API来创建、删除、更新Zookeeper节点,以及监视节点变化,实现分布式锁、选举、队列等高级功能。通过这个库,Python开发者可以轻松地将Zookeeper的功能集成到自己的应用中,以实现分布式环境下的数据管理和...
在分布式环境中,`zookeeper`库可以帮助开发者构建高可用和高可靠的系统,比如在分布式锁、服务注册与发现、配置中心等方面发挥重要作用。例如,使用`zookeeper`可以实现全局唯一ID生成器,通过创建顺序节点来生成...