2

DBPack 读写分离功能发布公告 - Scott Lewis

 2 years ago
source link: https://www.cnblogs.com/DKSL/p/16465732.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

在 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。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK