
數(shù)據(jù)庫在每個企業(yè)都占據(jù)的非常重要的位置,它存儲著一個公司的命脈。對于數(shù)據(jù)庫的管理也非常的復雜多變,很多公司都有專業(yè)的DBA團隊在管理。
但是,不論有無DBA,對數(shù)據(jù)庫的操作都不會變少,而且都面臨著相同的問題:
- 不是在提數(shù)就是在修數(shù)的路上
- 不是在審核SQL就是在審核SQL的路上
- 不是在找歷史記錄就是在找歷史記錄的路上
- 不是在備份就是在備份的路上
還有非常多類似的工作,這就讓DBA的工作變得枯燥乏味。
我不是DBA,僅僅是一個懂一點SELECT *的運維工程師,希望能有一個工具能夠幫助開發(fā)、DBA甚至運維降低數(shù)據(jù)庫的操作門檻,希望它具有:
- 流程審批功能
- 自動糾錯能力
- 自動備份能力
- 自動發(fā)布能力
- 歷史操作記錄
- 一鍵回滾能力
- 版本記錄能力
擁有這些能力,可以讓日常的操作變的簡單,高效。數(shù)據(jù)庫管理者也有時間去做更有意義的事情。
在過程的過程中,使用過不同的數(shù)據(jù)庫管理工具,比如Yearning、SQLE,它們本質上只是一個數(shù)據(jù)庫管理平臺,可以記錄日常的操作記錄,也能實現(xiàn)流程審批等能力。但是它們依舊是一個一個的孤島,無法直接打通開發(fā)、DBA之間的部門墻。
那有什么工具可以比它們更好?
也是偶然的機會,發(fā)現(xiàn)Bytebase這個項目,它的有點在于可以打通Gitlab->數(shù)據(jù)庫,這樣開發(fā)可以在Gitlab中管理SQL語句,其他的自動交給Bytebase去完成。

什么是Bytebase
Bytebase團隊把它定位成面向開發(fā)者可靠的數(shù)據(jù)庫CICD,它不僅僅是數(shù)據(jù)庫管理工具,更是連接開發(fā)和DBA的橋梁。
它到底具有什么樣的能力呢?
- SQL審核
- SQL糾錯
- SQL編輯器
- GitOps
- 備份恢復
- 多租戶管理
安裝部署
說一千,道一萬,不如手中過一遍。
這里,我選擇在Kubernetes中部署。
(1)首先,部署PG數(shù)據(jù)庫
---
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的數(shù)據(jù)做持久化,不然數(shù)據(jù)丟失就白忙活一場。
(2)部署B(yǎng)ytebase
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
使用示例
第一次登錄,會要求你創(chuàng)建管理員用戶,按著步驟創(chuàng)建即可。
然后就可以進入如下界面。

用戶管理
用戶支持手動管理,也支持集成SSO,這里帶大家集成SSO。
點擊設置->SSO->創(chuàng)建SSO,這里需要非常多的信息。

然后我們在Gitlab上去創(chuàng)建應用,填入上面的回調地址,創(chuàng)建應用。


將生成的ID和Secret填入Bytebase中,修改對應的Gitlab地址即完成配置。
最后,在登錄的時候選擇Gitlab登錄即可。

實例管理
在實例中添加數(shù)據(jù)庫實例即可。

這里需要填寫超級管理員的用戶賬戶,在添加實例的時候,會到該實例中創(chuàng)建一個bytebase數(shù)據(jù)庫,在里面創(chuàng)建一個migration_history表用于記錄所有的操作記錄。
然后,會自動將目標庫中的數(shù)據(jù)庫同步到bytebase中。

數(shù)據(jù)庫管理
上面已經(jīng)介紹會自動同步目標數(shù)據(jù)庫中已有的庫,當然,也可以自己創(chuàng)建數(shù)據(jù)庫。

然后就會自動創(chuàng)建數(shù)據(jù)庫,過程如下:

我們可以對數(shù)據(jù)庫中的數(shù)據(jù)進行操作。比如添加一張user表。
點擊數(shù)據(jù)庫->變更Scheme->選擇剛才創(chuàng)建的joker-test庫。

預覽工單即可進入創(chuàng)建頁面。

點擊創(chuàng)建,發(fā)現(xiàn)SQL審核不通過,如下:

就是說我們不允許字段為空,但是又沒有設置默認值。
修改字段如下:

現(xiàn)在在SQL審核處雖然還是警告,但是不影響創(chuàng)建。
當然,還可以進行DML操作,比如我們向剛才創(chuàng)建的user表中插入一條name為jackma的數(shù)據(jù)。

項目管理
上面的操作比較分散,在實際中可能會以項目為中心進行管理。
我這里就以環(huán)境為中心,首先創(chuàng)建一個TEST項目。

進入項目過后,把joker-test數(shù)據(jù)庫轉移過來。

除此之外,還需要把當前項目對應的人添加進來。選擇設置->添加成員即可。

然后就可以進行一些變更操作了。
我們還可以為項目添加一些消息通知,可以方便通知到用戶。

環(huán)境管理
環(huán)境表示不同實例所屬的環(huán)境,比如開發(fā)環(huán)境的數(shù)據(jù)庫,測試環(huán)境的數(shù)據(jù)庫。
這里創(chuàng)建環(huán)境除了標識數(shù)據(jù)庫的歸屬,還可以設置審批策略以及備份策略。

最后
上面僅僅是簡單的部署和使用,了解基本的功能。但是目前僅僅停留在數(shù)據(jù)庫管理上,如何打通Gitlab和Bytebase,本篇文章還沒有實踐,下篇文章補上。