在 v0.1.0 版本我們釋出了分散式事務功能,並提供了讀寫分離功能預覽。在 v0.2.0 這個版本,我們加入了通過
UseDB
hint 自定義查詢請求路由的功能,並修復了一些 bug。另外,在這個版本,我們還提供了審計紀錄檔功能的預覽,該功能將在 v0.3.0 正式釋出。
PHP 8.0 pdo 丟擲 transaction not active
異常
Mysql 使用者端在給使用者傳送 sql 執行結果時,如果執行沒有異常,傳送的第一個包為 OKPacket,該包中有一個標誌位可以標識 sql 請求是否在一個事務中。如下圖所示:
這個包的內容為:
07 00 00 // 前 3 個位元組表示 payload 的長度為 7 個位元組
01 // sequence 響應的序號,前 4 個位元組一起構成了 OKPacket 的 header
00 // 標識 payload 為 OKPacket
00 // affected row
00 // last insert id
03 00 // 狀態標誌位
00 00 // warning 數量
dbpack 之前的版本將標誌位設定為 0,java、golang、.net core、php 8.0 之前的 mysql driver 都能正確協調事務,php 8.0 的 pdo driver 會對標誌位進行校驗,所以 php 8.0 以上版本在使用 dbpack 協調分散式事務時,會丟擲 transaction not active
異常。
負載均衡演演算法反序列化異常
該異常導致讀寫分離查詢請求都以隨機演演算法在 DB 之間執行。
其他 bug。
使用 UseDB
hint 自定義查詢請求路由
例如:
SELECT /*+ UseDB('employees-master') */ emp_no, birth_date, first_name, last_name, gender, hire_date FROM employees WHERE emp_no = ?
在查詢請求中加入 UseDB
註解,註解的引數為資料來源的名稱,即可指定 SQL 請求路由到哪個資料來源執行。
本次版本增加了審計紀錄檔功能。可通過在設定中加入 AuditLogFilter
開啟,例如:
filters:
- name: auditLogFilter
kind: AuditLogFilter
conf:
audit_log_dir: /var/log/dbpack/
# unit MB
max_size: 300
# unit Day
max_age: 28
# maximum number of old log files to retain
max_backups: 1
# determines if the rotated log files should be compressed using gzip
compress: true
# whether to record the audit log before or after the sql request is actually executed
record_before: true
開啟後,DBPack 會以下面的格式記錄審計紀錄檔:
[timestamp],[username],[ip address],[connection id],[command type],[command],[sql text],[args],[affected row]
記錄內容如下:
2022-06-14 07:15:44,dksl,172.18.0.1:60372,1,COM_QUERY,,SET NAMES utf8mb4,[],0
2022-06-14 07:15:45,dksl,172.18.0.1:60372,1,COM_STMT_EXECUTE,INSERT,INSERT INTO employees ( emp_no, birth_date, first_name, last_name, gender, hire_date ) VALUES (?, ?, ?, ?, ?, ?),['100000' '1992-01-07' 'scott' 'lewis' 'M' '2014-09-01'],1
2022-06-14 07:15:45,dksl,172.18.0.1:60372,1,COM_STMT_EXECUTE,DELETE,DELETE FROM employees WHERE emp_no = ?,['100000'],1
2022-06-14 07:15:45,dksl,172.18.0.1:60372,1,COM_STMT_EXECUTE,INSERT,INSERT INTO employees ( emp_no, birth_date, first_name, last_name, gender, hire_date ) VALUES (?, ?, ?, ?, ?, ?),['100001' '1992-01-07' 'scott' 'lewis' 'M' '2014-09-01'],1
2022-06-14 07:15:45,dksl,172.18.0.1:60372,1,COM_STMT_EXECUTE,SELECT,SELECT emp_no, birth_date, first_name, last_name, gender, hire_date FROM employees WHERE emp_no = ?,['100001'],0
接下來的版本計劃:
V0.3.0
審計紀錄檔、SQL 請求鏈路追蹤
V0.4.0
敏感資料加解密、限流、熔斷
V0.5.0
分庫分表功能
本次釋出的 v0.2.0 版本可解決使用者的分散式事務需求和讀寫分離需求,兩個功能可以結合使用,無需侵入使用者業務,體驗非常絲滑。
歡迎開源愛好者和我們一起建設 DBPack 社群,加群或參與社群建設,請微信聯絡:scottlewis。