共计 2921 个字符,预计需要花费 8 分钟才能阅读完成。
作者:肖亚洲
爱可生 DBA 团队成员,负责我的项目中数据库故障与平台问题解决,对数据库高可用与分布式技术情有独钟。
本文起源:原创投稿
* 爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。
背景介绍
客户环境近期呈现了几次问题,通过探讨后决定进行架构变更,要将 mycat 迁徙到 dble。要求是:最小变动。
问题整顿
联合客户状况与要求列举了下须要思考的事件:
- 参数设置
- 分片函数
- 数据节点的数据
- 业务 SQL
问题解决
1、参数设置
mycat 端参数如下:
<system>
<property name="defaultSqlParser">druidparser</property>
<property name="processors">4</property>
<property name="processorBufferPool">20480000</property>
<property name="processorBufferLocalPercent">100</property>
<property name="frontSocketSoRcvbuf">10485760</property>
<property name="frontSocketSoSndbuf">41943040</property>
<property name="frontSocketNoDelay">1</property>
<property name="backSocketSoRcvbuf">41943040</property>
<property name="backSocketSoSndbuf">10485760</property>
<property name="backSocketNoDelay">1</property>
<property name="maxPacketSize">2048576000</property>
<property name="memoryPageSize">100m</property>
</system>
针对该参数 DBLE 侧倡议如下:
- defaultSqlParser、memoryPageSize、processorBufferLocalPercent 已于 dble 中被废除,可不用配置
- processorBufferPool 参数名变更为 bufferPoolPageSize
- 其余的参数在 dble 中可在 server.xml 中与 mycat 保持一致配置信息,局部参数信息详情可见:https://github.com/actiontech…
留神:mycat 和 dble 的内存治理配置有较大不同。比方:没有 threadlocal 概念。倡议浏览以下文档:https://actiontech.github.io/…
2、分片函数
查看 mycat 分片规定:
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">8</property>
</function>
间接采纳 DBLE 的 hash 算法测试发现局部数据查问报错:
查看表内数据状况:
样例数据:20210810143211157000000000036
字段:user_code 为 varchar(32)
查看 mycat 环境分片规定:采纳的分片算法为 mod-long。而 long 的取值范畴是 -9223372036854774808~9223372036854774807,查问出错的 20210810143211157000000000036 超过了 long 的取值范畴。所以能够得出 mycat 针对这一非凡状况做了非凡解决。
针对该状况 DBLE 侧倡议如下:
1、倡议分片算法换成 HashString
分片列值超过 Long 的最大值(9223372036854774807), 须要换成列为 String 型的分片算法;
留神:历史数据须要在更换完算法分片后从新导入
2、采纳 DBLE 的自定义算法
援用 mycat 的 PartitionByMod 算法,退出 [dble 的自定义算法 https://actiontech.github.io/…] 中。
最终配置如下:
<function name="test_func" class="com.actiontech.dble.custom.sharding.algorithm.PartitionByMod">
<property name="count">8</property>
</function>
3、数据节点数据
通过引入 DBLE 的自定义拆分算法性能,兼容了原环境 mycat 上的拆分算法,因而原 mycat 环境的存储节点数据也不须要再做任何变动。这极大的缩小了咱们迁徙的工作量。
4、业务 SQL
通过几轮测试下来,咱们发现 mycat 在很多时候会将 SQL 间接下发到后端节点,这就造成了咱们在测试时碰到了很多问题,因为 DBLE 对多种状况做了细分。
为了最大水平保障业务查问数据的准确性 DBLE 砍了很多此类 SQL 的反对,但为了业务的变更最小,DBLE 也做了适当凋谢。
如下是局部记录:
-
对 insert into … select … 语法的反对
目前 DBLE 放开了垂直表该语法的反对。
-
对 rownum 透传的反对
目前 DBLE 放开了指定表 rownum 的透传。
-
UPDATE query with sub-query is not supported
1.update 多节点更新会触发分布式事务的问题,难以保障一致性
2. 依照目前的执行打算,mycat 对于 update+ 子查问采纳的是将源 sql 进行播送下发(下发至表关联的所有节点),这种机制在某些状况下是无奈保障正确性的
3. 多表关联更新不反对,dble 作为一个中间件产品,解决的某一类的 sql,对于这类 sql 正确的解决办法是须要先将子查问下发,回收后果后再拼接外层 sql 进行下发,目前对于这种解决形式解析、实现比拟艰难,而且性能问题也是须要考量。
4. 为了保障 update+ 子查问这类 sql 的正确性,必定不能用 mycat 这种播送下发来做,所以对于这类 sql 目前是不反对的
-
全局表 + 分片表类型 SQL 反对
ERROR 4004 (HY000): Unknown function FN_TREE_PATHNAME
1.dble 在 2.20.04.x 版本及其之后版本曾经做过优化能够间接执行这种状况的 sql.
2. 全局表 + 分片表之前没有解决是因为间接下发是可能存在问题,对于全局表 + 分片表中非凡的场景:全局表 + 垂直表,并未计算出来这些节点最初应用的是同一个节点。(其实能够计算,dble 在 2.20.04.x 版本及之后已优化)
3.mycat 会间接下发语句到节点中,全局表在每个配置的节点都会存储雷同的数据,如果将每个节点和拆分表 Left Join 的后果进行简略的 UNION ALL 合并,会造成数据的反复,不能保证数据的准确性。所以不能间接透传。
更多
针对 DBLE 对 MyCat 做的加强更多记录于:https://actiontech.github.io/…