写点什么

DBPack 读写分离功能发布公告

作者:峨嵋闲散人
  • 2022 年 7 月 15 日
  • 本文字数:1746 字

    阅读完需:约 6 分钟

在 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 请求是否在一个事务中。如下图所示:

  1. 这个包的内容为:


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 数量
复制代码
  1. dbpack 之前的版本将标志位设置为 0,java、golang、.net core、php 8.0 之前的 mysql driver 都能正确协调事务,php 8.0 的 pdo driver 会对标志位进行校验,所以 php 8.0 以上版本在使用 dbpack 协调分布式事务时,会抛出 transaction not active 异常。

  2. 负载均衡算法反序列化异常

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

  2. 其他 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,[],02022-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'],12022-06-14 07:15:45,dksl,172.18.0.1:60372,1,COM_STMT_EXECUTE,DELETE,DELETE FROM employees WHERE emp_no = ?,['100000'],12022-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'],12022-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。

链接

用户头像

还未添加个人签名 2019.12.17 加入

还未添加个人简介

评论

发布
暂无评论
DBPack 读写分离功能发布公告_分布式事务_峨嵋闲散人_InfoQ写作社区