火山引擎DataLeap的Data Catalog系统公有云实践 (下)

2023年 7月 31日 74.9k 0

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群

Data Catalog公有云遇到的挑战

Data Catalog经历了一个从0到1在火山引擎公有云部署并逐步优化和迭代发布10+版本的过程,在这个过程中经历不少挑战,下面将介绍其中比较典型的问题以及我们探索并实践的一些解决方案。

网络和数据安全

为保证网络安全和多租户数据安全,火山引擎上公有云产品部署的环境划分为“公共服务区”和“售卖区”,同时售卖区又分割为若干私有网络(即VPC),然后公共服务区和售卖区以及售卖区的VPC之间都是网络隔离的。

Data Catalog会依赖一些内部公共服务,这类服务通常都部署在公共服务区,而按照网络和数据安全规范,Data Catalog作为独立云产品需要部署在售卖区独立VPC内,类似的情况Data Catalog依赖的数据中台产品也需部署在独立VPC内,例如EMR、LAS和Bytehouse。另外,Data Catalog对外会提供OpenAPI,外部客户可以通过火山引擎的API网关来访问这些API,但API网关服务是在公共服务区,无法直接访问到Data Catalog服务,基于以上情况,为了正常对外提供服务,我们需要解决网络隔离问题同时还要保证安全性。

解决方案:

