DBPack 读写分离功能发布公告

2022-07-12 17:44:14 浏览数 (1)

在 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.pngimage-20220629161325409.png

这个包的内容为:

代码语言:txt复制
   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 异常。

  1. 负载均衡算法反序列化异常
image-20220707170118827.pngimage-20220707170118827.png

该异常导致读写分离查询请求都以随机算法在 DB 之间执行。

  1. 其他 bug。

新增功能

使用 UseDB hint 自定义查询请求路由

例如:

代码语言:txt复制
SELECT /*  UseDB('employees-master') */ emp_no, birth_date, first_name, last_name, gender, hire_date FROM employees WHERE emp_no = ?

在查询请求中加入 UseDB 注解,注解的参数为数据源的名称,即可指定 SQL 请求路由到哪个数据源执行。

预览功能

本次版本增加了审计日志功能。可通过在配置中加入 AuditLogFilter 开启,例如:

代码语言:txt复制
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 会以下面的格式记录审计日志:

代码语言:txt复制
[timestamp],[username],[ip address],[connection id],[command type],[command],[sql text],[args],[affected row]

记录内容如下:

代码语言:txt复制
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: https://github.com/CECTC/dbpack
  • dbpack-samples: https://github.com/CECTC/dbpack-samples
  • dbpack-doc: https://github.com/CECTC/dbpack-doc
  • 事件驱动分布式事务设计:https://mp.weixin.qq.com/s/r43JvRY3LCETMoZjrdNxXA
  • 视频介绍:https://www.bilibili.com/video/BV1cg411X7Ek

0 人点赞