雍正报道.png

以下对 DBLE 2.19.09.0 版本的 Release Notes 进行详细解读,文章主要分为以下三部分内容:
  • 一、DBLE 项目介绍
  • 二、新版本主要更新解读
  • 三、完整 Release Notes 及翻译

一、DBLE 项目介绍

DBLE — 企业级开源分布式中间件,江湖人送外号 “MyCat Plus”;以其简单稳定,持续维护,良好的社区环境和广大的群众基础得到了社区的大力支持;
dble介绍.png
DBLE 官方项目:
https://github.com/actiontech...
如对源码有兴趣或者需要定制的功能的可以通过源码编译安装

DBLE 官方文档(已更新):
https://actiontech.github.io/...
可以详细了解 DBLE 的背景和应用场景,本文未涉及到的细节都可在官方文档获得

新版本 DBLE 下载地址及 Release Notes:
https://github.com/actiontech...

官方课程

点击学习《DBLE 快速上手》(全十八课,更新至第二课),实操视频 + 图文稿!

点击学习《DBLE 公开课》 进阶课程

Tips:建议下载最新的 Releases 版本,下载 tar 压缩包即可,如有源码编译需求的,可以下载源码包。

主要更新解读

新版本概况

距离 2.19.07.0 发布 71 天后 ,2.19.09.0 版本发布;新版 dble 新增重构功能 8 个,修复缺陷 34 个,向后兼容性调整 3 处;

首先致谢

  • 感谢以下人员对社区做出的贡献:

    @yinyanghuafa, @CrookedPotato, @lirulei, @ssxlulu.

  • 感谢 Github 用户提供的优质 issue
  • 感谢 QQ 群(669663113)内朋友提供的有效反馈

1、添加外部后端 MySQL-HA 连接

dble 在版本 2.19.09.0 开始提供对应的外部接口,基于以下几个基础要点进行设计:

  • 外部 HA 组件能够通过一定的方式和 dble 进行信息的主动沟通(包括脚本,网络通信,命令等方式)
  • 外部 HA 组件能够做出对与 MySQL 可用性的明确判断(包括哪些节点停流量,哪些节点主从切换,哪些节点启动流量)

在基于以上的两个条件的情况下,基于提供外部接口通用性以及易用性的考虑,决定通过管理端用户命令的方式添加对应的交互接口,具体的提供以下的三个交互接口:

  • 停止流量命令(dataHost @@disable)
  • 启动流量命令(dataHost @@enable)
  • 主从切换命令(dataHost @@swtich)

其次为了方便进行管理和观测,提供了一个当前切换状态的查询命令:

  • 切换状态查询命令(dataHost @@events)

外部 HA 组件可以通过 mysql 命令、脚本调用 mysql 命令、或者程序的 DB 连接执行 mysql 命令的方式进行交互。
同时此功能设计考虑到zk集群用户的需求,当用户使用 zk 集群状态下的 dble 进行高可用切换时,会有集群的联动机制,外部 HA 组件只需要通知其中一个节点即可。

以下提供一个外部 HA 和 dble 交互设计图:
图1.png

命令的使用说明 & 命令实现细节 & 简单 HA 的交互使用案例 请查看以下文档:

https://github.com/actiontech...

https://github.com/actiontech...

https://github.com/actiontech...

2、dump 文件拆分命令 split

在进行 POC 时,现场人员进行数据导入时经常遇到各种问题,比较典型的是 dble 在导入文件时,对部分sql语句的不支持。另外,未分片的历史数据通过 dble 导入,旧数据会路由分片,在数据量较大时,耗时会比较长,在此过程中出现错误的话也很难排查。 基于以上原因,2.19.09.0 版本提供工具对 mysqldump 导出的源数据文件按照后端分片节点进行分割。分割后的数据文件可以在每个后端分片执行导入,适配数据按分片导入的需求。

dump 文件语句处理

  1. create database:会将逻辑数据库转换为物理库。
  2. ddl 语句:根据表的分片节点写入到对应后端节点的 dump 文件中,对于全局表的 create 语句,会加入全局检查列,对于自增列,会将自增列的数据类型修改为 bigint。
  3. insert:全局序列列值会被 dble 替换为全局序列,再按照拆分列根据拆分算法路由到对应后端节点的 dump 文件中。
  4. 一些属性设置的语句会根据最近一次解析的 ddl 来决定下发到具体的后端节点的 dump 文件中。
  5. 会跳过对视图的处理
  6. 会跳过对子表的处理

命令语法

mysql > split src dest [-r500] [-w500] [-l10000]

  • src:表示原始 dump 文件名
  • dest: 表示生成的 dump 文件存放的目录
  • -r 表示设置读文件队列大小,默认 500
  • -w 表示设置写文件队列大小,默认 500
  • -l 表示 split 后一条 insert 中最多包含的 values,只针对分片表,默认 10000。例如:原始 dump 文件分片表的一条 insert 语句包含三万条values,可平均分片到两个节点,则这条语句被 split 之后每个数据节点上生成一条包含一万 values 的insert和一条包含五千 values 的 insert。

生成的分片文件以格式:源文件名 -datanode名-时间戳.dump,最新的文件时间戳最大。

