Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
119 lines (102 sloc) 8.71 KB

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;
+-----------+----------+----------------------------------------------------------------------------------------------------+
| DATA_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的增强与改进

0.2.6 附录2

dble的IO结构

You can’t perform that action at this time.