文档章节

如何打造支撑百万用户的分布式代码托管平台

 爱哭的小魔女
发布于 2017/06/19 16:32
字数 4166
阅读 7
收藏 0

RDC如何打造支撑百万用户的分布式代码托管平台

billy.lb 2017-04-06 13:56:15 浏览2472 评论4 发表于: 研发协同RDC >> RDC产品

分布式 架构 阿里云 服务器 性能 高并发 阿里巴巴 SSH 代码托管 数据同步 容灾 gitlab

摘要: 本文主要介绍了阿里巴巴集团代码服务团队,在过去一年基于GitLab进行的代码托管分布式改造,希望与大家进行分享与探讨,为云上开发者提供更好的代码托管服务

一、背景介绍

毋庸置疑,代码是DevOps流程的起点,是所有研发流程的基础;代码托管为代码“保驾护航”,确保代码的安全性、可用性,同时提供围绕代码的一些基础服务,如MR、Issues等等。

阿里巴巴集团GitLab是基于GitLab社区版8.3版本开发,目前支撑全集团数万规模的研发团队,累计创建数十万项目,日请求量千万级别,存储TB级别,早已超过了GitLab社区版承诺的单机上限能力,且增长速度迅猛。

面对这种情况,顺理成章的做法就是——扩容。然而非常不幸,GitLab的设计没有遵守Heroku推崇的“The Twelve-Factor App”的第四条:“把后端服务当作附加资源”(即对应用程序而言,不管是数据库、消息队列还是缓存等,都应该是附加资源,通过一个url或是其他存储在配置中的服务定位来获取数据;部署应可以按需加载或卸载资源),具体体现是:

所以GitLab社区版是基于“单机”模式设计,当存储容量和单机负载出现瓶颈时,难以扩容!

二、面对挑战

2015年初,阿里巴巴集团GitLab的单机负载开始呈现居高不下的情况,当时的应对方案是同步所有仓库信息到多台机器,将请求合理分配到几台机器上面从而降低单机的负载。然而这个方法治标不治本:

2015年中,团队正式启动了第一次改造尝试,当时的思路是去掉对本地文件系统的依赖,使用网络共享存储,具体思考和方案可以参见RailsConf 2016 - 我们如何为三万人的公司横向伸缩 GitLab。

然而由于本地缓存等问题的限制,网络共享存储的方案在性能上出现较明显性能问题,且大都为基于C/C++的底层改动,改造成本出现不收敛情况。而当时集团GitLab服务器在高峰期CPU屡屡突破**95%**甚至更高的警戒值,而高负载也导致了错误请求占比居高不下,无论是对上游应用的稳定性还是对用户体验都提出了严峻挑战。

2016年8月起新一轮改造开始。

三、改造方案

既然共享存储的方案暂时行不通(后续如果网络存储的读写性能有质的提升,未尝不是好的方式),首先明确了唯有分布式或者切片才能解决问题的基本思路。
我们注意到,GitLab一个仓库的特征性名称是"namespace_path/repo_path",而且几乎每个请求的URL中都包含着个部分(或者包含ID信息)。那么我们可以通过这个名称作分片的依据,将不同名称的仓库路由到不同的机器上面,同时将对于该仓库的相关请求也路由到对应机器上,这样服务就可以做到水平扩展。

下面通过一幅图介绍一下目前集团GitLab在单个机房内的架构。

Architecture.png

3.1 各个组件的功能主要是:

  1. Sharding-Proxy-Api用于记录仓库与目标机器之间的对应关系,可以看作切片的大脑
  2. Proxy负责对请求做统一处理,通过Sharding-Proxy-Api获取信息,从而将请求路由到正确的目标机器
  3. Git Cluster由多组节点构成,每组节点内有三台机器,分别为master,mirror和backup。其中master主要负责处理写(POST/PUT/DELETE)请求,mirror主要负责读(GET)请求,backup作为该节点内的热备机器

说明

3.2 保证方案可用

3.3 提升性能

3.4 确保数据安全

3.5 如何提升系统的可用性

3.6 单元化部署

单元化架构是从并行计算领域发展而来。在分布式服务设计领域,一个单元(Cell)就是满足某个分区所有业务操作的自包含的安装。而一个分区(Shard),则是整体数据集的一个子集,如果你用尾号来划分用户,那同样尾号的那部分用户就可以认为是一个分区。单元化就是将一个服务设计改造让其符合单元特征的过程。

为了实现单元化的目标,我们在最初设计时就往这方面考虑。比如跨机房备份中,消息消费应用需要调用**Sharding-Proxy-Api**获取rpc服务的地址时,尽可能做到数据在单机房内闭环。这样在满足单元化要求的同时,也可以在机房故障时,尽量不影响已进入队列的消息在消费时出现数据断流。

现在阿里巴巴集团GitLab在架构上已经基本具备了单元化部署的能力,这样的情况下,无论是后续与阿里云合作对外提供服务,还是当收购海外公司需要单独搭建新服务时,都不会遇到问题。

四、未来的改进

4.1 偶发的cache大量释放

由于GitLab有大量的IO操作,使得系统占用cache的数值巨大,也正是因为cache,系统的性能得到保证。然而成也cache败也cache,为了确保系统不会发生OOM,我们设定了vm.min_free_kbytes,当cache占用过多且需要继续申请大片内存时,会触发cache的释放,势必会影响释放瞬间请求处理能力(通过日志分析得到,此瞬间的处理能力仅为cache存在时的1/2左右),直接后果是该瞬间的请求堵塞,甚至出现部分502。

