Shell 极简分库分表动态路由系统

目标

用 Shell 维护简单的分库分表路由规则,支持根据业务 key 计算目标库表,适合作为学习、验证或轻量内部工具。

适用场景

  • 需要理解分库分表路由基本原理。
  • 小型内部工具需要根据 ID 计算目标库表。
  • 需要生成 SQL、迁移脚本或排查数据位置。
  • 不适合直接替代成熟数据库中间件。

参数配置

参数示例说明
DB_COUNT4分库数量
TABLE_COUNT16每库分表数量
ROUTE_KEYuser_id路由字段
DB_PREFIXorder_db_数据库名前缀
TABLE_PREFIXorder_表名前缀

核心逻辑

  1. 输入业务 ID。
  2. 对 ID 做 hash 或取模。
  3. 根据分库数量得到目标库。
  4. 根据分表数量得到目标表。
  5. 输出目标库表或生成 SQL。

脚本示例

#!/usr/bin/env bash
set -euo pipefail
 
id="$1"
DB_COUNT=4
TABLE_COUNT=16
DB_PREFIX="order_db_"
TABLE_PREFIX="order_"
 
db_index=$(( id % DB_COUNT ))
table_index=$(( id % TABLE_COUNT ))
 
printf '%s%02d.%s%02d\n' "$DB_PREFIX" "$db_index" "$TABLE_PREFIX" "$table_index"

验证方法

./route.sh 10001
./route.sh 10002
./route.sh 10003

确认点:

  • 同一个 ID 每次路由结果一致。
  • 结果落在合法库表范围。
  • 分库分表数量变更前有迁移方案。

风险与回滚

风险处理方式
路由规则变更导致数据查不到变更前冻结规则并准备迁移
分布不均检查 key 分布和 hash 算法
脚本误用于生产写入明确只用于计算、排查、生成脚本
库表数量扩容困难提前设计扩容策略

相关笔记