git 分布式文件系统问题

类似这些代码托管平台github,gitlab,Bitbucket,oschina,coding.net,csdn等,在涉及到git对文件操作的时候,都有用到哪些相关技术啊?尤其在文件数量很大的时候,有哪些常见优化手段???

阅读 3.4k
1 个回答

我说点好玩的:

我姑妄诌之,你姑妄听之。

gitlab之类git服务的瓶颈一般不在cpu,而在io。

cpu扩容很简单,加机器。io扩容很难。

尤其是gitlab,绑死了libgit,导致文件系统的io成了系统瓶颈。

阿里给了一个(两个)方案。

1,对进入的http(https)流量做一致性哈希,进行流量分片,不同的流量打入不同的后段服务器。

ssh流量进行流量转换,从ssh流量转换成http流量,然后一致性哈希。

一台机器只对应部分(例如十分之一)的请求。

至于gitlab,加机器就行了。

运维起来比较复杂,技术含量中等,实现起来比较复杂。

但是阿里并没有选择这种方案,选择了第二种。

2,改造libgit

这个说起来非常简单。

阿里有自研的对象存储平台(oss,貌似叫阿里云对象存储),只要改造libgit,将所有的io操作嫁接到oss上即可。

cpu到瓶颈了?直接加机器。

io到瓶颈?把黑锅甩给oss。

运维起来简单,技术含量高。

下面信口胡诌一个运维起来简单,实现起来简单的方案。

既然瓶颈是io了,我们搞个分布式的文件系统不就得了,不用改代码,还和现有系统无缝连接。

并没有专门咨询过oschina的方案,不过从目前流出的一些情报来看,猜测他们使用ceph解决gitlab的io问题。

更新:
oschina的方案。
https://my.oschina.net/GIIoOS...

也是上面那几条,

团队决定使用 Ceph FS,当服务最终迁移到 Ceph 上时,迁移成功一天之后就出现了严重的宕机事故,经过研究发现, Git 存储库具有海量的小文件,海量小文件一直是分布式文件系统的难题,并且当时 Ceph 也并未完善,我们不得不回退到旧的 NFS 方案。 码云的分布式由此被提出到议程。

后来有团队成员提出了使用 NGINX 动态代理,通过解析请求的 URL,将与存储相关的请求代理到存储服务器上,然后, 存储服务器上的 Gitlab 对请求进行解析。这样一来, 浏览器访问,以及 Git 的 HTTP 协议 clone 都能够分发到各个存储服务器上。 这个时候剩下的就是如何实现 NGINX 动态代理了,由于我实现 git 的 svn 接入时有过 NGINX 模块开发经验,所以就被安排到 NGINX 动态代理模块的开发, 以及路由模块的开发。路由策略一开始直接使用Gitlab 的 Magic Path 策略,即取用户的前两个字符 (A~Z|a~z|0~9|-_) 等, 不同的 Magic Path 对应不同的内网 IP。后来改为在 MySQL 中存储用户的仓库所在的机器内网 IP,并将 IP 缓存到 Redis 中,独立存储。 路由模块自主的向 Redis~MySQL 读取路由,当从 MySQL 中也找不到存储机器时,才返回错误。对于存储库无关的 URL 请求, 随机分发到不同的存储服务器上。先后有 zouqilin 和 lowkey2046 参与开发。

NGINX 的动态代理方案中,其模块开发也经历了基于 NDK 旧版路由,NDK 新版路由,以及 Upstream 新版路由的演进。 目前已经稳定运行,其中不乏企业用户的私有化部署。

对于 SSH 协议方案的分布式支持,最初采用的是 zouqilin 的意见: 使用端口转发。 gitlab-shell 只需要少量修改就能支持了 SSH 端口转发。 这个时候,唯一没有分布式支持的就是 svn 协议,作为 svn 兼容实现的开发者,我在接受 svn 分布式任务后,使用 Boost.Asio 开发实现了 svnsrv 动态代理服务器,经过一些波折,svnsrv 服务器也逐渐稳定下来。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题