【五一创作】【Mycat】Mycat2 Bugs 及修改建议(V1.22_2022-10-13)

news2024/11/24 0:48:14

Bug 1 : wrapper.conf 数字类型参数配置有误,多了末尾的单位 M

在这里插入图片描述

https://wrapper.tanukisoftware.com/doc/english/prop-java-initmemory.html

wrapper.log 产生警告:

WARN   | wrapper  | 2023/04/20 22:42:00 | Encountered an invalid numerical value for configuration property wrapper.java.initmemory=256M.  Resolving to 256.
WARN   | wrapper  | 2023/04/20 22:42:00 | Encountered an invalid numerical value for configuration property wrapper.java.maxmemory=2048M.  Resolving to 2048.

Bug 2 : 执行错误的指令也不会报错

在 Mycat2 终端中执行任一满足 SQL 语法规则的 SQL 语句均不会报错,Mycat2 似乎不会去做语义分析验证对象的有效性。

例如,笔者并没有创建 ttt 数据库,但却可以 use ttt 且不报错。

mysql> use ttt;
Database changed
mysql> show tables;
Empty set (0.05 sec)

mysql> show databases;
+--------------------+
| `Database`         |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| testdb             |
+--------------------+
4 rows in set (0.00 sec)

Bug 3 : 逻辑库名错误识别为物理库名

最初,我认为 schemaName 是指逻辑库(方案)名,测试发现 Mycat 启动时报错,但最后却启动成功了。问了 Mycat 社区 并没有解决。

在这里插入图片描述

后来我将其配置为逻辑库对应的物理库名,启动时就不报错了。这让我认为 schemaName 是指物理库名。

再后来,当我发现 Bug 5 时,确信了 schemaName 是指逻辑库名,只是当前版本的 Mycat2 解析器有问题,要求原型库或数据源中必须存在与该逻辑库同名的物理库

另外,当配置的逻辑库名与实际物理库名相同时,Mycat2 会自动获取表信息;否则不会自动获取表信息,需要为每一个逻辑表配置映射关系。

[root@ic-source conf]$ cat schemas/mycat_db.schema.json 
{
        "customTables": {},
        "globalTables": {},
        "normalTables": {
                "logical_t1": {
                        "createTableSQL":"CREATE TABLE `logical_t1` (\n  `id` int DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci",       // 可选
                        "locality": {
                                "schemaName": "testdb", // 物理库,可选
                                "tableName": "t1",      // 物理表,可选
                                "targetName": "cls02"   // 指向集群,或者数据源
                        }
                }
        },
        "name": "mycat_db",     // Mycat2 暂不支持
        "schemaName": "mycat_db",
        "shardingTables": {},
        "targetName": "cls02"
}

当我将最外层的 schemaName 设置为 mycat_db 时,除了显式配置逻辑表 t2 ,无论怎么配置,Mycat2 都不会获取到 testdb.t2 表的信息。

在这里插入图片描述

[root@ic-source conf]$ cat schemas/mycat_db.schema.json
{
        "customTables": {},
        "globalTables": {},
        "normalTables": {
                "logical_t1": {
                        "createTableSQL": null, // 可选
                        "locality": {
                                "schemaName": "testdb", // 物理库,可选
                                "tableName": "t1",      // 物理表,可选
                                "targetName": "cls02"   // 指向集群,或者数据源
                        }
                },
                "logical_t2": {
                        "locality": {
                                "schemaName": "testdb", // 物理库,可选
                                "tableName": "t2",      // 物理表,可选
                                "targetName": "cls02"   // 指向集群,或者数据源
                        }
                }
        },
        "name": "mycat_db",     // Mycat2 暂不支持
        "schemaName": "mycat_db",
        "shardingTables": {},
        "targetName": "cls02"
}

在这里插入图片描述

不支持自动获取逻辑库中未配置而在物理库中存在的表,例如 testdb.t2

在这里插入图片描述

下图是我为了说明问题伪造的。
在这里插入图片描述

不知 Mycat2 是这块具体怎么实现的。

