数据库在每个企业都占据的非常重要的位置,它存储着一个公司的命脉。对于数据库的管理也非常的复杂多变,很多公司都有专业的DBA团队在管理。
但是,不论有无DBA,对数据库的操作都不会变少,而且都面临着相同的问题:
- 不是在提数就是在修数的路上
- 不是在审核SQL就是在审核SQL的路上
- 不是在找历史记录就是在找历史记录的路上
- 不是在备份就是在备份的路上
还有非常多类似的工作,这就让DBA的工作变得枯燥乏味。
我不是DBA,仅仅是一个懂一点SELECT *
的运维工程师,希望能有一个工具能够帮助开发、DBA甚至运维降低数据库的操作门槛,希望它具有:
- 流程审批功能
- 自动纠错能力
- 自动备份能力
- 自动发布能力
- 历史操作记录
- 一键回滚能力
- 版本记录能力
拥有这些能力,可以让日常的操作变的简单,高效。数据库管理者也有时间去做更有意义的事情。
在过程的过程中,使用过不同的数据库管理工具,比如Yearning、SQLE,它们本质上只是一个数据库管理平台,可以记录日常的操作记录,也能实现流程审批等能力。但是它们依旧是一个一个的孤岛,无法直接打通开发、DBA之间的部门墙。
那有什么工具可以比它们更好?
也是偶然的机会,发现Bytebase这个项目,它的有点在于可以打通Gitlab->数据库,这样开发可以在Gitlab中管理SQL语句,其他的自动交给Bytebase去完成。
什么是Bytebase
Bytebase团队把它定位成面向开发者可靠的数据库CICD,它不仅仅是数据库管理工具,更是连接开发和DBA的桥梁。
它到底具有什么样的能力呢?
- SQL审核
- SQL纠错
- SQL编辑器
- GitOps
- 备份恢复
- 多租户管理
安装部署
说一千,道一万,不如手中过一遍。
这里,我选择在Kubernetes中部署。
(1)首先,部署PG数据库
--- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: postgres-pv-claim labels: app: postgres spec: storageClassName: longhorn accessModes: - ReadWriteOnce resources: requests: storage: 20Gi --- apiVersion: apps/v1 kind: Deployment metadata: name: postgres labels: app: postgres spec: 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: v1 kind: Service metadata: name: postgres spec: selector: app: postgres type: NodePort ports: - name: postgres port: 5432 targetPort: protocol: TCP
需要给PG的数据做持久化,不然数据丢失就白忙活一场。
(2)部署Bytebase
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: bytebase-pvc labels: app: bytebase spec: storageClassName: longhorn accessModes: - ReadWriteOnce resources: requests: storage: 50Gi --- apiVersion: apps/v1 kind: Deployment metadata: name: bytebase spec: 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: v1 kind: Service metadata: name: bytebase-entrypoint spec: type: ClusterIP selector: app: bytebase ports: - protocol: TCP port: 8080 targetPort: 8080 --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: bytebase spec: rules: - host: bytebase.jokerbai.com http: paths: - backend: serviceName: bytebase-entrypoint servicePort: 8080 path: /
(3)待应用都正常表示部署完成
# kubectl get po -n bytebase NAME READY STATUS RESTARTS AGE bytebase-5559b7ff97-bmwc6 1/1 Running 0 5h18m postgres-6989656975-5glhh 1/1 Running 0 5h20m
使用示例
第一次登录,会要求你创建管理员用户,按着步骤创建即可。
然后就可以进入如下界面。
用户管理
用户支持手动管理,也支持集成SSO,这里带大家集成SSO。
点击设置
->SSO
->创建SSO
,这里需要非常多的信息,
然后我们在Gitlab上去创建应用,填入上面的回调地址,创建应用。
将生成的ID和Secret填入Bytebase中,修改对应的Gitlab地址即完成配置。
最后,在登录的时候选择Gitlab登录即可。
实例管理
在实例中添加数据库实例即可。
这里需要填写超级管理员的用户账户,在添加实例的时候,会到该实例中创建一个bytebase数据库,在里面创建一个migration_history表用于记录所有的操作记录。
然后,会自动将目标库中的数据库同步到bytebase中。
数据库管理
上面已经介绍会自动同步目标数据库中已有的库,当然,也可以自己创建数据库。
然后就会自动创建数据库,过程如下:
我们可以对数据库中的数据进行操作。比如添加一张user表。
点击数据库
->变更Scheme
->选择刚才创建的joker-test
库。
预览工单即可进入创建页面。
点击创建,发现SQL审核不通过,如下:
就是说我们不允许字段为空,但是又没有设置默认值。
修改字段如下:
现在在SQL审核处虽然还是警告,但是不影响创建。
当然,还可以进行DML操作,比如我们向刚才创建的user表中插入一条name为jackma的数据。
image.png
项目管理
上面的操作比较分散,在实际中可能会以项目为中心进行管理。
我这里就以环境为中心,首先创建一个TEST项目。
进入项目过后,把joker-test数据库转移过来。
除此之外,还需要把当前项目对应的人添加进来。选择设置
->添加成员
即可。
然后就可以进行一些变更操作了。
我们还可以为项目添加一些消息通知,可以方便通知到用户。
环境管理
环境表示不同实例所属的环境,比如开发环境的数据库,测试环境的数据库。
这里创建环境除了标识数据库的归属,还可以设置审批策略以及备份策略。
最后
上面仅仅是简单的部署和使用,了解基本的功能。但是目前仅仅停留在数据库管理上,如何打通Gitlab和Bytebase,本篇文章还没有实践,下篇文章补上。