3个版本 (重大更改)
使用旧的Rust 2015
0.4.0 | 2017年2月24日 |
---|---|
0.2.0 | 2017年2月19日 |
0.1.0 | 2017年2月18日 |
在并发 中排名 1193
15KB
374 行
monotone
分布式系统中的配置管理计数器和队列
Monotone是一个库和命令行工具,用于维护原子计数器和队列。实现考虑到配置管理。请注意,计数器不是用于事件跟踪的性能计数器。
包含两种实现
- 单进程实现,通过
Arc<Mutex<...>>
同步 - DynamoDb实现,使用乐观锁的乐观更新
文档
构建/安装
源代码仓库包含两个项目。库名为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整数的完整范围。
简单的领导者选举或锁
队列中的节点列表足以提名一个特殊进程或领导者。
只需使用队列中的第一个进程。
有几个限制
- 没有活动检查来从队列中删除失败的进程
- 你必须使用围栏令牌来确保在作为领导者/持有锁的同时,队列没有发生变化。
依赖项
~21–32MB
~627K SLoC