使用zookeeper的分布式锁定实用程序
lockpick-hsft的Python项目详细描述
开锁夹
lockpick是一个使用zookeeper进行分布式锁定的实用程序。它旨在用于分布式环境,其中脚本需要在运行之间进行同步。
在helpshift,它主要用于并行和无锁自动缩放。
为什么选择锁定按钮
lockpick使用kazoo库,但比kazoo食谱提供以下好处:
- 使用非临时zknode允许explicit释放锁
- 正确的信号处理和清除
- 失效和超时
用法
$ lockpick --help usage: lockpick [-h][-s SERVERS][-c CHROOT][-i IDENTIFIER][-v][-r RETRY_COUNT][-p RETRY_SLEEP]{lock,rlock,wlock,unlock,list} lock_path Distributed locking using Zookeeper primarily for scripting. After acquiring the lock, the zk node is printed to STDOUT. This zk node should be passed to unlock. Note: all logs are printed to STDERR positional arguments: {lock,rlock,wlock,unlock,list} lock: acquire a mutex lock. rlock: acquire a read lock wlock: acquire a write lock. unlock: release lock identified by zk node. list: list all lock contenders lock_path ZK path to lock OR ZK node to unlock. For the unlockaction this must be the chrooted zk path to the node e.g.lockpick lock -c /devops /mylocklockpick unlock -c /devops /mylock/9d2badeec7684f35b10f4860db42 e45c__rlock__0000000022 optional arguments: -h, --help show this help message and exit -s SERVERS, --servers SERVERS -c CHROOT, --chroot CHROOT ZK chroot for the lock path -i IDENTIFIER, --identifier IDENTIFIER Optional string identifier to add to the lock node OR verify when unlocking -v, --verbose -r RETRY_COUNT, --retry-count RETRY_COUNT -p RETRY_SLEEP, --retry-sleep RETRY_SLEEP
安装
我们建议使用pip在virtualenv中安装:
$ virtualenv lockpick
$ pip install lockpick-hsft
示例
$ lockpick -s localhost:2181 -c /test -i "test lock1" rlock /mylock /mylock/503e61fadc8f492497db823b87e64afe__rlock__0000000038$ lockpick -s localhost:2181 -c /test -i "test lock1" rlock /mylock /mylock/e21b0ecd480346aaaba23e77946e16e9__rlock__0000000039$ lockpick -s localhost:2181 -c /test -i "test lock1" list /mylock 'test lock1' /mylock/e21b0ecd480346aaaba23e77946e16e9__rlock__0000000039'test lock1' /mylock/503e61fadc8f492497db823b87e64afe__rlock__0000000038$ lockpick -s localhost:2181 -c /test -i "test lock1" wlock /mylock [2018-07-25 19:09:53,095] WARNING lockpick: Waiting to acquire lock, contenders are :[2018-07-25 19:09:53,103] WARNING lockpick: 'test lock1' /mylock/e21b0ecd480346aaaba23e77946e16e9__rlock__0000000039[2018-07-25 19:09:53,103] WARNING lockpick: 'test lock1' /mylock/503e61fadc8f492497db823b87e64afe__rlock__0000000038[2018-07-25 19:09:53,104] WARNING lockpick: 'test lock1' /mylock/492b4a6c1727417daf511b343d0d11b7__lock__0000000042[2018-07-25 19:09:56,104] WARNING lockpick: Waiting to acquire lock, contenders are :[2018-07-25 19:09:56,114] WARNING lockpick: 'test lock1' /mylock/e21b0ecd480346aaaba23e77946e16e9__rlock__0000000039[2018-07-25 19:09:56,114] WARNING lockpick: 'test lock1' /mylock/503e61fadc8f492497db823b87e64afe__rlock__0000000038[2018-07-25 19:09:56,114] WARNING lockpick: 'test lock1' /mylock/492b4a6c1727417daf511b343d0d11b7__lock__0000000042[2018-07-25 19:09:59,116] WARNING lockpick: LockTimeout exception rasied by locker thread[2018-07-25 19:09:59,117] ERROR lockpick: Failed to acquire lock within timeout!$ lockpick -s localhost:2181 -c /test -i "test lock1" unlock /mylock/503e61fadc8f492497db823b87e64afe__rlock__0000000038 $ lockpick -s localhost:2181 -c /test -i "test lock1" unlock /mylock/e21b0ecd480346aaaba23e77946e16e9__rlock__0000000039 $ lockpick -s localhost:2181 -c /test -i "test lock1" wlock /mylock /mylock/d6602d4a54124826b27c50a43ab67a5e__lock__0000000043
同步生成.sh
仅当给定的命令可以获取给定的锁时,才生成该命令。
./syncd_spawn -n /test -C 'test' -l rlock sleep 5Got lock on /testRunning your command sleep 5Unlocked '/test/141bcfad04c6459591164ea12d1604af__rlock__0000000011'