为此我们咨询了系统部的同学,根据他们的建议修改了部分内核参数(目前仍没有根治),后续会尝试升级内核的方式,也希望遇到过类似问题或对这方面问题有研究的同学,把你的秘籍传给我们。

4.2 自动化运维

目前集团GitLab的发布主要靠手,在分布式架构下,机器势必越来越多,全自动化的发布、扩容机制,是我们需要完善的地方。

4.3 rpc方案的最终落地

如前所述,只有最终实现了全局的rpc替换,才能将web服务所消耗的资源与Git本身消耗的资源进行分离,阿里巴巴集团GitLab的分布式改造才能算最终结束。

 

五、结语

监控及日志数据对比显示,过去一年中阿里巴巴集团GitLab**请求量增长4倍,项目数增长130%,用户数增长56%**,在这样的增速下,系统调用的正确率却从99.5%提升到了99.99%以上,这些数字印证了我们方案的可行性和可用性。

接下来的时间里,小伙伴们会为继续代码服务的创新而努力。“高扩展、分布式、响应式、大文件、按需下载、流控、安全、数据化、单元化”,有些我们做到了,有些是接下来努力的方向。

很自豪,今天的我们终于可以有底气地承诺:**现在阿里巴巴集团GitLab的架构,已经足够支撑百万规模的用户体量,在满足集团业务发展的前提下,会逐步会通过刚刚上线的研发协同RDC为更多云上开发者提供服务,共同打造云上的协同研发生态!**

 

 

原文链接

© 著作权归作者所有

粉丝 0
博文 105
码字总数 7329
作品 0
私信 提问
阿里中间件招聘

我们有世界上最牛的交易场景,但还缺少最牛的你! 招聘岗位: 资深Java开发工程师、技术专家 岗位描述: 中间件技术部是阿里巴巴集团生态系统的技术基石,为淘宝、天猫、聚划算、1688、B2B、A...

robin-yao
2016/05/31
677
0
阿里招聘JAVA工程师

我不是HR,只是一名做分布式服务的研发人员,最近我们部门正在招聘一批JAVA工程师。希望有兴趣的朋友可以来试试,一起共事。以下是是要求: 失效时间: 长期招聘 工作地点: 杭州市,北京市 工作...

ifree613
2016/09/16
323
0
OceanBase TechTalk上海站启动报名,深入解读蚂蚁双11背后的关键技术和实战分享!

盛夏的杭州我们在讲SQL 初秋的北京我们在谈OB 2.0 天气慢慢转凉,仿佛一夜之间就入冬了 这个冬天我们来到了上海 想与你们聊聊 OceanBase支撑蚂蚁双11背后的关键技术和实战分享 三位双11背后的...

荔子liqi
2018/12/18
0
0
【云栖精选11月刊】揭秘双11背后的互联网技术超级工程

阿里的双11是一次全球商业、科技、数据、智能的大协同,是一个商业社会的大协同,更是一个技术的大协同,是名副其实的世界互联网技术的超级工程。 今年的双11,阿里技术能力再创新记录,达到...

yq传送门
2017/12/30
0
0
蚂蚁金服双 11 大促全面揭秘:百万支付、容器化和平台智能化

2018年的双11十周年,最终成交额以2135亿元创纪录收官,支付宝系统在这场“商业奥运会”中再次经受住了考验。这也是OceanBase顺利支撑蚂蚁双11的第五年。 从五年前,只有10%流量切到OceanBa...

CSDN资讯
2018/12/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

arduino项目-1. 模拟楼道灯

@toc 1.1 情景说明 说明 漆黑的夜晚,当有人非法进入一所房屋,房屋内的灯在恰当的时间亮起,也许会有效阻止非法活动的继续。 效果展示 1.2 实验器材 器材名称 数量 继电器 1 人体红外感应器...

acktomas
29分钟前
4
0
Nacos 常见问题及解决方法

Nacos 开源至今已有一年,在这一年里,得到了很多用户的支持和反馈。在与社区的交流中,我们发现有一些问题出现的频率比较高,为了能够让用户更快的解决问题,我们总结了这篇常见问题及解决方...

阿里云官方博客
35分钟前
6
0
pinyin4j 满足中文转拼音的需求

引入依赖 // https://mvnrepository.com/artifact/com.belerweb/pinyin4j //汉字转拼音compile group: 'com.belerweb', name: 'pinyin4j', version: '2.5.1' 写入中文转拼英的工具......

edison_kwok
40分钟前
5
0
IPSE接入Substrate/Polkadot插槽实现互操作性的运行原理

Substrate框架将区块链的众多功能都模块化,对于开发者来说,只是一个选择的问题,同时还保持了众多的可以定制的功能和模块,比如底层通信模块,比如账户体系,比如共识机制等都是可以自己定...

IPSE
46分钟前
156
0
linux配置安装phpMyAdmin的步骤记录

1、首先在phpMyAdmin官方网站 http://www.phpmyadmin.net/downloads下载源码包,或者通过脚本之家进行下载://www.jb51.net/codes/405261.html ,下载后上传到服务器解压即可,或者通过Linux...

蜗牛女孩
48分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部