DBPack 讀寫分離功能釋出公告

Scott Lewis發表於2022-07-11

在 v0.1.0 版本我們釋出了分散式事務功能,並提供了讀寫分離功能預覽。在 v0.2.0 這個版本,我們加入了通過 UseDB hint 自定義查詢請求路由的功能,並修復了一些 bug。另外,在這個版本,我們還提供了審計日誌功能的預覽,該功能將在 v0.3.0 正式釋出。

修復 bug 情況

  1. PHP 8.0 pdo 丟擲 transaction not active 異常

    Mysql 客戶端在給使用者傳送 sql 執行結果時,如果執行沒有異常,傳送的第一個包為 OKPacket,該包中有一個標誌位可以標識 sql 請求是否在一個事務中。如下圖所示:

    image-20220629161325409

    這個包的內容為:

    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 異常。

  2. 負載均衡演算法反序列化異常

    image-20220707170118827

    該異常導致讀寫分離查詢請求都以隨機演算法在 DB 之間執行。

  3. 其他 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。

連結

相關文章