2023 年 7 月 10 日,TiDB Serverless 正式商用。这是一个完全托管的数据库服务平台(DBaaS),提供灵活的集群配置和基于用量的付费模式。紧随其后,TiDB Serverless Branching 的测试版也发布了。
TiDB Serverless Branching 功能使用户能够为其 TiDB Serverless 集群创建分支。这些分支可以实现并行开发,促进新功能快速迭代,排查故障,开发者无需中断生产数据库的运行。该功能不仅简化了开发和部署过程,还保持了生产环境中数据库的稳定性和可靠性。
分支是什么?
对于集群而言,分支是一个独立的实例,其中包含一份原始集群的数据快照。它建立了一个隔离的环境,以便在不影响原始集群的情况下进行各种操作。
当为集群创建一个分支时,该分支中的数据与原始集群开始分叉,这意味着在原始集群或分支中进行的后续更改将不会被同步。
[TiDB Serverless](https://tidb.cloud/ "TiDB Serverless") 采用了写时复制 (copy-on-write )技术,以实现快速、平稳地创建分支。这种方法允许原始集群与其分支之间共享数据。这个操作一般在几分钟内就能完成,对用户来说是无感知的,对原始集群的性能也不会有影响。
平衡软件开发速度和质量
在软件开发中,快速推出新功能和全面测试之间的微妙平衡是一个挑战。找到正确的平衡可以实现敏捷开发、更快的迭代,并及时收到宝贵的客户反馈,同时不会影响软件的质量和可靠性。TiDB Serverless Branching 提供了一种方式来找到这个最佳平衡。
为开发人员提供独立环境
在日常开发和测试活动中使用数据库时,开发人员经常面临配额限制、高成本、资源限制和数据质量等挑战。所以通常在团队内共享数据库更实际。但共享数据库往往会导致环境的冲突,开发人员不得不花费额外的精力在应用中添加一些隔离的逻辑。
TiDB Serverless Branching 通过为每个开发人员提供独立的开发和测试环境来解决这些问题。通过消除资源共享和任务干扰,提高生产效率并促进高效的团队协作。
通过类似生产的分支进行高效测试
为了消除资源共享和任务间干扰带来的烦恼,开发人员通常会在进行开发工作时使用单独的数据库环境,比如在服务器上设置自己的数据库或在 Docker 上启动数据库容器。然而,这些环境与生产环境存在显著差异,很难模拟出实际的性能和延迟状态。对于功能测试,则总是需要大量的数据准备工作,可能却仍然无法与实际的生产环境相匹配。为了确保数据质量,开发人员可以选择生成生产数据库的快照,并在测试环境中还原它,或者费力地构建模拟数据。然而,这两种方法都很繁琐,会显著降低开发效率。
通过 TiDB Serverless Branching,开发人员将能够在几分钟内快速创建与生产环境相同的分支。这些分支有助于使用最新的生产数据进行测试,并快速检测问题。此外,这些分支完全与生产集群隔离,可以进行更安全的功能测试和故障排除。
与持续集成和持续部署(CICD)流程无缝集成
自动化场景需要先进的环境管理和质量控制。TiDB Serverless Branching 可以轻松集成到自动化的 CICD 工作流中,通过分支整合,代码质量的把控和测试流程都变得更加流畅。这确保了产品的质量,同时遵循了高效的软件开发实践。
与 GitHub 集成的分支管理
结合 TiDB Serverless Branching 功能,我们推出了 TiDB Cloud 分支管理 GitHub App。如果开发人员使用 GitHub flow,该应用能够极大程度地简化将分支集成到 CI 流水线中的工作。有关该 GitHub App 的更多详细信息,请参阅我们的文档。
将 TiDB Serverless Branching 与 GitHub CI 流水线集成
我们将使用 tidbcloud-branch-gorm-example 来演示集成过程。tidbcloud-branch-gorm-example 是一个适用于 TiDB Serverless Branching 的 gorm playground 项目的分支版本。操作如下:
-
按照说明将您的 TiDB Serverless 集群与 GitHub 仓库连接起来。这将在您的 GitHub 帐户上安装 TiDB Cloud 分支管理 GitHub App。每次创建 pull request 时,都会触发创建一个新的对应 TiDB Serverless 分支。
-
调整 CI 流水线,使用新创建的 TiDB Serverless 分支来运行测试。
name: tests
on:
pull_request:
branches: [ master ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: tidbcloud/wait-for-tidbcloud-branch@v0
id: wait-for-branch
with:
token: ${{ secrets.GITHUB_TOKEN }}
public-key: ${{ secrets.TIDB_CLOUD_PUBLIC_KEY }}
private-key: ${{ secrets.TIDB_CLOUD_PRIVATE_KEY }}
timeout-seconds: 600
- name: Set up Go 1.19
uses: actions/setup-go@v2
with:
go-version: 1.19
- name: go mod pakcage cache
uses: actions/cache@v2
with:
path: ~/go/pkg/mod
key: ubuntu-latest-go-1.19-${{ hashFiles('go.mod') }}
- name: Tests
run: |
GORM_ENABLE_CACHE=true GORM_DIALECT=tidb GORM_DSN="${{ steps.wait-for-branch.outputs.username }}:${{ steps.wait-for-branch.outputs.password }}@tcp(${{ steps.wait-for-branch.outputs.host }}:${{ steps.wait-for-branch.outputs.port }})/test?parseTime=true&tls=tidb" ./test.sh
为了简化 CI 流水线,我们开发了 wait-for-tidbcloud-branch,这是一个辅助的 GitHub Action。它会等到 pull request 对应的 TiDB Serverless 分支就绪后,创建一个新的数据库用户供后续使用。
在完成设置后,每当创建 pull request 时,TiDB Cloud 分支管理 GitHub App 将为拉取请求生成一个 TiDB Serverless 分支。然后,CI 流程将等待分支就绪并将其用于测试。这确保您使用这些分支执行的任何测试都可以映射到生产数据库中的数据,从而更容易及时发现任何潜在问题。
一个具体的开发案例
比如你正在开发一个添加唯一索引的功能,但生产数据库中已经存在重复的行。借助 TiDB Serverless Branching,CI 流水线可以迅速识别出这类问题。这是因为测试负载在与生产数据库镜像一致的分支中执行,可以在早期检测到潜在问题。然而,如果是在模拟数据上进行测试,这类问题很容易被忽视,甚至可能会遗漏到生产环境。
在上面的示例中,我们在数据库中执行了一个简单的 DDL 更改。TiDB 支持在线 DDL 变更,用户无需担心影响应用工作负载。然而,随着应用的扩展和测试涉及到更多的业务逻辑,分支对于效率提高和质量保证变得越来越有益。
使用 TiDB Serverless Branching 定制 CI/CD 工作流
TiDB Cloud Branching 工作流专门设计成与流行的应用程序框架兼容,开发人员可以将其简单地集成到现有的 CI 流水线中。如果 TiDB Serverless Branching GitHub App 不能完全满足你的需求,在 TiDB Cloud CLI、setup-tidbcloud-cli 和 GitHub Actions 的帮助下,你也可以定制分支的 CI/CD 工作流。
结论
借助 TiDB Serverless Branching,开发人员可以并行工作,快速进行新功能的迭代而不影响生产数据库的正常稳定运行。该功能简化了开发和部署过程,同时确保了生产数据库的稳定性和可靠性。
我们希望更多的开发人员能够使用到 TiDB Serverless Branching,我们也将不断改进和扩展这一功能,以满足大家不断变化的需求,敬请期待!
立即试用 TiDB Serverless Branching,获取更简化、快速的应用程序开发体验!
目录