开源项目之python使用etcd构造分布式互斥锁

    前几天跟朋友聊了下分布式互斥锁的事,我以前用过redis和zookeeper做分布式的互斥锁,但那哥们的场景下已经用了etcd,不再想引入其他的服务。 其实etcd本身也可以做成分布式互斥锁的。在coreos关于etcd文章的介绍里,就标记出etcd适合做分布式锁的特性… 

    在我想来,多个客户端去请求锁或则是设置锁的时候,只要能保证 exist 和 write 是一组原子操作就可以了,只需要数据库本身来支持,这也是我为什么不用mysql、mongodb做锁的原因。


项目名字是pyetcdlock ,正经点说,他是基于etcd开发的分布式互斥锁,要知道在分布式环境中,有很多需要锁的需求,比如计数,数据一致性等。

关于etcd分布式互斥锁的文章,原文地址是 http://xiaorui.cc/2015/09/13/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE%E4%B9%8Bpython%E4%BD%BF%E7%94%A8etcd%E6%9E%84%E9%80%A0%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%92%E6%96%A5%E9%94%81/


我这个etcd分布式锁,简单说就是利用python下的etcd.test_and_set函数来判断lock key是否被占用,存在那就说明有人占用。在创建key的时候加入了ttl,防止因为进程异常退出而没有释放锁。


前面说过,我用redis跟zookeeper做互斥锁,他们俩最大的区别在于zookeeper有临时节点ephemeral的效果。 那什么是ephemeral? Ephemeral结点在Zookeeper中是一个临时结点,这些结点只要创建它的结点session不挂,它就一直存在,当session中止了,结点也就删除了。

所以在2.0的版本中,又考虑加入watch机制,更快的解决了etcd客户端因为异常退出后,key需要等待ttl过期的问题。简单说,也实现了ephemeral的效果。


曾经写过关于分布式互斥锁的文章:

zookeeper      :     http://xiaorui.cc/2015/04/09/python-zookeeper%E8%A7%A3%E5%86%B3redis%E5%81%9A%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81%E5%B8%A6%E6%9D%A5%E7%9A%84%E5%9D%91/

redis     :  

http://xiaorui.cc/2014/12/19/python%E4%BD%BF%E7%94%A8redis%E5%AE%9E%E7%8E%B0%E5%8D%8F%E5%90%8C%E6%8E%A7%E5%88%B6%E7%9A%84%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81/


另外打算用etcd做个简单限流api ,纯属瞎搞的那种…   搞完了,会传到github的。 

安装方法

git clone https://github.com/rfyiamcool/pyetcdlock.git
cd pyetcdlock
python setup.py

pypi的安装方式 (话说,pypi有些问题,你在pypi search搜东西的时候,不显示详细信息)

pip instlal pyetcdlock

模块说明:

ttl : expire过期时间,这样可以指定锁定的时间

renew : 如果你的ttl时间将要过期了,那么可以使用renew(),再加点锁定的ttl时间

force_acquire : 强制获取锁,这是后加入的函数.

创建连接

import etcd
from pyetcdnetlock import Lock

client = client = etcd.Client(host='127.0.0.1')
lock = Lock(client, 'path/to/my/key', ttl=30, renewSecondsPrior=5)

使用方法

if lock.acquire(timeout=20):
    # some work
    lock.renew()
    # some other work
    lock.release() 
else
    # failed to acquire the lock in 20 seconds
    pass

OR

with lock as l:
    #如果时间不够,可以用renew()参数,加点时间
    l.renew()
    # some other work

关于etcd开发分布式锁的文章就这么完事了,说句实话我在各种项目中用了etcd,但etcd还很年轻,真的很年轻…   集群模式不是稳定,写入性能不是很好,另外watch模块不要注册太多。



大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

3 Responses

  1. 有问题吧 2015年9月23日 / 下午8:55

    排版有问题吧

    • itfanr 2016年9月18日 / 上午10:37

      问题很大,链接好难看

  2. vim 2015年9月15日 / 下午8:41

    不错

发表评论

邮箱地址不会被公开。 必填项已用*标注