@Rays
2018-02-12T16:57:51.000000Z
字数 2768
阅读 1822
系统架构
摘要: Subtree发布了Dotmesh。Dotmesh是一种容器友好的应用状态快照工具,它提供了与git类似的命令行接口(CLI),操作并共享的捕获的应用状态数据。Dotmesh主要从云原生和基于微服务的应用中捕获、管理和共享状态,便于调试和探索在QA和生产环境中发现的有问题状态。
作者: Daniel Bryant
正文:
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