本文作者乔克,原文链接。


数据库在每个企业都占据的十分重要的地位,它存储着一个公司的命根子。对于数据库的治理也十分的复杂多变,很多公司都有业余的DBA团队在治理。

然而,不管有无DBA,对数据库的操作都不会变少,而且都面临着雷同的问题:

  1. 不是在提数就是在修数的路上
  2. 不是在审核SQL就是在审核SQL的路上
  3. 不是在找历史记录就是在找历史记录的路上
  4. 不是在备份就是在备份的路上

还有十分多相似的工作,这就让DBA的工作变得枯燥乏味。

我不是DBA,仅仅是一个懂一点 SELECT * 的运维工程师,心愿能有一个工具可能帮忙开发、DBA甚至运维升高数据库的操作门槛,心愿它具备:

  1. 流程审批性能
  2. 主动纠错能力
  3. 主动备份能力
  4. 主动公布能力
  5. 历史操作记录
  6. 一键回滚能力
  7. 版本记录能力

领有这些能力,能够让日常的操作变的简略,高效。数据库管理者也有工夫去做更有意义的事件。

在过程的过程中,应用过不同的数据库管理工具,比方 Yearning、SQLE,它们实质上只是一个数据库治理平台,能够记录日常的操作记录,也能实现流程审批等能力。然而它们仍旧是一个一个的孤岛,无奈间接买通开发、DBA 之间的部门墙。

那有什么工具能够比它们更好?

也是偶尔的机会,发现 Bytebase 这个我的项目,它的有点在于能够买通 Gitlab -> 数据库,这样开发能够在 Gitlab 中治理 SQL 语句,其余的主动交给 Bytebase 去实现。

什么是Bytebase

Bytebase团队把它定位成面向开发者牢靠的数据库CICD,它不仅仅是数据库管理工具,更是连贯开发和DBA的桥梁。

它到底具备什么样的能力呢?

  1. SQL审核
  2. SQL纠错
  3. SQL编辑器
  4. GitOps
  5. 备份复原
  6. 多租户治理

装置部署

说一千,道一万,不如手中过一遍。

这里,我抉择在Kubernetes中部署。

Step 1-首先,部署PG数据库

apiVersion: v1kind: PersistentVolumeClaimmetadata:  name: postgres-pv-claim  labels:    app: postgresspec:  storageClassName: longhorn  accessModes:  - ReadWriteOnce  resources:    requests:      storage: 20Gi---apiVersion: apps/v1kind: Deploymentmetadata:  name:  postgres  labels:    app:  postgresspec:  selector:    matchLabels:      app: postgres  replicas: 1  strategy:    rollingUpdate:      maxSurge: 25%      maxUnavailable: 25%    type: RollingUpdate  template:    metadata:      labels:        app:  postgres    spec:      containers:      - name:  postgres        image:  postgres:15.2        imagePullPolicy: IfNotPresent        resources:          requests:            cpu: 100m            memory: 100Mi          limits:            cpu: 4            memory: 8000Mi        env:        - name: POSTGRES_PASSWORD          value: '123456'        - name: POSTGRES_USER          value: 'bytebase'        - name: POSTGRES_DB          value: 'postgres'        - name: PGDATA          value: /var/lib/postgresql/data/pgdata        ports:        - containerPort:  5432          name:  postgresport        volumeMounts:        - name: localtime          mountPath: /etc/localtime        - name: data-disk          mountPath: /var/lib/postgresql/data      volumes:        - name: localtime          hostPath:            path: /usr/share/zoneinfo/Asia/Shanghai        - name: data-disk          persistentVolumeClaim:            claimName: postgres-pv-claim---apiVersion: v1kind: Servicemetadata:  name: postgresspec:  selector:    app: postgres  type: NodePort  ports:  - name: postgres    port: 5432    targetPort:    protocol: TCP

须要给PG的数据做长久化,不然数据失落就白忙活一场。

Step 2-部署Bytebase

