Bytebase 是一个开源数据库 DevOps 工具,它相当于在整个应用程序开发生命周期中管理数据库的 GitLab,它为 DBA 和开发人员提供了一个基于 Web 的工作空间,以安全有效地协作和管理数据库变更。
官网地址 随着 DevOps 进入主流,大部分团队采用 GitLab/GitHub 等工具来管理代码,并开始采用 Terraform 来管理基础设施,同样的 Bytebase 就是在应用程序开发期间管理数据库的这样的一个工具。Bytebase 是对现有云提供商的数据库平台或公司内部数据库运维平台的补充,虽然这些平台负责数据库实例级别的操作(例如配置数据库实例),但 Bytebase 会帮助团队使用配置的数据库来构建他们的应用程序。

主要特征

Bytebase 是一款聚焦在 Database schema change and version control 的工具。它主打的是在应用研发过程中变更数据库数据结构 (schema) 的这个场景,主要面向的人群是研发工程师和 DBA。
▶ 架构(DDL)和数据(DML)变更审核工作流程:与代码审查一样,Bytebase 简化了数据库变更过程,在单个工作流中,可以从开发环境一直到生产环境审查和部署数据库更改。
▶ SQL质量检查:Bytebase 分析 SQL 变更以执行符合您组织策略的规则。强制执行包括命名约定、反 SQL 模式检测等。生产环境和非生产环境也可以分别强制执行不同的规则。
▶ SQL编辑器: 基于 Web 的用于查询和导出数据的 SQL 编辑器,当开发人员需要访问数据时,DBA 不再需要提供敏感的数据库凭据。
▶ 与VCS集成的版本控制:Bytebase可以保留完整的Schema变更历史记录,它还与VCS系统(例如 GitLab)集成。团队可以在VCS中管理 SQL 迁移脚本,并在代码提交时触发 Schema 部署。
▶ 备份还原: Bytebase 支持数据库级别的手动和定期备份。
▶ 多租户支持:多租户服务可以为其每个租户创建单独的数据库,Bytebase 可以在单个工作流中为所有租户管理特定的数据库更改部署。

用例

▷ 多数据库管理
组织通常有多个数据库系统来管理OLTP和OLAP工作负载。Bytebase支持流行的数据库系统,包括MySQL、PostgreSQL、ClickHouse、TiDB和Snowflake。
▷ 数据库变更自动化
与GitLab/GitHub如何简化代码交付类似,Bytebase简化了从非生产环境到生产环境的数据库变更部署。Bytebase还与VCS集成,支持GitOps工作流。您可以在VCS中管理数据库更改脚本,只要观察到新的更改脚本,Bytebase就会启动新的部署过程。
您还可以将Bytebase的CLI bb集成到您现有的CI/CD工作流中。
▷ 数据库开发人员门户
随着工程团队的发展,将会形成一个平台团队或专门的DBA团队来管理数据库基础设施,并支持开发人员与他们的应用数据库进行交互。Bytebase为开发人员/数据库管理员/平台工程师提供了一个集中的门户,用于协作完成与数据库相关的任务,如检查数据库更改、查询数据、备份和恢复数据库等。
▷ 多租户服务
SaaS服务可以为其每个租户提供单独的数据库。确保数据库更改一致地应用于每个租户的数据库是一件痛苦且容易出错的事情。Bytebase提供了一种租户模式来对这些数据库进行分组,并可以将这些数据库的生命周期作为一个单元来管理。
▷ 模式实施和卓越工程
数据质量和系统健壮性在很大程度上取决于数据库模式。能够一致地实施标准是高质量模式的关键。Bytebase可以执行模式规则,包括命名约定、反SQL模式检测等。您还可以分别为生产和非生产环境配置每个单独的规则。

部署

Docker

Bytebase 提供了多种部署方式,最简单就是使用 Docker 进行一键启动。

docker run --init -d \
  --name bytebase \
  --restart always \
  --add-host host.docker.internal:host-gateway \
  --publish 8080:8080 \
  --volume ~/.bytebase/data:/var/opt/bytebase \
  bytebase/bytebase:1.2.2 \
  --data /var/opt/bytebase \
  --host http://192.168.235.15 \
  --port 8080

您可以将8080更改为5678或其他端口,但是请确保这三个端口相同:

--publish {{hostport}} :{{containerport}} --port {{port}}}

Bytebase会将其数据存储在~/.bytebase/data,您可以通过运行命令重置所有数据:

