Apache ShardingSphere HINT 实用指南

作者|陈出新

SphereEx 中间件研发工程师,Apache ShardingSphere Committer,目前专注于 Apache ShardingSphere 内核模块的研发工作。

背景

Apache ShardingSphere 基于用户的实际使用场景,为用户打造了多种实用功能,包括数据分片、读写分离等。在数据分片功能中,Apache ShardingSphere 提供了标准分片、复合分片等多种实用的分片策略,在各种分片策略中,用户又可以配置相关分片算法,从而解决数据分片的问题。在读写分离功能中,ShardingSphere 为用户提供了静态和动态的两种读写分离类型以及丰富的负载均衡算法以满足用户实际需求。

可以看到 ShardingSphere 的分片和读写分离功能已经非常丰富,不过用户的真实使用场景是千变万化的。以多租户场景为例,用户期望按照登录账号所属租户进行分片,但是租户信息却并不是存在于每条业务 SQL 中,这时从 SQL 中提取分片字段的算法将无法发挥作用。再以读写分离为例,大部分场景下用户都希望能够将查询操作路由到从库上执行,但是在某些实时性要求很高的场景下,用户希望将 SQL 强制路由到主库执行,这时读写分离就无法满足业务要求。

基于以上痛点 Apache ShardingSphere 为用户提供了 Hint 功能,用户可以结合实际业务场景,利用 SQL 外部的逻辑进行强制路由或者分片。目前 ShardingSphere 为用户提供了两种 Hint 方式,一种通过 Java API 手动编程,利用 HintManager 进行强制路由和分片,这种方式对采用 JDBC 编程的应用非常友好,只需要少量的代码编写,就能够轻松实现不依赖 SQL 的分片或者强制路由功能。另外一种方式对于不懂开发的 DBA 而言更加友好,ShardingSphere 基于分布式 SQL 提供的使用方式,利用 SQL HINT 和 DistSQL HINT,为用户提供了无需编码就能实现的分片和强制路由功能。接下来,让我们一起了解下这两种使用方式。

基于 HintManager 的手动编程

ShardingSphere 主要通过 HintManager 对象来实现强制路由和分片的功能。利用 HintManager,用户的分片将不用再依赖 SQL。它可以极大地扩展用户的使用场景,让用户可以更加灵活地进行数据分片或者强制路由。目前通过 HintManager,用户可以配合 ShardingSphere 内置的或者自定义的 Hint 算法实现分片功能,还可以通过设置指定数据源或者强制主库读写,实现强制路由功能。在学习 HintManager 的使用之前,让我们先来简单地了解一下它的实现原理,这有助于我们更好地使用它。

HintManager 实现原理

其实通过查看 HintManager 代码,我们可以快速地了解它的原理。

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class HintManager implements AutoCloseable {

    private static final ThreadLocal<HintManager> HINT_MANAGER_HOLDER = new ThreadLocal<>();
}

正如你所看到的,ShardingSphere 通过 ThreadLocal 来实现 HintManager 的功能,只要在同一个线程中,用户的分片设置都会得以保留。因此,只要用户在执行 SQL 之前调用 HintManager 相关功能,ShardingSphere 就能在当前线程中获取用户设置的分片或强制路由条件,从而进行分片或者路由操作。了解了 HintManager 的原理之后,让我们一起来学习一下它的使用。

HintManager 的使用

使用 Hint 分片

Hint 分片算法需要用户实现 org.apache.shardingsphere.sharding.api.sharding.hint.HintShardingAlgorithm 接口。Apache ShardingSphere 在进行路由时,将会从 HintManager 中获取分片值进行路由操作。

参考配置如下:

rules:
- !SHARDING
  tables:
    t_order:
      actualDataNodes: demo_ds_${0..1}.t_order_${0..1}
      databaseStrategy:
        hint:
          algorithmClassName: xxx.xxx.xxx.HintXXXAlgorithm
      tableStrategy:
        hint:
          algorithmClassName: xxx.xxx.xxx.HintXXXAlgorithm
  defaultTableStrategy:
    none:
  defaultKeyGenerateStrategy:
    type: SNOWFLAKE
    column: order_id

props:
    sql-show: true

获取 HintManager 实例

HintManager hintManager = HintManager.getInstance();

添加分片键

  • 使用 hintManager.addDatabaseShardi

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值