修改建议

  • schemaName 改名为 namelogicalSchemaName 属性以作区分,避免逻辑库名与物理库名混淆不清。而且,没必要要求必须存在与逻辑库同名的物理库。
  • 增加三个属性:一个 defaultLocality 属性,包含两个子属性: defaultSchemaNamedefaultTargetName 。它们用于当没有为逻辑表配置 locality 属性时,为其指定默认的映射关系。
  • 支持动态调整 Schema 配置文件,而不是每次修改都要重启。Schema 级别应该设计得与 集群数据源 级别不同,支持动态调整。最好全都支持动态调整,毕竟 Mycat 整体是个逻辑结构。

Bug 4 : 无法识别JSON 文件名中的逻辑库名称,且配置文件内缺少相应属性

Mycat2 服务启动没有任何报错。

在这里插入图片描述

$MYCAT_BASE/conf/schemas/mycat_db.schema.json 如下,其中 $MYCAT_BASE 为 Mycat2 的安装目录:

[root@ic-source conf]$ cat schemas/mycat_db.schema.json 
{
        "customTables": {},
        "globalTables": {},
        "normalTables": {
                "logical_t1": {
                        "createTableSQL":"CREATE TABLE `logical_t1` (\n  `id` int DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci",       // 可选
                        "locality": {
                                "schemaName": "testdb", // 物理库,可选
                                "tableName": "t1",      // 物理表,可选
                                "targetName": "cls02"   // 指向集群,或者数据源
                        }
                }
        },
        "schemaName": "testdb",	//物理库名,而非逻辑库名
        "shardingTables": {},
        "targetName": "cls02"
}

可以看到,该 JSON 配置文件名中的“方案名”为 mycat_db ,而在配置文件内容中却并没有相应的配置,其中的 schemaName 经测试是指物理库名。建议新增一个属性 namelogicalSchemaName 表示逻辑库名,与 clusters/prototype.cluster.jsondatasources/prototypeDs.datasource.json 的配置规则(配置文件内包含 name 属性,与 JSON 文件名称一致)保持一致。

clusters/prototype.cluster.json 内容如下:

在这里插入图片描述

datasources/prototypeDs.datasource.json 内容如下:

在这里插入图片描述

