看新闻很累?看技术新闻更累?试试下载 InfoQ 手机客户端,每天上下班路上听新闻,有趣还有料!
Subtree 发布了 Dotmesh 。Dotmesh 是一种容器友好的应用状态快照工具,它提供了与 git 类似的命令行接口(CLI),操作并共享的捕获的应用状态数据。Dotmesh 主要从云原生和基于微服务的应用中捕获、管理和共享状态,便于调试和探索在 QA 和生产环境中发现的有问题状态。
Dotmesh 工具可对数据库和其它文件系统的状态做快照,提供了“类似于 git 的 CLI,用于捕获、组织和共享应用状态”。应用状态在“ datadot ”中捕获,并通过一种集中式的“dothub”仓储进行存储和共享。Dotmesh 可以在一次原子提交中捕获多种数据库的状态,每种状态在一个“ subdot ”中。该工具非常适用于在任一时间点上捕获基于微服务的应用状态。在基于微服务的应用环境中,应用状态分布于多个组件间,例如多个数据存储、缓存或队列。
下面给出 Dotmesh 文档中提供的一个简单的例子。该例子展示了如何启动一个以Dotmesh 为后台的PostgreSQL 容器:
docker run -d --volume-driver dm -v myapp:/var/lib/postgresql/data --name postgres postgres:9.6.6
上面的命令创建了一个称为“myapp”的 datadot,在其中创建了一个用于默认主分支的可写文件系统,并将主分支的可写文件系统挂接到PostgreSQ 容器的 /var/lib/postgresql/data
目录。运行命令dm commit -m "empty state"
将会提交该 datadot。该命令创建了当前分支上的文件系统状态在当前时间点的快照。
之后,再一次使用提交命令,就会将数据添加到 PostgreSQL 数据库中。通过运行dm log
命令,工程师可以确认提交的情况,也可以使用命令dm reset --hard HEAD^
回滚到首次提交。 HEAD^ 语法对于有 git 使用经验的工程师并不陌生,它表示“在当前分支上最新提交之前的一次提交”。通过指定标识符做提交,还可以实现回滚和快进。工程师可以将数据PUSH 到一个由集中式的“dothub”构成的Dotmesh 仓储。为使用当前的 Dothub SaaS 产品,访问仓储需要进行注册。工程师还可以在其它可用的 dot 上做CLONE 和PULL 。
基于微服务的应用,通常具有一个以上的有状态组件,例如多个数据库、缓存和队列。具有单一服务的应用有时也是如此。datadot 可在原子的、一致的单次提交中捕获所有这些状态。由于subdot 划分了文件系统,使得不同容器可以使用文件系统的不同部分,因此可以将subdot 看出是主分支可写文件系统的另一种分区。对datadot 的提交和分支,将作用于整个datadot,而非特定的subdot。这意味着,datadot 提交的是整个应用状态的快照,而非单个数据服务。
图1 datadot 图解(图片来自于 Dotmesh 文档)
Dotmesh 使用 ZFS 存储 datadot 的内容。ZFS 是一种文件系统和逻辑卷的组合管理器,最初由 Sun Microsystems 设计。ZFS 提供的特性包括数据破坏防护、支持高存储容量、数据的有效压缩、文件系统和卷管理概念的集成、快照,以及使用写时复制(Copy-on-write)生成克隆(clone)。包括 Docker 在内的大多数 Linux 容器,都支持对 ZFS 卷的直接挂接。我们可以看到, ZFS on Linux (ZoL)的移植是成熟稳定的。但是,除非用户“对 ZoL 具有丰富的经验”,否则并不推荐当前在生产环境中使用ZFS Docker 存储驱动。Dotmesh 计划将在工具中囊括所需的这些专业经验。
Dotmesh 节点以集群方式组织。所有节点使用 etcd 以“网格”方式关联,构成一个集群,其中每个节点运行 Dotmesh 服务器。Dotmesh 的文档提供了在 Docker、通用 Kubernetes 集群和 GKE(Google Container Engine)上安装 Dotmesh 服务器的指导。集群中的任一节点,都可以看到并操作同一组 Dot。Dotmesh 实现将 datadot 上的数据按需在集群中的节点间移动。
在所有分支上的全部提交,会自动地复制到每一个节点上。其中唯一不被复制的,是每个分支的所有 subdot 中的未提交的状态,即“脏”状态。“脏”状态存储在称为分支“主节点”的单个节点上。对“脏”状态的提交,可以确保数据被复制到了多个节点上。
服务器进程间使用两种方式通信。一种是使用etcd 中的共享状态,通过42380 端口在节点间通信。另一种使用6969 端口通过HTTP 通信。在Dotmesh 文档指出,使用6969 端口的HTTP 通信是未加密的,无法保护通信免受攻击者的攻击。因此,必须在集群中锁定这些端口。如果集群要扩展到不信任的网络上,必须使用VPN。
图2 Dotmesh 的架构(图片来自于 Dotmesh 文档)
Dotmesh FAQ 还阐明了该工具与 Portworx 和 Rook 等其它容器和云原生存储产品的不同之处:
事实上,Portworx 和 Dotmesh 解决了不同的问题。我们认为,Portworx 提供了一种同步复制的块存储,它解决的是生产环境中容器的存储问题。是否采用 Portworx,通常是一个运维上的决策。Portworx 很一种很好的工具,并且对于很多客户都是一种必要的组件,尤其是在本地部署环境中。这时用户并不具有 EBS 或 GCE PD 等技术可用,或者是缺乏这些技术。
在 FAQ 中还指出,团队并未试图将 Dotmesh 构建成另一种同步复制块存储系统,而是意在“解决更广泛、更专注于工作流的问题,将数据置于整个软件开发生命周期中的正确位置”。团队希望达成的目标是可以“捕获、组织和共享应用状态,即整个应用的快照”,尤其聚焦于开发人员的工作流,并构建基于微服务的应用和使用混合持久化(Ployglot persistence)管理状态。
在 Dotmesh 项目的网站和 GitHub 仓储中,提供了更丰富的信息。开发人员可以通过一个交互式的 Katacoda 教程尝试使用该工具。
查看英文原文: Subtree Release “Dotmesh”, a Git-like CLI for Capturing, Organising and Sharing Application States
评论