流程图.jpg

  • 服务部署: 为了能够在售卖区部署,经过调研我们选择火山引擎提供的容器服务(VKE)和负载均衡(CLB)来进行基础服务部署和构建,其中CLB提供四层负载均衡能力,容器服务是高性能 Kubernetes 容器集群管理服务。Data Catalog基于容器服务提供的无状态负载(Deployment)、定时任务(CronJob)、服务(Service)等云原生容器管理功能进行基本服务和调度任务部署,同时也使用火山引擎的存储和中间件,以上组件均在同一个VPC内,能够保证网络连通以及数据安全。
  • 网络打通: 为解决上文所说的网络隔离问题,经过调研我们使用了公司通用的网络代理服务(PLB/Shuttle),该网络代理可做到网络打通的同时保证四层网络流量的安全,从而达到我们和各依赖方如公共服务(API网关、IAM等、独立部署的云服务(EMR/LAS等)的网络连通目标。
  • 数据安全: 火山引擎部署环境做网络隔离,主要是保证安全性,我们虽然使用网络代理打通网络,但是仍需保证各个环节的安全性,考虑到服务间交互都是通过HTTP请求,我们对和外部交互的接口都增加了SSL和双向认证的机制,同时在安全认证方面,我们没有使用Nginx或Java原生的方案,而是借助于火山引擎内部安全服务中的ZTI团队的envoy组件来实现,同时使用sidecar模式和我们后端服务容器集成部署,既降低了服务端部署改造成本,也解耦了服务端业务逻辑和安全认证逻辑。

多租户适配

这里先对多租户相关概念做一些解释:

  • 租户: 一个客户、公司、个人开通或购买了火山引擎的云产品,火山引擎就会通知对应的服务提供者,对应云产品会感知到他的开通,这个客户就是这个云产品的一个租户,实际场景可以类比于一个公司是一个租户,不同的公司是不同的租户。
  • 多租户 服务: 云服务要为多个租户提供服务,需要做到租户隔离,保证各租户的访问控制、数据、服务响应等各方面的使用都是隔离的,彼此互不感知互不影响的。要做到租户隔离,就需要云服务能通过逻辑或物理隔离的方式来将各租户对应数据和访问隔离开来,避免互相影响。

此前,在字节跳动内部实践中不存在多租户场景,所以面向公有云用户服务时,Data Catalog针对支持多租户服务的能力,需要进行专门适配。

解决方案:

Data Catalog在元数据存储层借用了Apache Atlas的设计与实现。Atlas的底层使用JanusGraph做图引擎,JanusGraph是基于Gremlin图查询语义实现的计算引擎,而社区版Atlas不支持多租户场景。我们通过在Atlas上增加JanusGraph Partition Strategy适配,实现存储层租户逻辑隔离。

参考以上示例,JanusGraph的Partition Strategy可以支持设置的read/write Partition的value,并保证只读/写指定Partition的数据,从而达到数据隔离,我们将租户信息和Partition Strategy相结合,实现了多租户场景下读写数据的逻辑隔离,保证了数据安全性。

内外部功能一致

Data Catalog在字节跳动内部已打磨多年,产品形态和技术架构比较成熟,但随着公有云部署和ToB产品迭代,因内部外基础服务差异和ToB引入新的使用场景和上下游组件导致内外部产品功能和技术实现的差异也越来越多。

在前几个版本中,我们尝试使用独立的代码分支和版本来支持ToB功能,避免内部新功能对ToB产生影响,但我们发现随着版本差异越来越大,代码和功能的合并和兼容就变得非常困难,在其中一次整体代码合并时,出现了好几千的文件diff和上百处merge conflict,我们花费了一周时间多的时间合并代码和进行多环境测试回归验证,最终完成了合并。功能和代码的不一致已经成为影响研发效率和需求交付进度的很重要因素,必须要进行优化。

解决方案:

我们主要从产品功能和代码版本两方面来处理内外部一致性问题:

产品功能

  • 产品功能的标准化: 原则上所有功能都应做到内外部一致,只允许部分功能点的实现区别。我们期望能将各功能都进行标准化,基础模块和通用能力(如元数据模型、搜索、血缘)原则上需保持内外一致,内外部依赖或需求场景差异较大的功能(如元数据接入和采集、库表管理)改造为标准化流程,将差异部分尽量减小,做到只通过配置、插件、版本控制工具等方式就能适配,减少研发和运维成本。
  • 明确的一致性规划: 从模块到功能点逐个对比内部外实现情况,制定长期roadmap,明确差异点的支持排期,并提高对齐内部功能的工作优先级,逐步减少差异。
  • 新功能的兼容性: 新功能的设计需考虑内外部一致性,包括产品的交互和研发的技术方案都需考虑外部场景并明确兼容方案,原则上对特殊场景定制化功能都需考虑通用场景适配,尽量保持多环境的兼容性。

技术实现

  • 统一的代码分支管理规范: 原则上内外部的代码是一致的即统一的分支。具体来说,不管域内外功能都需兼容多环境并在多环境验证才能合并代码,外部如公有云在发版周期中会基于内部主分支代码(如master分支)创建一个新的release-x.x.x分支,进行回归验证和公有云上线,同时线上持续使用release-x.x.x分支以保证线上环境稳定,release-x.x.x分支需定期合回主分支。新的版本会继续基于主分支开发,并持续保持该规范。
  • 明确的发版规划: 根据实际情况,内部通常迭代比较敏捷发版频率较快,而外部通常要求稳定性,会定期发版(如每月一个版本),考虑到发版周期的差异,我们会以外部固定周期为标准,细粒度控制需求评估、功能开发、QA测试、回归测试等各环节所在时间段,明确封板时间,降低内外部互相影响。
  • 一致性意识和自动化多环境验证:通过多轮分享和培训在技术团队内部对齐一致性意识,清楚内外部差异点FAQ等,另外,如上所说新功能技术设计方案需明确多环境兼容性。同时,引入自动化的多环境验证环节,尽早发现不兼容或不一致的问题,减少人工判断和测试的成本。

OpenAPI

在DataLeap Beta版本发布之后,有内外部客户在试用,当时就有客户提出OpenAPI的需求,但在Beta版本我们还未支持OpenAPI。公司内部有OpenAPI规范和平台,Data Catalog也借助相关平台实现了内部的OpenAPI,但是ToB场景的公共平台不同且会遇到ToB场景特定的问题(如安全认证、多租户、API开通计费等),需要综合考虑来对外提供解决方案。

解决方案:

如前文介绍,火山引擎内部公共服务有API网关的通用服务(TOP),并有若干API发布规范,Data Catalog调研了该API网关并解决以上核心问题来支持ToB OpenAPI。以下介绍一下主要流程和关注点:

流程图2.jpg

API 管理

  • Data Catalog借助于API网关管理OpenAPI,包括注册和开通、访问控制、限流等。
  • API规范:火山引擎OpenAPI有明确的参数规范,Data Catalog也需符合该规范,但因内部OpenAPI参数格式不同,需做兼容,考虑到新API的支持成本,借助于Spring的Interceptor和Advice以及定制JSON序列化和反序列化逻辑,实现了自动的参数格式转化,降低API格式兼容的开发成本。
  • 访问控制:火山引擎作为云服务提供商,使用业界规范的AKSK密钥管理规范,API使用者需创建AKSK并通过该信息来访问API才可通过访问控制,而API网关会通过IAM进行鉴权,通过后会给服务提供者也就是API注册者透传用户的身份(如租户ID,用户ID),方便API提供者使用。
  • 安全认证:处理API网关提供的基础鉴权,Data Catalog也增加了更多机制来保障安全性,包括双向认证、租户开通状态检测等。
  • API文档:对于每一个OpenAPI都根据火山引擎规范编写了详细的参数说明,汇总为一个正式API文档,方便用户查阅使用。

API 请求流程

  • 用户或服务通过AKSK访问API,或者通过前端控制台间接访问API。
  • API网关通过IAM进行鉴权,将识别到的用户身份通过HTTP header透传给服务提供者。
  • 服务提供者接收到请求并通过HTTP header获取用户身份,进行下一步处理。
  • 总结

    火山引擎Data Catalog产品是基于字节跳动内部平台,经过多年打磨业务场景和产品能力,在公有云进行部署和发布,期望帮忙更多外部客户创造数据价值。目前公有云产品已包含内部成熟的产品功能同时扩展若干ToB核心功能,正在逐步对齐业界领先Data Catalog云产品各项能力。文中提及的内容其实还有继续优化的空间,以及随着客户的使用,还有面临一些新的问题,包括多租户性能优化、服务稳定性保障等,火山引擎DataLeap研发团队都在持续探索和解决,期望能更好的支持ToB客户的业务诉求并实现商业价值的同时,提供优质稳定的服务和丰富的扩展能力。

    点击跳转大数据研发治理套件 DataLeap了解更多

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论