字节跳动云原生

字节跳动如何从 0 到 1 打造一个开源项目?

Image

目前各大开源社区里都少不了字节跳动的身影,字节跳动是如何从社区的获利者变成了社区的贡献者?这篇文章整理自火山引擎副总裁张鑫的直播公开课《字节跳动的开源实践与思考》,带你一起揭秘字节跳动的开源目标和思考。

字节跳动一直致力于在开源项目中贡献一份自己的力量,到目前为止已经开源了 CloudWeGo、Elkeid 等多个基于字节内部技术沉淀的开源项目。和很多公司一样,字节跳动从初期接触开源到成为开源活动的践行者大体经历三个阶段:
第一阶段,使用开源。为了推动业务更快发展,如果社区有比较好的、成熟的开源技术和工具,我们会主动使用。
其实在字节跳动业务发展的早期,我们大量采用了公有云,并且在公有云之上广泛采用相关的开源技术和开源中间件,来快速打造自身技术中台和基础架构,以此支撑和推动抖音、头条等业务的发展。
第二阶段,参与开源。随着开源技术用得越来越深,在自身业务场景下,我们还会做很多的创新,包括对原有的开源项目进行技术优化。在这个阶段我们也会把取得的成果反哺到社区里,与社区同学一起进行经验共享。
第三阶段,主动开源。当项目积累、经验优化多了以后,我们也会整理成一些完整的项目。这就到了第三个阶段,我们会主动开源一些体系化的项目回馈到社区。
从 2015 年我们开源 Rcproxy 项目开始,字节一直在开源社区中贡献、维护很多的开源项目。根据统计数据,我们总共开源了超过 100 个项目,也对这些项目做了严格的分类。比如常规项目,所谓常规项目就是端对端提供一个完整的场景化解决方案,或者是提供一个完整的功能闭环,这是我们的主体项目。除了常规项目以外,我们也会辅助地去开源一些相关的 demo、CLI 或者 SDK 工具,这些是辅助的开源项目。

单常规项目这一项,字节跳动主动开源了 50 多个项目,其中代表项目有前端的 Web 框架 Modern.js,云原生领域的中间件集合 CloudWeGo ,机器学习领域开源的高性能分布式训练框架 BytePS,以及联邦学习平台 FedLearner 等等。如果从数量上看,常规项目里排名第一的是基础架构相关的开源项目,除此以外,是和 AI、算法与平台相关的开源项目,以及和前端、音视频相关的开源项目。

开源委员会的责任和工作范畴
从 2015 年到现在,绝大多数开源项目由我们工程师的个人兴趣驱动。这虽然打造了一种很好的开源文化,但过程中其实也遇到了一些问题,比如规范性问题。这使我们意识到,开源仅仅靠工程师的个人兴趣驱动是不够的,还需要引入公司级的策略、规范与流程机制,这也是字节跳动开源委员会首先要做的工作。
此外,当公司越来越大,工程师投身开源的时候,需要合理分配精力和资源到更重要的战略型项目上,这是我们成立开源委员会的另外一个初衷。开源委员会还要推进各个公司、组织、社区在开源领域建立更好的合作关系。

从确定要成立开源委员会到开源委员会正式成立,期间我们用了半年左右时间来完成前期准备工作。开源委员会成立以后,我们面临的第一个问题是什么样的项目适合开源?

开源标准

  • 具备普适性;
  • 为开发者提供便利;
  • 助力社区/行业形成统一标准;
  • 具备技术领先优势,不重造轮子,避免 KPI 工程。
项目开源出去以后,我们也参考 CNCF、云原生技术委员会对项目的分级机制,把项目分成了不同级别。基于这样的项目分级机制,我们开始思考,什么样的项目能够更加顺畅地进入到成熟阶段,获得公司更多的资源以及以更高的优先级去进行开源?

什么样的项目具有更高的优先级

  • 技术领域中没有形成事实标准,能够填补局部空白;
  • 开源技术可覆盖的开发者基数大,具有普适性;
  • 字节跳动在该技术领域有优势,能推动领域技术发展;
  • 不与公司业务发生冲突;
  • 能够推动自身业务发展、提升技术影响力。
根据这些标准,当决定一个项目是否应该开源后,我们还要保证这个开源的项目能够成功。针对成功与否,我们就需要有一套所谓的价值观或者价值体系来衡量。