apiVersion: v1kind: PersistentVolumeClaimmetadata:  name: bytebase-pvc  labels:    app: bytebasespec:  storageClassName: longhorn  accessModes:  - ReadWriteOnce  resources:    requests:      storage: 50Gi---apiVersion: apps/v1kind: Deploymentmetadata:  name: bytebasespec:  selector:    matchLabels:      app: bytebase  template:    metadata:      labels:        app: bytebase    spec:      containers:        - name: bytebase          image: bytebase/bytebase:1.13.0          imagePullPolicy: IfNotPresent          env:          - name: PG_URL            value: "postgresql://bytebase:123456@postgres:5432/postgres"          args:            [              "--data",              "/var/opt/bytebase",              "--external-url",              "http://bytebase.jokerbai.com",              "--port",              "8080",            ]          ports:            - containerPort: 8080          volumeMounts:            - name: data              mountPath: /var/opt/bytebase          livenessProbe:            httpGet:              path: /healthz              port: 8080            initialDelaySeconds: 300            periodSeconds: 300            timeoutSeconds: 60      volumes:      - name: data        persistentVolumeClaim:          claimName: bytebase-pvc---apiVersion: v1kind: Servicemetadata:  name: bytebase-entrypointspec:  type: ClusterIP  selector:    app: bytebase  ports:    - protocol: TCP      port: 8080      targetPort: 8080---apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: bytebasespec:  rules:  - host: bytebase.jokerbai.com    http:      paths:      - backend:          serviceName: bytebase-entrypoint          servicePort: 8080        path: /

Step 3-待利用都失常示意部署实现

# kubectl get po -n bytebaseNAME                        READY   STATUS    RESTARTS   AGEbytebase-5559b7ff97-bmwc6   1/1     Running   0          5h18mpostgres-6989656975-5glhh   1/1     Running   0          5h20m

应用示例

第一次登录,会要求你创立管理员用户,按着步骤创立即可。

而后就能够进入如下界面。

用户治理

用户反对手动治理,也反对集成SSO,这里带大家集成SSO。

点击设置->SSO->创立SSO,这里须要十分多的信息,

而后咱们在Gitlab下来创立利用,填入下面的回调地址,创立利用。

将生成的ID和Secret填入Bytebase中,批改对应的Gitlab地址即实现配置。

最初,在登录的时候抉择Gitlab登录即可。

实例治理

在实例中增加数据库实例即可。

这里须要填写超级管理员的用户账户,在增加实例的时候,会到该实例中创立一个bytebase数据库,在外面创立一个migration_history表用于记录所有的操作记录。

而后,会主动将指标库中的数据库同步到bytebase中。

数据库治理

下面曾经介绍会主动同步指标数据库中已有的库,当然,也能够本人创立数据库。

而后就会主动创立数据库,过程如下:

咱们能够对数据库中的数据进行操作。比方增加一张user表。

点击数据库->变更Schema->抉择方才创立的joker-test库。

预览工单即可进入创立页面。

点击创立,发现SQL审核不通过,如下:

就是说咱们不容许字段为空,然而又没有设置默认值。

批改字段如下:

当初在SQL审核处尽管还是正告,然而不影响创立。

当然,还能够进行DML操作,比方咱们向方才创立的user表中插入一条name为jackma的数据。

项目管理

下面的操作比拟扩散,在理论中可能会以我的项目为核心进行治理。

我这里就以环境为核心,首先创立一个TEST我的项目。

进入我的项目过后,把joker-test数据库转移过去。

除此之外,还须要把以后我的项目对应的人增加进来。抉择设置->增加成员即可。

而后就能够进行一些变更操作了。

咱们还能够为我的项目增加一些音讯告诉,能够不便告诉到用户。

环境治理

环境示意不同实例所属的环境,比方开发环境的数据库,测试环境的数据库。

这里创立环境除了标识数据库的归属,还能够设置审批策略以及备份策略。

最初

下面仅仅是简略的部署和应用,理解根本的性能。然而目前仅仅停留在数据库治理上,如何买通Gitlab和Bytebase,本篇文章还没有实际,下篇文章补上。


你能够拜访官网 https://bytebase.com,收费注册云账号,立刻体验 Bytebase。