`
xiaoyu966
  • 浏览: 257903 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ZooKeeper之分布式锁(Python版)

阅读更多

============================================================================

原创作品,允许转载。转载时请务必以超链接形式标明原始出处、以及本声明。

请注明转自: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到多个服务器,同时运行,就可以看到分布式锁的效果了。

 

0
0
分享到:
评论

相关推荐

    基于zookeeper的分布式锁简单实现

    这时,Zookeeper,一个高可用的分布式协调服务,常被用来实现分布式锁。 Zookeeper由Apache基金会开发,它提供了一种可靠的分布式一致性服务,包括命名服务、配置管理、集群同步、领导者选举等功能。Zookeeper基于...

    zookeeper做分布式锁

    分布式锁是解决多节点系统中同步问题的一种常见技术,ZooKeeper,由Apache基金会开发的分布式协调服务,常被用于实现高效可靠的分布式锁。本文将深入探讨如何利用ZooKeeper来构建分布式锁,并讨论其背后的关键概念和...

    zookeeper分布式锁实现和客户端简单实现

    Zookeeper提供了一种类似于文件系统的数据模型,可以用于命名服务、配置管理、集群管理、分布式锁等场景。它具有强一致性、高可用性和高性能的特点,是实现分布式锁的理想选择。 **Zookeeper的分布式锁实现原理** ...

    分布式锁/信号量的实现方式:基于Redis、Zookeeper 、etcd 的分布式锁 确保在分布式环境中安全地访问共享资源

    下面将详细介绍基于Redis、Zookeeper以及etcd的分布式锁实现方式。 #### 二、基于Redis的分布式锁实现 Redis作为一款高性能的键值存储系统,非常适合用来实现分布式锁。以下是一个简单的示例代码: - **获取锁**...

    Python使用分布式锁的代码演示示例

    在Python编程中,分布式锁是一种在分布式系统中用于协调不同节点间访问共享资源的重要机制。在上述场景中,我们讨论的是分布式系统中的并发问题,尤其是秒杀活动这种高并发操作,如果不加以控制,可能会导致数据一致...

    从Paxos到Zookeeper 分布式一致性原理与实践(书签版)

    Zookeeper,是由Apache开发的开源分布式协调服务,它基于Paxos等一致性算法实现,并提供了更高级别的API,使得开发者能够更容易地实现分布式锁、配置管理、命名服务等功能。Zookeeper的主要特性包括: 1. **原子性*...

    分布式锁与信号量分布式锁与信号量.txt

    - Zookeeper 提供了一种创建临时有序节点的方式来实现分布式锁。 - 利用 Zookeeper 的 watch 机制,当某个节点释放锁后,下一个等待的节点可以自动获取锁。 **1.4 优缺点分析** - **优点**: - 可以有效地控制...

    分布式锁与信号量.md

    下面是一个使用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....

    zookeeper.rar

    5. **分布式锁**:Zookeeper可以实现分布式锁,包括读锁和写锁。这在多线程或分布式环境下的并发控制中非常有用,保证了操作的顺序性和互斥性。 6. **分桶路由**:通过Zookeeper,分布式应用可以实现负载均衡和分桶...

    Python-分布式系统中常用的的算法python实现

    6. **Chubby锁服务**: Google的分布式锁服务,基于Paxos算法。Python实现可能包括锁的申请、释放以及超时处理机制。 7. **Gossip协议**: 用于分布式系统的成员发现和信息传播,如EPAXOS、Kubernetes中的心跳机制。...

    zookeeper-3.4.5-cdh5.15.2.tar.gz

    5. **分发及锁服务**:Zookeeper支持分布式同步和队列,可以实现分布式锁和分布式队列的功能。 Zookeeper的架构由三部分组成:服务器(Server)、客户端(Client)和数据存储(ZNode)。每个Zookeeper服务器都维护...

    zookeeper-3.6.3.zip

    Zookeeper在分布式应用中扮演着重要角色,例如在分布式配置管理、命名服务、分布式锁、集群管理等方面都有广泛的应用。 标题"zookeeper-3.6.3.zip"指的是Zookeeper的3.6.3版本的压缩包文件,这通常包含了该版本的...

    zookeeper开发工具

    Zookeeper的设计理念源自于Google的Chubby,它提供了一种高可用、高性能的服务,用于解决分布式环境下的命名服务、配置管理、集群管理、分布式锁等挑战。Zookeeper基于一个简单的模型,即所有数据存储在一个树形结构...

    zookeeper基本教程

    ### Zookeeper分布式锁的实现 Zookeeper提供了一种实现分布式锁的方法,基于临时节点(ephemeral nodes)和顺序节点(sequential nodes)。创建一个临时节点表示获取锁,删除该节点表示释放锁。通过比较节点顺序来...

    zookeeper资料

    4. **分布式锁**:Zookeeper可以提供分布式锁服务,用于解决分布式环境中的并发控制问题。 5. **顺序编号**:在分布式环境中,Zookeeper可以生成全局唯一的序列号,如分布式ID生成器。 6. **分布式事件通知**:...

    Python-分布式系统资源大列表

    此外,分布式锁、分布式任务队列如Celery、分布式调度器如Airflow和Luigi,以及分布式文件系统如HDFS等,都是Python开发者在构建分布式系统时可能会用到的工具和库。 最后,学习和掌握这些资源需要时间和实践,建议...

    PyPI 官网下载 | zookeeper-1.0b8.tar.gz

    它提供了API来创建、删除、更新Zookeeper节点,以及监视节点变化,实现分布式锁、选举、队列等高级功能。通过这个库,Python开发者可以轻松地将Zookeeper的功能集成到自己的应用中,以实现分布式环境下的数据管理和...

    apache-zookeeper-3.7.0

    - ZooKeeper 支持创建临时和顺序节点,这使得它可以实现分布式锁。临时节点在客户端断开连接时自动删除,而顺序节点则可以用于实现公平的锁策略。 5. **集群管理**: - ZooKeeper 可以作为集群的元数据中心,存储...

    Python库 | zookeeper-0.1.1-py3-none-any.whl

    在分布式环境中,`zookeeper`库可以帮助开发者构建高可用和高可靠的系统,比如在分布式锁、服务注册与发现、配置中心等方面发挥重要作用。例如,使用`zookeeper`可以实现全局唯一ID生成器,通过创建顺序节点来生成...

Global site tag (gtag.js) - Google Analytics