开源项目的价值观

  • 一个开源项目不应该去设立短期 KPI,这样容易本末倒置,让大家动作变形。所以我们会制定一些长期的北极星指标,这些指标会围绕我们前面说的几个价值点来进行衡量;
  • 我们追求打造有价值的精品项目,这个优先级要高于对各技术领域的广泛覆盖;
  • 我们认为通过一个开源技术去创造用户价值,它的优先级要高于实现短期商业变现;
  • 安全和合规是底线。

CloudWeGo:聚焦微服务通信与治理

CloudWeGo 是由字节跳动基础架构团队开源的一套企业级云原生中间件集合,帮助企业快速地搭建自己的微服务系统。专注于微服务通信与治理,具有高性能、可扩展、高可靠、易用性等几个显著特点。

CloudWeGo 的项目都是在字节内部经过大规模落地实践验证的,开源后,项目的每项迭代更新都经过内部业务场景实践,内外能力一致,是一个真正的企业级落地项目。其次,CloudWeGo 提供的功能,尤其是协议支持和服务治理,都是能解决真实业务痛点的,每一行代码优化都能实实在在地提升用户服务的性能。最后,CloudWeGo 的研发也借鉴了一些知名开源项目的设计思路,同时也依赖一些开源项目的实现,它的开源不仅是字节跳动对开源社区的反哺,也是对社区工具链的进一步丰富。

CloudWeGo 目前开源了 Kitex、Hertz、Netpoll 和 Thriftgo 等项目。

Github:github.com/orgs/cloudwego

Image

发展到今天,cloudwego/kitex 已经有超过 4.7K 的 star,Netpoll 也有超过 2.9K 的 star。目前 cloudwego/kitex 已经支持接入阿里云的微服务引擎 MSE、应用实时监控服务 ARMS,还有腾讯云的微服务引擎 TSE。

同时,项目也在积极与字节跳动推出的云服务平台火山引擎的相关产品做集成,完成后相关产品和能力也将陆续地对大家开放,方便开源用户快速上云。

CloudWeGo 非常注重社区文化和社区建设,具有完善的成员晋升机制,同时也积极培养社区开发者作为社区的核心力量。截止到目前,CloudWeGo 已经先后培养了五位 Committer,他们给社区的发展做出了重要的贡献,在此感谢这些开源贡献者。
我们也非常欢迎有更多志同道合的朋友可以参与到社区的建设中来,为社区的发展建言献策、贡献自己的力量。

Elkeid:更适合云原生时代

下面我再分享另外一个也是非常重要的领域 —— 安全领域的开源项目实践,这个开源项目叫做 Elkeid,意思是瑶光 / 破军,也是北斗七星之一,它解决的问题就是主机安全。Elkeid 是由字节跳动内部安全与风控团队自研的一个新的主机安全解决方案,它具备几个鲜明的特点。

Github:https://github.com/bytedance/Elkeid

一个就是规模大,能够支撑字节跳动内部百万级的服务器数量。另外一个特点是 Elkeid 采用了字节内核态的技术进行大多数指标和信息的收集。这样一方面可以极大地提升性能,另一方面也可以采集更多、更丰富的数据,从而大大增强我们的检测能力。

Image

Elkeid 技术架构的优势

  • 实现了端上采集,后端做分析,降低在端上原地的计算压力;
  • 后端所有的组件都可以支持高可用,从而可以支持百万级别规模的接入;
  • 整体的依赖少,维护成本低;
  • 二次开发友好,每一个主机上的 Agent 都支持不同的插件,从而实现一些定制化的能力。
我们为什么要去开源这个项目呢?
其实最早我们也是基于一些已有的主流主机安全方案来提升自身的业务系统安全性。但是随着字节业务体量、规模和需求不断地增多,传统的方案在我们的场景下逐渐暴露出了瓶颈。随后,基于我们前面所提到的内核态的开源主机方案,我们自研了 Elkeid,并且为行业里面去证明了该方案的可行性和价值。

进一步随着混合云和云原生发展的越来越快,传统的主机方案很难适应新的容器化和云原生化的这样一种新的应用形态。当我们看到这样一个趋势以后,我们也希望能够把自研的 Elkeid 开源出来,和领域去进行共建,能够借助更多的力量,我们去涵盖更多的场景,去开发更多的策略,进而提升整个我们项目的有效性。

ByteHouse:赋能下一代技术架构