例如:我的原始 dump 文件是 /tmp/mysql_dump.sql ,我想切分以后输出到 /tmp/dump/ 目录下: 命令就是:

split /tmp/mysql_dump.sql /tmp/dump/

命令的使用说明请查询以下文档:

https://github.com/actiontech...

四、完整 Release Notes

更新列表:

  • [#1467] 新增外部 MySQL-HA 软件调用接口,支持 MySQL-HA 软件发生数据库切换时调用 dble 同步切换路由
  • [#1452] mysqldump 导出的文件可以根据 datanode 拆分为多个文件。
  • [#1364] ChildTable 添加一个配置属性 "incrementColumn"。
  • [#1408] 为某些分区算法添加新的参数 "ruleFile"
  • [#1402] 升级 JWS 版本,因为有时旧版本无法正常工作。
  • [#1412] 为心跳连接添加一个可分辨的名称。
  • [#1405] 重构 Dbleserver&Dbleserver#startup。
  • [#1440] 管理命令 thread_used 的性能优化。

缺陷修复:

  • [#1409] 实现集群的在线重启状态检查。
  • [#1505] 当 Join SQL 包含 using() 子句时,Explain 会得到错误的结果。
  • [#1499] 当 balance!= 0 并且所有后端 MySQL 被禁用时,重载 @@config_all 报错。
  • [#1445] 用户权限被限制时查询反馈不准确。
  • [#1336] 事务失败后,新事务可能会获得上一个事务的结果集。
  • [#1392] 当无法访问数据主机时,Commit 可能会得到奇怪的结果集。
  • [#1325] [#1317] server.xml 中的 maxPacketSize 属性不起作用。
  • [#1394] [#1434] 执行 SQL_SELECT_LIMIT=1000 时返回错误,并且有另一个无法访问的数据主机。感谢 @yinyanghuafa 报告错误。
  • [#1491] small int 类型在预处理语句协议中将导致抛出数组索引超出范围的异常。
  • [#1432] 管理命令 pause @@dataNode=... 即使该服务实际上并未停止也会返回 OK。
  • [#1393] 当启用慢日志后,一个非常大的 select SQL 会花费大量时间
  • [#1456] [load data ... fields terminated by "x"...] 的 x 只能是 char 类型,期望 x 可以是 string 类型。
  • [#1335] 事务中查询之间的间隔时间被计算为 sqlExecuteTimeout 的一部分。
  • [#1321] 如果表使用保留字作为列名,并且 server.xml 中 useGlobleTableCheck=1 时,在全局表中插入数据将会出错。
  • [#1478] 当设置 lower_case_table_names=1 且视图名称包含大写字母时,select ... from view_name 将报错。
  • [#1458] 在 XA 事务中执行 DDL 时返回错误。
  • [#1400] 隐式插入到不同的数据节点可能不会遵循最终一致性。
  • [#1379] 函数形式为 char [N],如果在不带 [N] 的部分,dble 执行将出错。
  • [#1330] 带有重复列的 Join 查询期望失败报错,实际却成功了。
  • [#1365] 当 MySQL 设置 lower_case_table_names=1 时,Join 返回错误 "Unknown column 'ta.id' in 'field list'"。
  • [#1429] 内部连接查询返回错误 "column t1.id not found"。
  • [#1428] 对于全局表,dble 在路由到 datanode 时将删除表名上的反引号。
  • [#1375] dble 不支持反引号。
  • [#1269]使用 c_api 驱动程序检查多查询功能时出错。
  • [#1239] PMA 无法连接到 dble,感谢 @lirulei 报告该错误。
  • [#1419] 执行 select ... from where ... limit n 时得到了一个错误 "table node build Own exception! Error:null" 。
  • [#1397] 如果在加载数据过程中发生错误,则 MySQL 协议数据包的 ID 是错误的 ,感谢 @ssxlulu 报告并修复该错误。
  • [#1388] 语句中包含中文字符的分号 ,将直接返回 OK。
  • [#1324] 如果查询中的表名添加反引号 table_name ,表将被全局扫描。谢谢 @CrookedPotato 报告该错误。
  • [#1323] 选择一个特定的分片表,被反引号修饰的表明将路由到所有分片。
  • [#1385] 在 where 条件下使用正则表达式时,查询结果不正确。
  • [#1386] MySQL 中的数据库名称有 '.' 时,执行 SQL 报错。
  • [#1398] 在连接 dble 时使用 --default-auth=sha256_password 和错误密码,返回错误:"lost connected"。
  • [#1277] 管理用户可以登录到服务器端口,感谢 @CrookedPotato 报告该错误。

兼容性:

  • [#1267] 更改 reload @@config 逻辑,现在与 reload @@config_all 相同。
  • [#1412] 为心跳连接添加一个可分辨的名称。
  • [#1446] 重构 show @@directmemory。``

爱可生开源社区
426 声望207 粉丝

成立于 2017 年,以开源高质量的运维工具、日常分享技术干货内容、持续的全国性的社区活动为社区己任;目前开源的产品有:SQL审核工具 SQLE,分布式中间件 DBLE、数据传输组件DTLE。