执行add sharding hint table_value t_order = 100 后,一直没有响应,可能是哪的问题?

RT
使用了jta.properties,其中只有com.atomikos.icatch.max_timeout的配置。
连接了两个分库。

你好,add sharding hint value 只在 Proxy 内存中操作,并没有与数据源交互,与事务控制器也无关的。 建议先看下 Proxy 端日志。

谢谢!应该是我系统的问题,日志一直没有报错,后来重启了,执行成功。另外,我使用了ZK,但重启时我是改的配置文件,将proxy_hint_enabled设置为true,后使用DISTSQL将参数生效;不知之前半天未响应是为啥。
这个语法的用处:针对当前连接,为表 xx 添加分片值 yy,xx:逻辑表名称,yy:数据库分片值。那么,我设置了数据库分片值=1,是否查询到的只为分库1中的数据?

首先,hint 设置一定是要配合 hint 算法使用的,例如算法使用如下配置:

rules:
- !SHARDING
  tables:
    t_order_item:
      actualDataNodes: ds_${0..1}.t_order_item_${0..1}
      databaseStrategy:
        hint:
          shardingAlgorithmName: database_inline
      tableStrategy:
        hint:
          shardingAlgorithmName: table_inline
  shardingAlgorithms:
    database_inline:
      type: HINT_INLINE
      props:
        algorithm-expression: ds_${Integer.valueOf(value) % 2}
    table_inline:
      type: HINT_INLINE
      props:
        algorithm-expression: t_order_item_${Integer.valueOf(value) % 2}

从配置可以看出:

  • 分库路由为 database_sharding_value % 2
  • 分表路由为 table_sharding_value % 2

如果:

  1. add sharding hint database_value t_order_item = 10;
    则按照算法,SQL 语句会路由到 ds_0.t_order_item_0 和 ds_0.t_order_item_1;

  2. 在 1 的基础上, add sharding hint table_value t_order_item = 0;
    则按照算法,SQL 语句会路由到 ds_0.t_order_item_0;

  3. sharding_value 可以多次 add,如果值覆盖了算法的全部范围,如 0,1 则实际上是全路由;

  4. 可以通过 show sharding hint status; 查看当前 sharding_value 的设置状态。

希望以上回答可以解答你的疑惑。

非常感谢给我这么详细地讲解。
我用的5.0.0版本,尝试了两种DISTSQL的配置,都有报错。请帮忙看看我哪里使用的有问题,正确的使用是什么样的?
P.S. 我本来是想试试,能不能通过hint指定去某个分库上查询数据。是用于这样的场景吗?
【尝试一】
使用如下语法建的分表规则
CREATE SHARDING ALGORITHM database_hint_inline(TYPE(NAME=HINT_INLINE,PROPERTIES(‘algorithm-expression’ = ‘ds_${user_id % 2}’)));
CREATE SHARDING ALGORITHM t_hint_inline(TYPE(NAME= HINT_INLINE,PROPERTIES(‘algorithm-expression’ = ‘t_hint_${order_id % 2}’)));
CREATE SHARDING TABLE RULE t_hint (DATANODES(‘ds_${0…1}.t_hint_${0…1}’),DATABASE_STRATEGY( TYPE = standard,sharding_column = user_id,sharding_algorithm = database_hint_inline),TABLE_STRATEGY(TYPE = standard,sharding_column = order_id,sharding_algorithm = t_hint_inline),GENERATED_KEY(COLUMN=another_id,TYPE(NAME=snowflake,PROPERTIES(‘worker-id’=123))));
分表规则如下:
*************************** 3. row ***************************
table: t_hint
actual_data_nodes: ds_${0…1}.t_hint_${0…1}
actual_data_sources:
database_strategy_type: HINT_INLINE
database_sharding_column: user_id
database_sharding_algorithm_type: HINT_INLINE
database_sharding_algorithm_props: algorithm-expression=ds_${user_id % 2}
table_strategy_type: HINT_INLINE
table_sharding_column: order_id
table_sharding_algorithm_type: HINT_INLINE
table_sharding_algorithm_props: algorithm-expression=t_hint_${order_id % 2}
key_generate_column: another_id
key_generator_type: snowflake
key_generator_props: worker-id=123
建表语句:
CREATE TABLE t_hint (
order_id int NOT NULL,
user_id int NOT NULL,
status varchar(45) DEFAULT NULL,
another_id bigint,
PRIMARY KEY (order_id)
);
插入数据时报错:
mysql> insert into t_hint(order_id,user_id,status) value(1,1,“ok”);
ERROR 1997 (C1997): Runtime exception: [Insert statement does not support shardi
ng table routing to multiple data nodes.]
【尝试二】后仔细看了你给的配置,DATABASE_STRATEGY是HINT,做了调整
mysql> CREATE SHARDING TABLE RULE t_hint (DATANODES(‘ds_${0…1}.t_hint_${0…1}’)
,DATABASE_STRATEGY( TYPE = hint,sharding_column = user_id,sharding_algorithm =
database_hint_inline),TABLE_STRATEGY(TYPE = hint,sharding_column = order_id,s
harding_algorithm = t_hint_inline),GENERATED_KEY(COLUMN=another_id,TYPE(NAME=sno
wflake,PROPERTIES(‘worker-id’=123))));
Query OK, 0 rows affected (0.03 sec)

