Mysql

Apache Doris PreparedStatement 之谜

使用的 Apache Doris 版本:3.0.3, 对应的 Doris 源码如果没有特意说明,均为 3.0.3 版本。

更新 #

后续又遇到了一个跟 prepared statement 相关的错误,起因是在一次迭代中将 DQ-1 的 gorm 版本从 v1.25.5 升级到了 v1.26.1 发现大量的 SQL 报错:

Error 1105 (HY000): errCode = 2, detailMessage = \nmismatched input 'LIMIT' expecting {<EOF>, ';'`);

但是 SQL 没有做过任何调整, 将 SQL 复制出来在 mysql shell 中都正常运行。

抓包可以发现,这个错误是在 COM_STMT_PREPARE 阶段报出的, 如下图:

update-prepare-limit-variables
update-prepare-limit-variables

经过对比和查看 gorm 的发布历史,找到这样一个 PR:

#6806: let limit and offset use bind parameter

带来的影响就是把 limit 后面的变量在 prepare 阶段使用占位符号替代(之前的版本是直接使用的值而不是占位符)。恰恰 doris 还不支持如下这种语句,所以导致了上面的错误。

select * from user where id = ? limit ?;

原因是 doris 的 SQL 语法约定了, LIMIT OFFSET 后面必须要跟一个整型字面量:

...

ShardingSphere-Proxy问题几则

ShardingSphere Proxy 是 Apache ShardingSphere 的一个子项目,是一个基于 MySQL 协议的数据库中间件,用于实现分库分表、读写分离等功能。在使用过程中,遇到了一些问题,记录如下。

这里主要针对的是 分库分表 的使用场景。

问题概述 #

数据库往往是一个系统最容易出现瓶颈的点,当遇到数据库瓶颈时,我们可以通过数据拆分来缓解问题。数据拆分的方式通常分为横向拆分和纵向拆分,横向拆分即分库分表;纵向拆分即把一个库表中的字段拆分到不同的库表中去。这两种手段并不互斥,而是在实际情况中相辅相成。本文即是横向拆分相关内容。

  • 常见的部署方式有哪些?
  • 数据分片规则怎么配置?
  • 数据分片数应该怎么确定?
  • 数据分片后唯一索引还有用吗?
  • 数据分片后数据迁移?
  • 数据分片后如何确定实际执行 SQL 语句?
  • 数据分片后的查询优化?

0. 常见的部署方式 #

官方提供了两种部署方式:

  • 单机部署:将 ShardingSphere Proxy 部署在单台服务器上,用于测试和开发环境。
  • 集群部署:将 ShardingSphere Proxy 部署在多台服务器上,用于生产环境。集群模式下使用 zookeeper 来存储元数据。

关于元数据,元数据是 ShardingSphere Proxy 的核心,用于存储分库分表规则、读写分离规则等信息。 官方建议使用集群模式部署 生产环境的 ShardingSphere Proxy

如果不按照官方的指引,选择部署了多个 Standalone 模式的 ShardingSphere Proxy,那么需要注意“每个这样的 proxy 节点会有自己的元信息,他们之间并不互通”。在这些情况下会出现节点之间元数据不一致的问题,参看如下测试:

# 启动 3 个 standalone 模式的 ShardingSphere Proxy
                                          +-------+
                                          |  LB   |
                                          +-------+
                                              |
                                |-------------|--------------|
                                |             |              |
                            +-------+     +-------+       +-------+
                            | Node1 |     | Node2 |       | Node3 |
                            +-------+     +-------+       +-------+

初始表结构如下:

...

访问量 访客数