#counter #monotonic #distributed #aws #distributed-systems #configuration-management

monotone-cli

基于AWS DynamoDB实现的单调计数器命令行工具

3个版本 (重大更改)

使用旧的Rust 2015

0.4.0 2017年2月24日
0.2.0 2017年2月19日
0.1.0 2017年2月18日

并发 中排名 1193

Apache-2.0

15KB
374

monotone

Build Status

分布式系统中的配置管理计数器和队列

Monotone是一个库和命令行工具,用于维护原子计数器和队列。实现考虑到配置管理。请注意,计数器不是用于事件跟踪的性能计数器。

包含两种实现

  1. 单进程实现,通过 Arc<Mutex<...>> 同步
  2. DynamoDb实现,使用乐观锁的乐观更新

文档

https://docs.rs/monotone

构建/安装

源代码仓库包含两个项目。库名为monotone,命令行工具位于名为cli的文件夹中,尽管它构建了一个名为monotone的可执行文件。

您可以通过将其添加到Cargo.toml中作为依赖项来链接到库,就像平常一样。选择 aws 功能以引入rusoto并使用DynamoDb后端。

默认情况下,仅为内存后端。

[dependencies]
monotone = { version = "0.4", features = ["aws"] }

笔记本电脑/开发环境中的命令行界面

安装rust。稳定的rust即可,但至少应该是1.15。

考虑使用rustup: https://www.rustup.rs

然后运行 cargo install monotone 来安装来自 https://crates.io 的版本,或 cargo install --path=. 直接从已签出的源安装。

CI/CD中的命令行界面

在您的jenkins上安装rust工具链或使用如这个容器之类的docker容器: https://hub.docker.com/r/jimmycuadra/rust/

然后像在您的开发环境中一样构建,并将构建的工件复制到安全的位置。

测试

《monotone//tests》文件夹包含集成测试。在《terraform》文件夹中包含运行集成测试的基础设施定义。请参阅那里的readme文件。

命令行命令

每个计数器或队列都在DynamoDb表中的单独一行存储。`-i`参数选择哪一行。命令行将防止你在队列上运行计数器命令,反之亦然。

计数器

计数器是一个简单的原子计数器。运行方式如下

monotone -i mycounter counter get

将返回

{
  "id": "mycounter",
  "value": 0,
  "region": "eu-west-1",
  "table": "Counters"
}

按如下方式增加计数器

monotone -i mycounter counter next

将返回

{
  "id": "mycounter",
  "value": 1,
  "region": "eu-west-1",
  "table": "Counters"
}

队列

队列是一组字符串进程ID。队列中的每个条目在加入列表时都会分配一个单调计数器值。该列表按照计数器值的升序排序。

队列包含一个围栏令牌,该令牌由所有操作返回。这将随着每次写入存储而单调递增。使用此令牌在其他系统中的条件更新,以防止在过时的队列视图中执行操作。

按如下方式将进程ID添加到队列中

monotone -i myqueue queue -p foo join

将输出类似以下内容

{
  "id": "myqueue",
  "region": "eu-west-1",
  "table": "Counters",
  "fencing_token": 1,
  "ticket": {
    "process_id": "foo",
    "counter": 1,
    "position": 0
  }
}

您也可以按如下方式删除节点(为了整洁)

monotone -i myqueue queue -p foo leave

这将打印输出

{
  "id": "myqueue",
  "region": "eu-west-1",
  "table": "Counters",
  "fencing_token": 2
}

要列出节点,请使用

monotone -i myqueue queue list

将输出类似以下内容

{
  "id": "myqueue",
  "region": "eu-west-1",
  "table": "Counters",
  "fencing_token": 2,
  "tickets": [
    {
      "process_id": "foo",
      "counter": 1,
      "position": 0
    }
  ]
}

示例用例

将服务器ID分配给Zookeeper集群中的节点

Zookeeper是存储类似于在此crate中实现的原子计数器的理想之地。但如果你还没有zookeeper集群,并且正在尝试构建一个集群呢?你必须建立在你所拥有的东西上,比如DynamoDb。

在首次启动时,按如下方式运行命令行的队列命令(务必确保主机名唯一,例如EC2实例ID!)

monotone -i myzkcluster queue -p $(hostname -f) join | jq .ticket.counter

将结果值写入`/etc/zookeeper/conf/myid`中。

注意,Zookeeper文档表示服务器ID必须在0到255之间。Monotone使用u64整数的完整范围。

简单的领导者选举或锁

队列中的节点列表足以提名一个特殊进程或领导者。

只需使用队列中的第一个进程。

有几个限制

  1. 没有活动检查来从队列中删除失败的进程
  2. 你必须使用围栏令牌来确保在作为领导者/持有锁的同时,队列没有发生变化。

依赖项

~21–32MB
~627K SLoC