mysql> show sharding table rule t_hint\G
*************************** 1. row ***************************
table: t_hint
actual_data_nodes: ds_${0…1}.t_hint_${0…1}
actual_data_sources:
database_strategy_type: HINT_INLINE
database_sharding_column:
database_sharding_algorithm_type: HINT_INLINE
database_sharding_algorithm_props: algorithm-expression=ds_${user_id % 2}
table_strategy_type: HINT_INLINE
table_sharding_column:
table_sharding_algorithm_type: HINT_INLINE
table_sharding_algorithm_props: algorithm-expression=t_hint_${order_id % 2}
key_generate_column: another_id
key_generator_type: snowflake
key_generator_props: worker-id=123
1 row in set (0.00 sec)

插入数据 报错
mysql> show sharding hint status\G
*************************** 1. row ***************************
table_name: t_order_item
database_sharding_values:
table_sharding_values:
sharding_type: databases_tables
*************************** 2. row ***************************
table_name: t_order
database_sharding_values:
table_sharding_values:
sharding_type: databases_tables
*************************** 3. row ***************************
table_name: t_hint
database_sharding_values: 1
table_sharding_values:
sharding_type: databases_tables
3 rows in set (0.00 sec)

mysql> insert into t_hint(order_id,user_id,status) value(1,1,“ok”);
ERROR 1997 (C1997): Runtime exception: [Cannot invoke method mod() on null objec
t]

收到,我稍晚一些进行验证。

请问这个有进展不?

你好,问题复现了,尚未得到结论。 我今天再跟一下

@yyyy
你好,两个问题:
1、由于是强制路由,hint 值在存储时是不对应表字段的,只是 value,如这里

所以,SHARDING ALGORITHM 中的 inline 表达式,要使用 value,而非表字段。
如:

CREATE SHARDING ALGORITHM database_hint_inline(
TYPE(NAME=HINT_INLINE,
PROPERTIES("algorithm-expression" = "ds_${value % 2}")));

2、hint value 存储的值是字符串形式,所以在需要使用 mod 函数时,应转换为数字类型,因此前述配置还要优化为:

CREATE SHARDING ALGORITHM database_hint_inline(
TYPE(NAME=HINT_INLINE,
PROPERTIES("algorithm-expression" = "ds_${Integer.valueOf(value) % 2}")));

以上就是报错的原因,请修改后再次测试。

测试通过了,谢谢!是我对于HINT的用法理解有误了。我以为创建了以KEY为分库的表之后,还可以通过DISTSQL的hint只查找指定分库的数据。

可以尝试一下注释的方式: 文档页末

注释的方式是从哪个版本开始支持,想尝试一下

5.1.0 刚刚发布,尝试这个版本吧
https://shardingsphere.apache.org/document/current/cn/downloads/

京ICP备2021015875号