上週,我們正式釋出了 DBPack SQL Tracing 功能和資料加密功能,現對這兩個功能做如下說明。
通過 DBPack 代理開啟的全域性事務,會自動在 http header 中注入 traceparent
,traceparent
的值如下:
00-85d85c3112590a76d0723eed4326dbd8-81e51018180f4913-01
該值的格式是:
fmt.Sprintf("%.2x-%s-%s-%s",
supportedVersion,
sc.TraceID(),
sc.SpanID(),
flags)
其中包含了 TraceID
和 SpanID
。使用者可用該值在自己的微服務中構造 TraceContext,在業務中傳遞,以此得到一個分散式事務的完整鏈路。
traceparent
還可以通過 SQL 傳遞到 DBPack,以此來對 DBPack 中的執行邏輯進行鏈路追蹤。
例如:
update /*+ XID('gs/aggregationSvc/72343404027518979') TraceParent('00-85d85c3112590a76d0723eed4326dbd8-81e51018180f4913-01') */ product.inventory set available_qty = available_qty - ?, allocated_qty = allocated_qty + ? where product_sysno = ? and available_qty >= ?
完整的 sample 請參考:https://github.com/cectc/dbpack-samples/tree/main/go
DBPack 支援將鏈路追蹤結果匯出到 jaeger,只需要在 DBPack 的組態檔中增加如下設定:
trace:
jaeger_endpoint: http://jaeger:14268/api/traces # 替換為實際的 jaeger 地址
下圖展示了一個完整分散式事務的 trace 鏈路資料,可以看到通過 DBPack 在哪個 DB 上執行了什麼 SQL 請求,以及耗時:
DBPack 採用 AES 演演算法來加密資料。在插入和更新相應的資料時,DBPack 會對相關的列進行自動加密。當查詢結果中存在相關的列時,DBPack 會自動解密。DBPack 不支援使用加密列作為 WHERE
條件。
開啟加解密功能需通過在組態檔中增加 CryptoFilter
設定。例如:
executors:
- name: redirect
mode: sdb
config:
data_source_ref: employees
filters:
- cryptoFilter
filters:
- name: cryptoFilter
kind: CryptoFilter
conf:
column_crypto_list:
- table: departments
columns: ["dept_name"]
aeskey: 123456789abcdefg
上面的設定表示需要對 departments
表的 dept_name
列進行自動加解密。
INSERT INTO departments (id,dept_no,dept_name) VALUES (1,'1001','sunset')
會被重寫為:
INSERT INTO departments (id,dept_no,dept_name) VALUES (1,'1001','3d244141cb5b6f921923f7f88f073941')
UPDATE departments SET dept_name='moonlight' WHERE id=1
會被重寫為:
UPDATE departments SET dept_name='5cdeb84b8fc3c22fd6c3e37ca6d837da' WHERE id=1
注意:設定對指定的列加密後,資料庫裡只儲存密文,不會儲存明文,防止被拖庫後資料洩漏。加密後的列資料比原本的資料要長,需設定好對應列的長度。
在 v0.1.0 版本我們釋出了分散式事務功能,支援各種程式語言協調分散式事務。
在 v0.2.0 版本我們釋出了讀寫分離功能,使用者在開啟讀寫分離功能的情況下,使用分散式事務協調功能不再需要做複雜的整合,DBPack 提供了一站式的解決方案。
在 v0.3.0 版本,我們加入 SQL Tracing 的功能,使用該功能可以收集到一個完整的分散式事務鏈路,檢視事務的執行情況。我們還加入了資料加密功能,通過該功能保護使用者的重要資料資產。