而目前即便我配置了 `name· 属性,Mycat2 当前版本仍无法识别。

在这里插入图片描述

登录 Mycat2 终端,查看逻辑库名仍为物理库名 testdb ,期望为 mycat_db

在这里插入图片描述

所以,当前版本应将 JSON 文件名称中的“方案名”(即“数据库名”)设置为与数据源的实际物理库中的“方案名”相同,因为即便你配置得不同,Mycat2 也不识别。

  • 如果采用某个读写数据源指向的物理库作为原型库,应该会报错,这个笔者以后有时间测试后补上。

  • 如果未配置原型库,则在 Mycat2 终端中创建的所有数据库及内部对象只是 JSON 文件及其内容。

Bug 5 : 使用独立的原型库时造成混淆和冲突报错

此外,当配置一个独立的原型库时,会造成混淆。因为即便存在物理库 testdb ,仍可创建新的 testdb(实际创建在独立的原型库中)造成混淆。

测试过程如下:

  1. 在 Mycat2 独立的原型库使用 MySQL 终端 mysql 查看:
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mycat              |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    5 rows in set (0.01 sec)
    
  2. Mycat2 终端 执行:
    mysql> create database testdb;
    Query OK, 0 rows affected (0.78 sec)
    
    mysql> show databases;
    +--------------------+
    | `Database`         |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | testdb             |
    +--------------------+
    4 rows in set (0.08 sec)
    
    mysql> show tables from testdb;
    +------------------+
    | Tables_in_testdb |
    +------------------+
    | logical_t1       |
    | t1               |
    | t2               |
    +------------------+
    3 rows in set (0.05 sec)
    
  3. 在 Mycat2 独立的原型库使用 MySQL 终端 mysql 查看:
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mycat              |
    | mysql              |
    | performance_schema |
    | sys                |
    | testdb             |
    +--------------------+
    6 rows in set (0.00 sec)
    
    可以看到,在原型库中创建了 testdb 数据库。
    此操作还会再 Mycat2 服务器上的 conf/schemas 目录下产生 testdb 的配置文件:
    [root@ic-source conf]$ ll schemas/
    总用量 24
    -rw-r--r--. 1 root root 2463 421 15:49 information_schema.schema.json
    -rw-r--r--. 1 root root  529 429 21:29 mycat_db.schema.json
    -rw-r--r--. 1 root root 3984 422 19:26 mycat.schema.json
    -rw-r--r--. 1 root root 5299 421 15:49 mysql.schema.json
    -rw-r--r--. 1 root root  962 429 21:53 testdb.schema.json
    [root@ic-source conf]$ cat schemas/testdb.schema.json 
    {
            "customTables":{},
            "globalTables":{},
            "normalProcedures":{},
            "normalTables":{
                    "logical_t1":{
                            "createTableSQL":"CREATE TABLE `logical_t1` (\n  `id` int DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci",
                            "locality":{
                                    "schemaName":"testdb",
                                    "tableName":"t1",
                                    "targetName":"cls02"
                            }
                    },
                    "t1":{
                            "createTableSQL":"CREATE TABLE `testdb`.`t1` (\n\t`id` int DEFAULT NULL\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci",
                            "locality":{
                                    "schemaName":"testdb",
                                    "tableName":"t1",
                                    "targetName":"cls02"
                            }
                    },
                    "t2":{
                            "createTableSQL":"CREATE TABLE `testdb`.`t2` (\n\t`id` int NOT NULL,\n\t`name` varchar(30) NOT NULL,\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci",
                            "locality":{
                                    "schemaName":"testdb",
                                    "tableName":"t2",
                                    "targetName":"cls02"
                            }
                    }
            },
            "schemaName":"testdb",
            "shardingTables":{},
            "views":{}
    }
    
    这俩配置文件内容几乎一样,会在重启 Mycat 时因冲突报错。
    在这里插入图片描述

重启 Mycat2 时会失败,报错:
在这里插入图片描述
修改 Mycat2 自动生成的 schemas/testdb.schema.json 配置后,内容如下:

[root@ic-source conf]$ cat schemas/testdb.schema.json
{
        "customTables":{},
        "globalTables":{},
        "normalProcedures":{},
        "normalTables":{},
        "schemaName":"testdb",
        "shardingTables":{},
        "views":{},
        "targetName":"prototype"
}

重启 Mycat2 仍然报错。

在这里插入图片描述

此时,证实了 schemaName 属性实际上就是我所说的 namelogicalSchemaName 。兜兜转转,证明还是 Mycat2 SQL 解析器的问题。我认为此处不应该报错产生 [Error] 日志,而应产生 [INFO][WARN] 日志,提醒用户这么配置将导致逻辑库与物理库名称不一致。

Bug 6 : 逻辑表与物理表非同名时会看到“幻象”

使用上面 Bug 4 中的 $MYCAT_BASE/conf/schemas/mycat_db.schema.json 配置。

在这里插入图片描述

Mycat2 终端 查看:

在这里插入图片描述

MySQL 终端 查看:

在这里插入图片描述

Bug 7 : Mycat2 用户配置中 IP 无法识别 DNS 和主机名

users/root.user.json 文件内容如下:

[root@ic-source conf]$ cat users/root.user.json 
{
        "dialect":"mysql",      // SQL 方言
        "ip":null,
        "username":"root",      // Mycat 用户名
        "password":"123456",    // 上面的 Mycat 用户名的密码
        "transactionType":"proxy",
}

当笔者将 ip 属性限制为只有 IP 地址192.168.52.6主机名replica3 主机能访问时,分别使用 IP 地址和主机名却产生了不同的结果。

以下为 /etc/hosts 部分内容:

[root@ic-source ~]$ cat /etc/hosts
192.168.52.6 replica3

设置为 IP 地址或网段

修改 users/root.user.json 文件内容:

"ip":192.168.52.,

重启 Mycat 。

在非 replica3 主机上连接 Mycat2 报错:
在这里插入图片描述

replica3 主机上连接 Mycat2 成功:
在这里插入图片描述

配置为 IP 网段时 Mycat2 也可以识别。此处不加赘述。

设置为主机名

修改 users/root.user.json 文件内容:

"ip":"replica3",

重启 Mycat 。

replica3 主机上连接 Mycat2 报错:
在这里插入图片描述


笔者认为 Mycat2 的原型库设计有问题,只需要设计为元数据库即可。而开发者还试图将其作为处理数据库管理语句、DDL 语句等 SQL 语句的默认数据库。所有 MySQL 分库分表中间件的最终目的都是构建一个完整的 SQL 解析器,既要解析中间件自定义的语法,又要解析 MySQL 不断更新的所有语法,无疑会带来很高的实现复杂度。Mycat2 则选择了一种折中的办法,将无法解析处理的 SQL 在原型库上执行,以提高业务连续性,但他们没有考虑到用户很少使用、甚至不要该功能。在底层为复制拓扑,Mycat2 原型库为复制拓扑的 (复制)源(Source/Master) 时,还算有点用处。

首先,使用数据库中间件是需要一定的学习成本的,尤其是涉及到复杂的分库分表规则时。

其次使用 Mycat 中间件的用户,主要需求就是分库分表、分布式事务,对于 DDL、数据库管理语句等,基本不会在 Mycat 上操作。

最后,当前的原型库设计即便运行了DDL、数据库管理语句这些无法解析的语句,但却违背了用户本意,实属无用功,用户还要去处理 Mycat 因误解而带来的后果,比如删除在原型库中创建的数据库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/477325.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Git 入门教程】第八节、Git流程管理

Git是一个非常流行的分布式版本控制系统,它提供了许多强大的功能来帮助开发者管理和协调代码库。在团队协作中,如何使用Git来管理开发流程是非常重要的。本文将介绍一些Git流程管理的最佳实践,包括分支策略、代码审核等。 一、分支策略 在团…

【实战】jenkins api 接口

jenkins api 接口实战 一、Jenkins Api简介二、Jenkins Api 环境准备1、获取所有job接口2、获取所有job名字接口3、获取所有job名字和url接口 三、使用curl调用 获取所有构建队列四、使用curl调用 获取Job信息五、使用curl调用操作Job1、操作Job需要验证crumba、使用token发起接…

时序预测 | MATLAB实现BO-CNN-BiLSTM贝叶斯优化卷积双向长短期记忆网络时间序列预测

时序预测 | MATLAB实现BO-CNN-BiLSTM贝叶斯优化卷积双向长短期记忆网络时间序列预测 目录 时序预测 | MATLAB实现BO-CNN-BiLSTM贝叶斯优化卷积双向长短期记忆网络时间序列预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 基于贝叶斯优化卷积双向长短期记忆网络…

GPT-3.5 也能直接联网了

ChatGPT 常令人诟病的一个问题,就是它的模型训练数据,迄今为止用的还是 2021 年的老数据。 对于当下这个信息大爆炸时代,相隔两小时,消息都有可能滞后,更别说相隔两年了。 目前正式开放了 Web Browsing 这款插件。 …

eLife:情绪学习对人脑记忆整合的回溯性促进机制

所谓“一朝被蛇咬,十年怕井绳”,带有强烈情绪色彩的事件不仅令人记忆深刻,还会影响与之相关的其他事件。我们的日常生活中充满了无数平凡琐碎的小事,这些事情并不会给我们留下深刻印象。但是,当一件微不足道的小事事后…

计算机网络中常见的数据传输方式(电路交换,报文交换,分组交换)

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将详细介绍计算机网络中常见的数据传输方式,如电路交换,报文交换,分组交换。 如果文章有什么需要改进的地方还请大佬不吝赐教&…

Spring DI简介及依赖注入方式和依赖注入类型

目录 一、什么是依赖注入 二、依赖注入方式 1. Setter注入 2. 构造方法注入 3. 自动注入 三、依赖注入类型 1. 注入bean类型 2. 注入基本数据类型 3. 注入List集合 4. 注入Set集合 5. 注入Map集合 6. 注入Properties对象 往期专栏&文章相关导读 1. Maven系…

使用Dino+SAM+Stable diffusion 自动进行图片的修改

SAM 是Mata发布的“Segment Anything Model”可以准确识别和提取图像中的对象。 它可以分割任何的图片,但是如果需要分割特定的物体,则需要需要点、框的特定提示才能准确分割图像。 所以本文将介绍一种称为 Grounding Dino 的技术来自动生成 SAM 进行分割…

【微机原理】计算机中数的表示及运算

目录 一、数的类型 二.数值的相互转换 三.机器数的表示 四.机器数的运算--补码加减法 五.运算结果溢出的判断。 六.数据的编码 一、数的类型 1.十进制(Decimal) 基数为10,用0、1、2、3、4、5、6、7、8、9十个数码表示数值,采用逢1…

思考外语学习的底层逻辑(以英语、法语为例)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言一、英语1.学习历程2.英语学习的心得3.理论检验(持续更新) 二、法语1.学习历程2.读入数据 总结 前言 提示:这里谈谈自己为什么要…

IDEA中使用Git提交代码提示:您即将把CRLF行分隔符提交到Gt仓库。 建议将core.autocrlf Git特性设置为trUe,以免发生行分隔符问题。

IDEA中使用Git提交代码提示:您即将把CRLF行分隔符提交到Gt仓库。 建议将core.autocrlf Git特性设置为trUe,以免发生行分隔符问题。 问题背景: 在IDEA中,使用Git提交代码到远程仓库时,结果弹出一个警告窗口 问题原因: …

java紫砂壶交易购物系统 mysql

网络紫砂壶可充通过色彩、图片、说明、设置动画加强了产品了宣传,大大达到了陶瓷业的“色型”要求。实现产品管理方便,起到立竿见影的效果,不用因为更改菜色而重新印刷。只要在后台鼠标轻轻一点,全线马上更新。采用B/S模式&#x…

Shell快速入门笔记

文章目录 Shell 快速入门笔记1、Shell概述2、Shell初体验4、注释5、变量6、数据类型6.1 字符串6.2 数组 7、参数传递8、运算符9、常用命令9.1 echo命令9.2 printf命令9.3 test命令 10、流程控制10.1 条件判断10.2 循环 11、函数12、输入/输出重定向12.0 前置知识12.1 输出重定向…

实验六~Web事件处理与过滤器

1. 创建一个名为exp06的Web项目,编写、部署、测试一个ServletContext事件监听器。 BookBean代码 package org.example.beans;import java.io.Serializable;/*** Created with IntelliJ IDEA.* Description:* User: Li_yizYa* Date: 2023—04—29* Time: 18:39*/ Su…

DDD系列:二、应用架构设计演变

作用: ​ 通过规定一个固定的架构设计,可以让团队内有一个统一的开发规范,降低沟通成本,提升效率和代码质量。 目标: ​ 在做架构设计时,一个好的架构应该需要实现以下几个目标: 独立于UI:前…

02-Vue技术栈之基础篇(下)

目录 1、class 与 style 绑定1.1 理解1.2 class 绑定1.3 style绑定1.4 代码示例 2、条件渲染2.1 v-if2.2 v-show2.3 注意事项2.4 代码示例 3、列表渲染3.1 基本列表3.2 key的原理3.2.1 虚拟DOM中key的作用:3.2.2 对比规则:3.2.3 用index作为key可能会引发…

防火墙GRE和NAT

要求: Pc2和pc3之间互通;做gre pc2与pc3访问公网pc1要做地址转换 基本配置:省略,小孩子都会 这里查看效果: 区域划分 fw1: fw2: 接口地址划分: fw1: fw2:…

武汉大学惯性导航课程合集【2021年秋】1.1惯性导航和惯性器件

重力外力加速度 机械阻尼换为电阻尼,带宽提高取决于控制器响应速度 右方是不平衡跷跷板,测量顶面电容 机械中测量角速度的旋转编码器,测速电机测量的两个看得见实际物体的转子定子相对角速度,但是陀螺是相对于惯性参考系&#xf…

【YOLO系列】YOLOv6论文超详细解读(翻译 +学习笔记)

前言 YOLOv6 是美团视觉智能部研发的一款目标检测框架,致力于工业应用。论文题目是《YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications》。 本框架同时专注于检测的精度和推理效率,在工业界常用的尺寸模型中&#xff…

如何让 Edge 浏览器更干净!

如果你也喜欢 Edge 或想要尝试迁移,本文介绍一些能够让 Edge 浏览器体验更加干净、纯粹的设置技巧。 洗白新标签页 Edge 的新标签页提供了多种页面设置方案,在没有安装第三方新标签页扩展的前提下,我们可以在默认新标签页右上角的齿轮设置中…