【翻译】github 搜索团队访谈
2014-01-04 22:17
183 查看
介绍
gihtub 的搜索是基于 elasticsearch 构建的,在 github.com/search 页面,你可以检索项目、用户、issue、pull request,还有代码。搜索的目的就是让所有公开的东西易于查找。从上面 5 种可以搜索的内容来看,至少需要 5 个索引库。事实上共有 40-50个索引库,分别用于索引我们需要跟踪的各种数据。一个例子:安全日志,一旦用户在 github 上做了一些安全相关的操作,我们会在 elasticsearch 里写入记录,这样用户账户的任何异常都会有迹可循。另一个例子是,github 服务器端应用的异常报告也被从各个组件收集到 elasticsearch 的一个索引库里,我们有自己的异常报告框架,建立在 elasticsearch 之上。
技术演进
github 的搜索最初是建立在 solr 上的,但是随着用户数和项目数的增长,也伴随着数据量的增大,不是一台 solr 集群和一个 solr 实例所能承受得了的了。后来,我们决定迁移到 elasticsearch。但是,在迁移的过程中我们意识到,要处理的数据量之大已经不是我们在 Rackspace 的几台服务器所能处理的了。于是,我们把集群前移到了亚马逊 EC2上,目前使用了 44 个独立的 EC2 实例(存储节点 * 36 + 查询节点 * 8),每个实例带有一个 2TB 大小的 SSD 硬盘。集群上运行 elasticsearch 0.2,数据量有 30TB 大小。
遇到的问题
迁移过程中,我们也遇到了不少的麻烦。当我们发布博客宣布了新的搜索后,过了几天,各种 bug 出现了,有人说:“天哪,你可以在 github 上搜索到别人的密码!”,用户需要检查他们的 ssh key 了。。不止这些,服务也非常的不稳定而且容易崩溃!最终,我们不得不在搜索页面里显示:“对不起,代码搜索已下线”。后来,搜索小组的同志们花了整整 48 个小时才恢复服务(加班了?)。最后找到服务崩溃的原因是:elasticsearch 为了实现异步数据交换使用了大量的 NIO 类库,而我们使用的 OpenJDK 6 对 NIO 的实现还不够完善。切换到 Sun JDK 后,问题解决,服务也变得稳定起来了。
索引内容
我们索引两种类型的文档:一种是源文件(source code file),另一种是仓库(repository)。仓库文档主要跟踪仓库最近的提交(commit),以及它所涉及到的文件改动等。当用户推送(push)代码到 github 后,我们会把最新的代码拉取(pull)到 elasticsearch,并获取最新的改动,然后更新索引文档,这个过程是增量式的,不需要完全重构索引。我们只索引项目的主分支(master),但这个数据量依然巨大,20亿索引文档,30TB的索引文件。
英文原文+访谈音频:Interview with the Github Elasticsearch Team
相关文章推荐
- 欢迎加入ZendFramework手册中文版翻译团队
- iOS 官方文档翻译 微信公众平台 和 github 同步上线
- 基于学习的Web搜索结果聚类(翻译论文)
- github代码搜索技巧
- 仿应用汇应用搜索标签效果——flowTags基于github开源项目flowlayout
- Github: 团队账号:https://github.com/ChenRuTing
- SharpGIS博客翻译2006年12月:ArcGIS Server项目团队博客
- Git教程之一个团队如何在github上协作开发 转载
- 百度与google的搜索结果比较:汇总 翻译
- Github搭建的博客实现JS搜索功能
- [GitHub]第五讲:团队合作流程
- 微软Silverlight团队关于PDC会议发表官方补充声明(风云翻译版)
- 团队各成员如何使用GitHub共同编辑文档?
- 如何使用GitHub进行团队Android工程的开发
- Github搜索技巧-如何使用github找到相关有帮助的代码
- 预则立&&他山之石--团队计划、访谈优秀前辈
- 突发奇想,可直接在github上搜索QPainter(一不小心还搜到了devbean作者的github账号)
- [翻译]搜索关键字 – 管道与过滤器模式(Pipes-and-Filters)与装饰模式(Decorator)之间的关系
- [个人]加入了ruby hacking guide的中文翻译团队
- GitHub 托管代码 团队进行工作