以下对 DBLE 2.19.09.0 版本的 Release Notes 进行详细解读,文章主要分为以下三部分内容:
- 一、DBLE 项目介绍
- 二、新版本主要更新解读
- 三、完整 Release Notes 及翻译
一、DBLE 项目介绍
DBLE — 企业级开源分布式中间件,江湖人送外号 “MyCat Plus”;以其简单稳定,持续维护,良好的社区环境和广大的群众基础得到了社区的大力支持;
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 交互设计图:
命令的使用说明 & 命令实现细节 & 简单 HA 的交互使用案例 请查看以下文档:
https://github.com/actiontech...
2、dump 文件拆分命令 split
在进行 POC 时,现场人员进行数据导入时经常遇到各种问题,比较典型的是 dble 在导入文件时,对部分sql语句的不支持。另外,未分片的历史数据通过 dble 导入,旧数据会路由分片,在数据量较大时,耗时会比较长,在此过程中出现错误的话也很难排查。 基于以上原因,2.19.09.0 版本提供工具对 mysqldump 导出的源数据文件按照后端分片节点进行分割。分割后的数据文件可以在每个后端分片执行导入,适配数据按分片导入的需求。
dump 文件语句处理
- create database:会将逻辑数据库转换为物理库。
- ddl 语句:根据表的分片节点写入到对应后端节点的 dump 文件中,对于全局表的 create 语句,会加入全局检查列,对于自增列,会将自增列的数据类型修改为 bigint。
- insert:全局序列列值会被 dble 替换为全局序列,再按照拆分列根据拆分算法路由到对应后端节点的 dump 文件中。
- 一些属性设置的语句会根据最近一次解析的 ddl 来决定下发到具体的后端节点的 dump 文件中。
- 会跳过对视图的处理
- 会跳过对子表的处理
命令语法
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
。``
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。