0.2 dble对MyCat做的增强
建议大家收看免费课程来初步认识dble的改进项
0.2.1 缺陷修复(目前mycat社区不活跃,不再追踪mycat的bug)
- 由于对堆外内存的使用不当,导致高并发操作时对同一片内存可能发生“double free",从而造成JVM异常,服务崩溃。 #4
- XA事务漏洞:包乱序导致客户端崩溃 #21
- where关键字写错时,会忽视后面的where条件,会得到错误的结果,比如select * from customer wher id=1;#126
- 对于一些隐式分布式事务,例如insert into table values(节点1),(节点2);原生mycat直接下发,这样当某个节点错误时,会造成该SQL执行了一部分
- 权限黑名单针对同一条sql只在第一次生效。#92
- 聚合/排序的支持度非常有限,而且在很多场景下还存在结果不正确、执行异常等问题 #43,#31,#44
- 针对between A and B语法,hash拆分算法计算出来的范围有误#23
- 开启全局表一致性检查时,对全局表的处理存在诸多问题,例如不能alter table、insert...on duplicate...时不更新时间戳、update...in ()报错等#24, #25,#26 ,#5
- 多值插入时,全局序列生成重复值 #1
- ER表在一个事务内被隔离,不能正确插入子表数据#13
- sharding-join结果集不正确#17
详情及其他修正请见 修复列表
0.2.2 实现改进
- 对某些标准SQL语法支持不够好的方面作了改进,例如对create table if not exists...、alter table add/drop [primary] key...等语法的支持
- 对整体内部IO结构进行了大幅的改造和调优:参见dble的IO结构 或者见本节结尾附录2
- 禁止普通用户连接管理端口进行管理操作,增强安全性 #56
对全局序列做了如下改进
- 删去无工程意义的本地文件方式
- 改进数据库方式、ZK方式,使获取的序列号更加准确
- 改进时间戳方式和ZK ID生成器方式,消除并发低时的数据分布倾斜问题
- 修复了数据库方式全局序列中线程安全的问题#489
- 移除自定义语法 限制:全局序列值不能显式指定
- 原来:insert into table1(id,name) values(next value for MYCATSEQ_GLOBAL,‘test’);
- 现在1:insert into table1(name) values(‘test’);
- 现在2:insert into table1 values(‘test’);
- 注意时间戳方式需要该字段是bigint
改进对ER表的支持,智能处理连接隔离,解决同一事务内不可以同时写入父子表的问题,并优化ER表的执行计划
- 系统通过智能判断,对于一些没有显式配置但实际符合ER条件的表视作ER表同样处理
- 在中间件内进行智能解析与判断,使用正确的schema,替换有缺陷的checkSQLschema 参数
- conf/index_to_charset.properties的内容固化到代码 。
- 对于前端按照用户限制连接数,限制总连接数
- 改进原本的SQL统计,增加UPDATE/DELETE/INSERT
0.2.3 功能增强
- 提供了更强大的查询解析树,取代ShareJoin,使跨节点的语法支持度更广(join,union,subquery),执行效率更高,同时聚合/排序也有了较大改进
- 提供科学的元数据管理机制,更好的支持show、desc等管理命令,支持不指定columns的insert语句 #7
- 元数据自动检查
- 启动时对元数据进行一致性检查
- 配置定时任务,对元数据进行一致性检查
- 提供更详实的执行计划,更准确的反映SQL语句的执行过程
- 举例: mysql> explain select * from sharding_two_node a inner join sharding_four_node b on a.id =b.id;
+---------------+----------+----------------------------------------------------------------------------------------------------+
| SHARDING_NODE | TYPE | SQL/REF |
+---------------+----------+----------------------------------------------------------------------------------------------------+
| dn1.0 | BASE SQL | select `a`.`id`,`a`.`c_char`,`a`.`ts`,`a`.`si` from `sharding_two_node` `a` ORDER BY `a`.`id` ASC |
| dn2.0 | BASE SQL | select `a`.`id`,`a`.`c_char`,`a`.`ts`,`a`.`si` from `sharding_two_node` `a` ORDER BY `a`.`id` ASC |
| dn1.1 | BASE SQL | select `b`.`id`,`b`.`c_flag`,`b`.`c_decimal` from `sharding_four_node` `b` ORDER BY `b`.`id` ASC |
| dn2.1 | BASE SQL | select `b`.`id`,`b`.`c_flag`,`b`.`c_decimal` from `sharding_four_node` `b` ORDER BY `b`.`id` ASC |
| dn3.0 | BASE SQL | select `b`.`id`,`b`.`c_flag`,`b`.`c_decimal` from `sharding_four_node` `b` ORDER BY `b`.`id` ASC |
| dn4.0 | BASE SQL | select `b`.`id`,`b`.`c_flag`,`b`.`c_decimal` from `sharding_four_node` `b` ORDER BY `b`.`id` ASC |
| merge.1 | MERGE | dn1.0, dn2.0 |
| merge.2 | MERGE | dn1.1, dn2.1, dn3.0, dn4.0 |
| join.1 | JOIN | merge.1, merge.2 |
+---------------+----------+----------------------------------------------------------------------------------------------------+
9 rows in set (0.00 sec)
- set 系统变量语句的改进
- set charset/names 语句的支持
- 分布式事务:XA实现方式的异常处理的改进
- 大小写敏感支持
- 支持DUAL
- 支持单次请求多语句(部分客户端有使用,C和C++常见)
- 不断丰富的路由规则优化和条件优化
- 升级Druid,跟进最新的解析器
- 升级fastjson,避免安全问题
- 智能判断reload连接变更,热更新连接池
- 对MySQL协议及GUI工具/Driver更友好的支持
- 增加更多的管理端命令,满足更多运维需要
- 缓存支持使用RocksDB
- 增加慢查询日志功能,兼容mysqldumpslow 和 pt-query-digest
- Trace功能,用于分析单条查询的性能瓶颈
- 大小写敏感依赖于后端MySQL
- 支持Prepared SQL Statement Syntax
- 支持以下子查询
- The Subquery as Scalar Operand
- Comparisons Using Subqueries
- Subqueries with ANY, IN, or SOME
- Subqueries with ALL
- Subqueries with EXISTS or NOT EXISTS
- Derived Tables (Subqueries in the FROM Clause)
- 支持dble层面的 View
- 支持MySQL8.0 默认登陆验证插件
- 提供自定义告警接口
- 支持自定义拆分算法
- 支持自增列可以设置为非主键列
- 可以观察执行中的DDL
- 提供配置预检查功能
- 流量暂停和恢复功能
0.2.4 功能裁减
- 仅保留枚举、范围、HASH、日期等分片算法,对这几个算法进行了可用性的改进,使之更加贴合实际应用,项目需要时可以按需提供
- 移除异构数据库支持
- 禁止某些不支持的功能,这些功能客户端调用时不会报错,但结果并非用户想要的结果,例如无效的set语句
- 移除目前实现有问题的第一结点库内分表模式
- 移除writeType参数,等效于原来writeType = 1
- 移除handleDistributedTransactions 选项,直接支持分布式事务
0.2.5 附录
一些功能改进的详细描述,见开源数据库中间件DBLE对MyCAT的增强与改进