rm -rf ~/.bytebase/data

浏览器访问 http://192.168.235.15:8080/

注册一个管理员帐户 部署后的第一个注册帐户将被授予工作区所有者(Workspace Owner)角色。

在Bytebase中,工作区所有者完成VCS配置。

SQL schema的用途_docker


注册一个定期账户 创建管理员帐户后,您可以注册一个普通帐户,并被授予Workspace Developer角色。

SQL schema的用途_容器_02

生产设置

确保 --host,--port 与字节库应该访问的host:port地址完全匹配。
Bytebase使用 --host, --port 来配置项目版本控制工作流使用的VCS webhook回调。如果主机:端口不匹配,则提交的迁移脚本将不会触发字节库中的问题创建。如果Bytebase由Docker运行,请确保 --publish hostport:containerport和 --port 标志相同。
如下例所示,所有3个端口都是5678: --publish 5678:5678 --port 5678

docker run --init --name bytebase --restart always --publish 5678:5678 --volume ~/.bytebase/data:/var/opt/bytebase bytebase/bytebase:<<version>> --data /var/opt/bytebase --host http://localhost --port 5678

无法用Docker启动Bytebase

docker logs bytebase Due to the vm mechanism of colima, try to use the --mount option when starting colima as shown below:

mkdir ~/volumes
colima start --mount ~/volumes:w
docker run --init --name bytebase --restart always --add-host host.docker.internal:host-gateway --publish 8080:8080 --volume ~/.bytebase/data:/var/opt/bytebase bytebase/bytebase:1.1.0 --data /var/opt/bytebase --host http://localhost --port 8080

部署到Kubernetes

我们可以使用下面的最基础的资源清单来部署 Bytebase,最好使用一个 Volume 来持久化数据,这里我们定义的是一个 LoadBalancer 类型的 Service,当然我们也可以创建一个 Ingress 对象来进行暴露,具体使用哪种方式需要结合你 Kubernetes 集群来决定,可以在下面资源清单基础上进行修改。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: bytebase
  namespace: default
spec:
  selector:
    matchLabels:
      app: bytebase
  template:
    metadata:
      labels:
        app: bytebase
    spec:
      containers:
      - name: bytebase
        image: bytebase/bytebase:1.2.2
        args: ["--data", "/var/opt/bytebase", "--host", "http://localhost", "--port", "8080"]
        ports:
        - containerPort: 8080
        volumeMounts:
        - name: data
          mountPath: /var/opt/bytebase
      volumes:
      - name: data
        emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: bytebase-entrypoint
  namespace: default
spec:
  type: LoadBalancer
  selector:
    app: bytebase
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080

直接在 Kubernetes 集群中部署上面的对象即可。

脚本

此外我们还可以使用 Bytebase 官方提供的安装脚本进行安装,安装脚本存储在https://github.com/bytebase/install
使用安装脚本安装最新发布版本:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/bytebase/install/master/install.sh)"

如果没有出现错误,您应该会在控制台中看到如下内容

OS: Darwin
ARCH: arm64
Password:
Get bytebase latest version: x.y.z
Downloading tarball into /var/folders/j4/9x356cb9263f2jryv0xs9pnr0000gn/T/tmp.g1C2PJ8U
Start downloading https://github.com/bytebase/bytebase/releases/download/x.y.z/bytebase_x.y.z_Darwin_arm64.tar.gz...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:02 --:--:--     0
100 81.3M  100 81.3M    0     0  3972k      0  0:00:20  0:00:20 --:--:-- 5430k
Completed downloading https://github.com/bytebase/bytebase/releases/download/x.y.z/bytebase_x.y.z_Darwin_arm64.tar.gz
Start extracting tarball into /opt/bytebase...
Start installing bytebase and bb x.y.z
Installed bytebase x.y.z to /usr/local/bin
Installed bb x.y.z to /usr/local/bin

Check the usage with
  bytebase --help
  bb --help

安装完成后,运行:

bytebase --host http://localhost --port 8080

您应该在控制台中看到类似这样的内容:
Version x.y.z has started at http://localhost:8080
卸载 Bytebase

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/bytebase/install/master/uninstall.sh)"

' 如果你想以非交互方式运行 bytebase 卸载程序,你可以使用:
NONINTERACTIVE=1 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/bytebase/install/master/uninstall.sh)"

I will always love the life I never deviated from.