跳转到主要内容

适用于分布式环境的网络互斥服务。

项目描述

Distributex

Distributex是一个简单的互斥服务,用于协调某些集群操作。

注意: Distributex不适合需要高性能或公平锁获取的任务。它是一个非常简单的忙等待锁,获取速度非常慢。也不要用于非常大的集群,因为请求者可能永远无法获取锁。

Distributex服务器

Distributex服务器提供简单的HTTP服务。它使用Twisted编写,并提供了Twisted插件。它还需要PyYAML进行配置。

您可以按照以下方式启动它,或者将其包装在supervisor中,或者传递-d,或者任何其他方式

$ twistd -n distributex -c distributex.yaml

配置文件是一个简单的YAML结构,它定义了锁池。锁池是您希望允许东西相互竞争的资源。

backend: memcache
pools:
    - name: pool1
      expire: 300

    - name: pool2
      expire: 300
      servers: acme1, acme2

这将创建两个锁池,其锁在5分钟后过期。通常,设置一个过期时间是一个好主意,以确保某些事情,否则它将默认为30分钟。如果您不想让它过期,则将其设置为0,但我不建议这样做。

您可以指定“memcache”后端或“inmemory”,两者都有优点和缺点。Memcache会慢一些,但状态会远离Distributex服务器,并且您可以扩展工作器 - 然而,由于inmemory后端可以在单台机器上处理约5000个等待锁,冗余是唯一真正的关注点。锁过期在memcache后端中也更可靠且更简单。

也可以提供一个以逗号分隔的服务器列表,以防止意外闯入池。这不是安全的,因为任何人都可以伪造他们的主机名。Distributex 客户端将传递主机的全限定域名(FQDN)。

还可以设置“maxlocks”,使池的行为类似于信号量。

您可以通过以下方式测试该服务

$ curl "http://localhost:9889/get/?host=me&pool=pool1"
YES
$ curl "http://localhost:9889/get/?host=them&pool=pool1"
NO
$ curl "http://localhost:9889/release/?host=me&pool=pool1"
OK
$ curl "http://localhost:9889/get/?host=them&pool=pool1"
YES
$ curl "http://localhost:9889/release/?host=them&pool=pool1"
OK

该服务还提供了一个“wait”命令,它将保持连接打开,直到获得锁。

Distributex 客户端

本包不包括一个简单的 Python 脚本,用于包装命令。您可以从 https://raw.github.com/calston/distributex/master/client/distributex 获取它

usage: distributex [-h] -H HOST -r POOL [-p PORT] [command]

Distributex client

positional arguments:
  command     Command to execute when lock is obtained

optional arguments:
  -h, --help  show this help message and exit
  -H HOST     Server hostname
  -r POOL     Resource pool
  -p PORT     Server port (default 9889)
  -l          Use local locking as well

这有助于阻止像 Puppet 这样的 cron 作业。

*/5 * * * * /usr/bin/distributex -H distributex.acme.com -r pool1 '/usr/bin/puppet agent --onetime --no-daemonize'

这将确保集群中任何时候只有一个 Puppet 实例正在运行。您可能还想向 distributex 传递 -l 以防止本地进程重叠。

项目详情


下载文件

下载适合您平台的文件。如果您不确定要选择哪个,请了解有关 安装软件包 的更多信息。

源分发

distributex-0.7.tar.gz (4.4 kB 查看哈希值)

上传时间

由以下支持