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
如果:
-
add sharding hint database_value t_order_item = 10;
则按照算法,SQL 语句会路由到 ds_0.t_order_item_0 和 ds_0.t_order_item_1; -
在 1 的基础上,
add sharding hint table_value t_order_item = 0;
则按照算法,SQL 语句会路由到 ds_0.t_order_item_0; -
sharding_value 可以多次 add,如果值覆盖了算法的全部范围,如 0,1 则实际上是全路由;
-
可以通过
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只查找指定分库的数据。
注释的方式是从哪个版本开始支持,想尝试一下