有哪些好的跨机器锁定方法?
我们的服务器集群有20台机器,每台机器上有10个进程,每个进程里有5个线程。我们希望能有一种方法,防止任何两条线程在任何进程和任何机器上同时修改同一个对象。
我们的代码是用Python写的,并且运行在Linux系统上,希望这能帮助我们更好地解决问题。
另外,实际上两个线程同时想要修改同一个对象的情况非常少见,所以我们希望能有一种方法,能够让“只有一个线程需要这个对象”的情况运行得非常快,即使这意味着“一个线程锁住了这个对象,而另一个线程需要它”的情况表现不太好。
有什么好的做法吗?
5 个回答
如果你能搞定一个完整的分布式锁管理系统,那就去用吧。不过,这个系统可不是那么好搭建的!不过这里有个实用的解决办法:
- 选定一个IP地址最小的节点作为主节点(也就是说,如果这个最小IP地址的节点出问题了,新的最小IP地址的节点就会成为新的主节点)。
- 让所有节点都去联系主节点,来获取对某个对象的锁。
- 让主节点使用本地的锁机制来获取锁。
这样做会简单很多,除非你需要完整的集群基础设施和分布式锁管理系统来完成这个任务。
我猜你在搜索的时候遇到了这篇博客文章 http://amix.dk/blog/post/19386 对吧?
作者展示了一个简单的接口,用来和memcachedb进行交互,作为一个虚拟的分布式锁管理器。这是个很棒的主意,而memcache可能是你能接触到的速度最快的东西之一。需要注意的是,它使用了最近添加的with语句。
下面是他博客中的一个使用示例:
from __future__ import with_statement
import memcache
from memcached_lock import dist_lock
client = memcache.Client(['127.0.0.1:11211'])
with dist_lock('test', client):
print 'Is there anybody out there!?'
如果你想在不同的机器之间进行同步,你需要一个分布式锁管理器。
我快速查了一下,找到了这个:Stackoverflow。不过可惜的是,他们只提供了Java版本的建议,但这也是个开始。
如果你是想同步对文件的访问:你的文件系统应该已经有某种锁定服务。如果没有,考虑换一个吧。