• DBPack 读写分离功能发布公告


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

    链接

  • 相关阅读:
    对接抖音开发之售后消息实时通知订单部分退款
    java计算机毕业设计宠物寄存管理系统MyBatis+系统+LW文档+源码+调试部署
    Java lambda表达式基本使用
    JavaScript的使用
    学会 Python 自动安装第三方库,从此跟pip说拜拜
    科普 “平均工资又涨了”
    Cloud Bursting解决方案,Serverless容器降本增效极致体验
    电脑操作系统你真的搞懂了分类?(第五十三课)
    前端学习笔记--React
    spring boot 项目中的application不能执行是什么问题
  • 原文地址:https://www.cnblogs.com/DKSL/p/16465732.html