GitHub的数百台服务器中存储着超过3500万仓库以及超过3000万的Gists 代码片段。去年以来,我们创建了 DGit,DGit是一个分布式存储系统,DGit显著地提高了Git存储的可用性,可靠性。 DGit是“Distributed Git”的简写,即分布式Git。众所周知,Git本身就是分布式的,任何的Git仓库备份都是包含该项目所有历史版本的所有的文件,分支,以及提交记录。DGit利用Git的这个特性为每个仓库在三个服务器中保存着三份备份。DGit的的设计初衷是为了实现Git存储没有单点故障的可用性要求。甚至其中的两个备份都不可用,仓库仍能保持可读状态;类似 fetches,clones,以及大部分的web操作依然可用。 |
DGit 的备份机制是在应用层的,而不是硬件层的磁盘。要知道DGit的备份是通过Git协议同步的三份松耦合的完整仓库,而不是完整的磁盘镜像。这样的设计让我们可以很灵活地决策备份存储在哪里,以及哪个备份用于读操作。 假设一个文件服务器需要下线,DGit可以自动地判断哪些仓库的备份少于3份,并且自动创建一个新的备份到其他可用的服务器上。这个”自愈“的程序使用集群中剩下所有服务器作为操作源和目的。这个自愈程序的吞吐量是多对多并行的,所以性能上会很快,而且这个过程不会引起服务中断。 |
DGit 使用原生的Git技术大多数的终端用户都是在 .git 文件夹中存储Git仓库的对象,打包文件以及引用。他们利用Git命令行工具或者GitHub Desktop这样的图形化客户端,或者Git的IDE插件去访问仓库。也许这会很让人惊讶,GitHub的仓库存储 DGit,也是使用同样的Git原生的技术。那么为什么不使用 SAN?(Storage Area Network 网络存储),为什么不用分布式的文件系统?为什么不用云技术去抽象这个问题? 答案很简单:因为原生的Git技术足够快并且很可靠。 Git对于延迟是很敏感的,一个简单的Git命令,如 git log 或者 git blame,就有可能需要加载上千个Git对象然后遍历完这些对象。如果其中有任何底层的延迟,系统的性能将急剧下降。因此,利用分布式文件系统存储 Git仓库是不可取的(这点GIT@OSC码云2014年曾经以活生生的反面例子证明过了,详情欢迎找@yashin 开喷)。Git的最佳性能取决于磁盘的访问性能,因此,DGit的文件存储使用的是SSD。 |
在服务的高层来说,Git 仓库之间的数据交换也通过协议做了最大的优化(例如push,fetch操作)。所以我们直接使用Git的这些协议做DGit的备份同步。 Git是成熟的久经考验的技术。所以我们已经有一辆F1赛车了干嘛还要重复造轮子呢? GitHub的哲学就是我们的服务器使用Git的习惯要尽可能像我们的用户使用Git一样。DGit继续着这个传统。我们的职员中有几个Git以及 libgit2 项目的核心贡献者,如果我们发现了一个性能瓶颈或者别的问题,我们修复了这些问题的同时也会贡献到这几个开源项目中让所有人都可以受益。以我们对Git技术对经验水平和专业知识看来,使用Git原生技术作为DGit的备份方案是一个明智的选择。 |
GitHub 架构, 之前和之后一直到最近,我们仓库的备份机制都是使用现成的磁盘级别的备份技术-也就是 RAID 和 DRBD。我们的文件系统都是主重备份的。每一个在线等文件服务器都有一个通过专用网线实时备份的替身。每一个在线的文件都有四个备份:两个备份在主服务器上,使用的是RAID,另外两个备份在热备的服务器上,使用 DRBD。当文件服务器发生任何状况的时候(类似:硬件故障,软件崩溃,机器超负载),需要运维人员去确定故障原因并且切换到热备的服务器。因此,这个方案由于高冗余,数据可靠性级别还是很高的,但是这个故障恢复的程序需要人工干预,不可避免地会出现仓库访问失效,即无法保证可用性。为了让意外尽可能少发生,我们都是使用专业的,高可靠性的服务器存储仓库。 |
现在,我们使用DGit,每一个仓库分别独立地存储在我们的文件服务器集群中的三个服务器上。DGit自动地为每个仓库选择宿主服务器,同步备份到各个宿主服务器,并选择一个最佳到服务器来响应每个读请求。写操作时同步地写入到三个备份中,保证至少两个备份写入成果才确认提交这个写操作。
GitHub的仓库现在存储在一个叫 github-dfs 的集群中,dfs 是 “DGit file server”的简称。这些仓库是利用Git和libgit2存储在每个服务器的本地磁盘中的。这个集群的客户端包括web前端以及响应用户的Git客户端的代理。
|
DGit 的优势DGit带来了很多优势无论对GitHub用户而言还是对GitHub内部对基础设施团队而言。这也是容纳未来更多创新的关键性的基础建设。
|
首发上线DGit是一个很大的系统更改,我们必须平滑地切换过来。DGit最复杂的部分是备份机制不再像以前那么容易理解:每份仓库都明确地存储在三个服务器上,而不是像以前只存在一组主从热备服务器中。因此,DGit必须要负责自身的串行化处理,加锁,故障处理,以及再同步,而不是像之前使用 DRBD,RAID来控制备份同步。以上这些丰富的主题就是我们今后的文章需要去解析的。一言以蔽之,我们在使用DGit来存储用户的数据之前必须要彻底地测试它。我们的部署过程包括很多步骤:
在首发上线期间,我们惯例地关掉一些服务器,有时候一次关闭多个,用户的操作没有被中断。 截止于发布这篇文章的时候,已经有58%的仓库和96% 的Gists代码片段存储在DGit中,这表示GitHub上67% 的Git操作都是基于DGit之上的。接下来我们会尽快把DGit前时代的主从热服务器变成DGit服务器。 |
github总是力求获取、推送、查看项目仓库能够更快和更可靠。DGit是在仓库存储层多年来满足这些目标同时允许进行水平扩展和提供容错能力。 在下个月我们将会跟进深入理解DGit技术内幕的帖子。 |
本文转自:开源中国社区 [http://www.oschina.net]
本文标题:DGit 介绍
本文地址:http://www.oschina.net/translate/introducing-dgit
参与翻译:Yashin, Kfly
英文原文:Introducing DGit