有什么方法可以在厨师节点中实现互斥吗?

Goi*_*oin 5 rest mutex chef-infra

例如,如果进程在厨师客户端运行时更新节点,那么厨师客户端将覆盖节点数据:

  1. Chef-client获取节点数据(状态1)
  2. 进程A获取节点数据(状态1)
  3. 进程A本地更新节点数据(状态2)
  4. 该过程保存节点数据(状态2)
  5. Chef-client 在本地更新节点数据(状态 2*)
  6. Chef-client保存的是节点数据,该节点数据不包含进程A(状态2)的变化。Chef-client 覆盖节点数据。(状态 2*)

如果我们有两个进程同时保存节点数据,也会出现同样的问题

编辑

我们需要进行外部修改,因为我们有一个漂亮的 Chef 服务器 UI 来远程管理大量计算机,显示为树状(类似于 LDAP)。管理员可以从此处更新配方的值。该项目是开源的: https: //github.com/gecos-team/

尽管我们有一个信号量系统,但我们发现如果我们有两个或多个同时请求,我们可能会遇到并发问题:

  1. 正常情况是系统正常工作
  2. 但有时系统不工作

编辑2

我添加了一份文档,其中包含有关我们问题的大量信息。

Rol*_*and 3

Chef 没有实现事务功能,并且默认情况下它不会在更新时自动重新聚合节点。它对竞争条件开放,您可以尝试通过厨师客户端运行中更新的节点属性来减少竞争条件(就在您执行关键操作之前),但您永远不会得到可靠的工作设置。

\n\n

收敛运行的时间越长,腐败的差距和风险就越大。

\n\n

Chef 的节点属性仅对在节点本身上运行的 Chef 客户端进行调试或修改有用,在高度并发/动态环境中几乎没有用处。

\n\n

我将使用Consul.io实时协调信号量和键/值配置数据。使用厨师食谱或 LWRP 使用 consul 提供的各种接口之一(http、DNS、\xc2\xa0\xe2\x80\xa6)访问它。

\n\n

您可以实现一个非常简单的推送作业任务来运行厨师客户端(恕我直言,比厨师“推送作业”功能更容易、更强大,但未集成到厨师的 ACL/用户管理中),该任务也由分布式信号量保护或使用“领导者选举”功能。当然,您也必须将此逻辑添加到节点更新脚本中。

\n\n

然后,Chef-client 将检索启动时的锁,并阻止您在数据收敛时操作数据,反之亦然。

\n