字节跳动在数据仓库、数据分析这个重要的领域从开源演化出来了一个技术,叫做 ByteHouse。从 2019 年之后,字节跳动开始广泛使用 ClickHouse。目前,ClickHouse 在字节跳动内部的总节点数已经超过了 1.5 万,管理的数据总量也达到了 600 PB 之多,每日查询的请求超过上亿次,它的应用场景也非常多。

ClickHouse 本身有很多的优势,如果总结下来就是多、快、好、省。当然,ClickHouse 本身也有不适合的场景。比如说对于 KV 、 Blog 或者文档存储的支持能力不够,或者在查询中如果使用大量的 Drive,也不能够特别好的支持。

除了这些局限以外,随着字节跳动深度使用,在第二阶段我们也开始遇到一些问题,很多问题的根源其实都是来自于 ClickHouse 的架构。随着字节业务的发展和扩张,ClickHouse 集群的算力会逐渐成为瓶颈,这时候我们就要对集群进行扩容。一旦扩容,数据也要相应的移动,去做所谓的重新平衡。但是在重新平衡的过程中,又会有很多其他的开销、运维的准备工作。包括应对数据丢失的风险,要保证原数据的一致性和正确性。所以这样也会导致错失很多集群扩展的最佳时间。

基于 ClickHouse 这些问题,在第三个阶段,我们就开始进行对应的技术优化。最主要的一个技术优化点就是我们使用了计算和存储分离的架构,也叫做分解式的基础架构。

Image

原来在一台节点上既做存储又做计算,但是在分解式基础架构或者存算分离的架构里,会提供一个通用存储层。计算层可以自由地进行灵活的弹性伸缩,如果需要更多的算力,只需要添加更多的计算节点,如果需要更多的存储空间,可以扩展存储层所需要的容量。当然,弹性的伸缩还带来了无尽的扩展性,因为数据是在存储层中共享的,所以理论上我们可以横向地扩展,以尽可能的利用更多的计算资源。这个设计对于集群管理者十分友好。

这个新架构也会带来一些挑战,我们也设计了对应的解决方案。比如性能问题,共享存储的架构是否会引发一些性能的妥协。当进行 ByteHouse 研发时,我们通过增加数据的缓存层来弥补远程读写的性能损耗。

第二个挑战就是 ByteHouse 引擎在读写分离的架构下,数据存储的系统我们希望可以适配使用不同的场景和不同的实现方案。比如说本地存储就会适配 HDFS,原始数据文件就不需要做大量的迁移。当我们部署在不同的公有云的时候也希望能够快速地适配不同的云存储。

因此,在整个的物理存储系统之下,我们就需要构建一个抽象层,这一层我们内部管它叫 VFS,Virtual Filesystem,就是虚拟文件系统,来提供面向不同存储系统的访问接口。这是第三个阶段,我们做了一系列的技术优化。

到了第四阶段,当我们实现了一些自身的业务优化或者是功能创新的时候,我们也希望能够反哺社区。

ByteHouse 作为基于容器化和云时代的计算引擎,一个很大的亮点就是架构上实现了计算和存储的分离,允许两者去做独立的扩展和弹性的伸缩。同时,我们可以方便用户根据不同的业务工作负载特点,来实现实时的计算和存储的资源配比,来达到最高的 TCO。基于这样的一些架构的设计和技术创新,我们开始不断地把 ByteHouse 再进行产品化,并且把它定位成一站式轻量的云数仓。

除了 ByteHouse 以外,周边我们也补充了大量的工具和能力,来方便开发者更好的使用这项技术,包括获得多种数据源的导入,提高查询可观测能力和诊断能力,以及在多租户下去进行数据权限的多级管控等等。

本文转载自 51CTO 开源基础软件社区

- END -

下载云原生白皮书

基于字节跳动基础架构提供的云原生技术能力和技术实践,火山引擎已经构建了全栈的云原生服务产品矩阵,包括面向算力的云原生服务、面向应用的云原生服务和面向场景的云原生服务三大板块。

欢迎下载 IDC 和火山引擎联合出品的云原生白皮书,获取企业数字化转型新理念!

Image

扫描二维码,下载火山引擎云原生白皮书

加入我们
字节跳动基础架构产品运营团队,作为架构各组件产品对外表达和用户信息反馈的桥梁,支持架构各组件的产品运营工作。在字节跳动,产品运营团队对产品的影响力打造、产品增长、用户体验负责,并提供横向运营能力支持,具备完整的产品市场能力和全链路产品运营能力。
联系人:[email protected]

点击【阅读原文】,加入我们!