分片利器 AutoTable:为用户带来「管家式」分片配置体验
在《DistSQL:像数据库一样使用 Apache ShardingSphere》一文中,Committer 孟浩然为大家介绍了 DistSQL 的设计初衷和语法体系,并通过实战操作展示了一条 SQL 创建分布式数据库表的强大能力,展现了 Apache ShardingSphere 在新形态下的交互体验。
在前文发布后,小助手陆续收到热心读者的私信,询问使用 DistSQL 配置分片规则的细节,以及使用 YAML、Namespace 等形式的配置时,是否可以像 DistSQL 一样快速方便的完成分布式表的配置和创建?本文将为大家解答这些疑问。
江龙滔
SphereEx 中间件研发工程师,Apache ShardingSphere contributor。目前专注于 ShardingSphere 数据库中间件研发及开源社区建设。
背景
Sharding 是 Apache ShardingSphere 的核心特性,也是 ShardingSphere 最被人们熟知的一项能力。在过去,用户若需要进行分库分表,一种典型的实施流程(不含数据迁移)如下:
图1 Sharding 实施流程示意图
在这一过程中,用户需要准确的理解每一张数据表的分片策略、明确的知晓每张表的实际表名和所在数据库,并根据这些信息来配置分片规则。
以上述分库分表场景为例,实际的数据表分布情况可能如下:
图2 8 库 * 4 表分布示意图
痛点
在前述的分库分表场景中,作为 Sharding 功能的用户,必须要对数据表的分布情况了然于心,才能写出正确的 actualDataNodes 规则。如上述 t_order 表对应的分片配置如下:
tables:
t_order:
actualDataNodes: ds_${0..7}.t_order_${0..3}
databaseStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: database_inline
tableStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: table_inline
shardingAlgorithms:
database_inline:
type: INLINE
props:
algorithm-expression: ds_${order_id % 8}
table_inline:
type: INLINE
props:
algorithm-expression: t_order_${order_id % 4}
尽管 ShardingSphere 的配置规则已经非常的规范和简洁,但仍有用户在使用中遇到各种麻烦:
不理解分片策略或配置规则,无从下手
分片配置与数据表实际分布不匹配
配置表达式格式不正确
等等
如这位用户提出的 issue:
AutoTable 横空出世
为了帮助用户更好的使用分片功能,降低配置复杂度和提升使用体验,Apache ShardingSphere 5.0.0 版本推出了一种新的分片配置方式:AutoTable。
顾名思义,AutoTable 类型的数据表,交由 ShardingSphere 自动管理分片,用户只需要指定分片数量和使用的数据源,无需再关心表的具体分布,配置格式如下:
autoTables:
t_order:
# 指定使用的数据源
actualDataSources: ds_${0..7}
shardingStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: mod
shardingAlgorithms:
mod:
type: MOD
props:
# 指定分片数量
sharding-count: 32
通过以上配置,ShardingSphere 识别出逻辑表 t_order 需要分为 32 片且使用 8 个数据源,则自动计算出 8 库 * 4 表的分布关系,实现和传统方式等效的配置结果。
与 DistSQL 结合
通过前一节的配置对比,相信读者已经感受到了 AutoTable 带来的变革。不过,随着 DistSQL 的公开,ShardingSphere 还能带给我们更多。
在使用 DistSQL 进行数据管理的场景下,AutoTable 能够极大的降低分片配置复杂度。并且,与传统文件配置形式相比,通过 DistSQL 来配置分片规则是即时生效的,无需重启,这样也就完全不用担心单张表的规则调整影响其他在线业务。
除了新增分片配置,DistSQL 也提供了修改和删除分片规则的语法,格式如下:
# 新增分片规则
CREATE SHARDING TABLE RULE t_order (
RESOURCES(resource_0,resource_1),
SHARDING_COLUMN=order_id,TYPE(NAME=hash_mod,PROPERTIES("sharding-count"=4))
);
# 修改分片规则
ALTER SHARDING TABLE RULE t_order (
RESOURCES(resource_0,resource_1),
SHARDING_COLUMN=order_id,TYPE(NAME=hash_mod,PROPERTIES("sharding-count"=10))
);
# 移除分片规则
DROP SHARDING TABLE RULE t_order;
*注:若规则修改影响到存量数据,ShardingSphere 还将提供“弹性扩缩容”的功能用作数据迁移,帮助用户方便快捷的管理分布式数据。有关“弹性扩缩容”的具体细节,请关注后续推送。
FAQ
Q1: ShardingSphere-JDBC 中可以使用 AutoTable 分片配置吗?
AutoTable 支持全部的自动分片算法,包括:
MOD:取模分片算法
HASH_MOD:哈希取模分片算法
VOLUME_RANGE:基于分片容量的范围分片算法
BOUNDARY_RANGE:基于分片边界的范围分片算法
AUTO_INTERVAL:自动时间段分片算法
关于以上算法的更多详细信息,请阅读 Apache ShardingSphere 官方文档-自动分片算法:
https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-jdbc/configuration/built-in-algorithm/sharding/
除内置算法外,用户也可以通过 SPI 扩展的方式加载自定义的分片算法,满足更加定制化的分片需求。
不推荐。如果是已经存在分片规则的数据表,除非能确定切换为 AutoTable 配置后,表分布状态与预期完全一致,否则不建议尝试切换已有配置。
不过若是在原有应用的基础上新增数据表,那么新增的表是可以使用 AutoTable 配置的。
无论是在 ShardingSphere-JDBC 还是 ShardingSphere-Proxy 中,AutoTable 都希望为用户带来「管家式」的分片配置体验。即用户只告诉 ShardingSphere 分片数量,不需要关心实际表在哪个库、哪个库有几张表等问题。
因此,若要使用 AutoTable 配置,推荐用户忘却「先建表、再配规则」的传统思维,改为先配置规则再通过 CREATE TABLE 语句创建数据表。把 ShardingSphere 看作分布式数据库的接入点,而不是中间件。
可以。指定数据源时并不要求名称连续,可以同时使用枚举和 INLINE 表达式,如以下形式:
CREATE SHARDING TABLE RULE t_order (
RESOURCES('resource_${0..9}',resource_12,resource_15,"resource_$->{17..19}"),
...
);
可以。请参考完整的配置样例:
https://github.com/apache/shardingsphere/blob/master/shardingsphere-jdbc/shardingsphere-jdbc-core/src/test/resources/config/config-sharding.yaml
彩蛋
GitHub ID 为 @CatYangWei 的用户第一个发现并提出了关于 AutoTable 相关的问题:
感谢这位细心的用户,我们将会通过 GitHub 与您联系,并送上社区的精美周边。也欢迎更多的社区小伙伴向我们提出优化建议,帮助社区更好地成长~
结语
以上就是本次分享的全部内容,如果读者对 Apache ShardingSphere 有任何疑问或建议,欢迎在 GitHub issue 列表提出,也可提交 Pull Request 参与到开源社区,为社区贡献力量。
GitHub issue:
https://github.com/apache/shardingsphere/issues
贡献指南:
https://shardingsphere.apache.org/community/cn/contribute/

分片利器 AutoTable:为用户带来「管家式」分片配置体验的更多相关文章
- 微信小程序开发平台新功能「云开发」快速上手体验
微信小程序开发平台刚刚开放了一个全新的功能:云开发. 简单地说就是将开发人员搭建微信小程序后端的成本再次降低,此文刚好在此产品公测时,来快速上手看看都有哪些方便开发者的功能更新. 微信小程序一直保持一 ...
- javascript「篱式」条件判断
我们已经知道,null 没有任何的属性值,并且无法获取其实体(existence)值.所以 null.property 返回的是错误(error)而不是 undefined . 考虑下面的代码 if ...
- Google「Game Builder」:不懂编程,也能开发 3D 游戏
简评: 之前微软曾推出过「Kodu Game Lab」,它可以让完全没有编程经验的人通过简单的步骤打造属于自己的游戏.无独有偶,Google 最近在 Steam 也推出了类似的程序「Game Buil ...
- 「知乎」对中国用户而言,Pure Android 是否比 MIUI 或 Flyme 体验更好? - Donnie的博客
这篇文章转载自我在知乎上的回答 哎呀-不要站队嘛.其实这是一个很有意思的题目,让我们一点点来看 哦对,谢妖-.本人是Nexus 5用户,系统当然是Pure Android KitKat啦(臭谷粉!点D ...
- SaaS模式给用户带来的优势
这两年SaaS服务在中国越来越受欢迎,企业正在从使用本地化软件向SaaS服务转变.由于企业用户人力成本的上升.移动终端设备的兴起以及共享经济对企业的影响,企业采用经营设备.软件的方式也在逐渐发生着变化 ...
- Mongodb分片集群技术+用户验证
随着数据量持续增多,后续迟早会出现一台机器硬件瓶颈问题的.而mongodb主打的就是海量数据架构,“分片”就用这个来解决这个问题. 从图中可以看到有四个组件:mongos.config server. ...
- NPM 3 Beta为Windows用户带来利好消息
本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2015/06/angular-2-react-native-roadmap 近日,np ...
- 关于MongoDB副本集和分片集群有关用户和权限的说明分析
1.MongoDB副本集 可以先创建超管用户,然后再关闭服务,创建密钥文件,修改配置文件,启动服务,使用超管用户登录验证,然后创建普通用户 2.MongoDB分片集群 先关闭服务,创建密钥文件,修改配 ...
- 「C++11」Lambda 表达式
维基百科上面对于 lambda 的引入是如下描述的: 在标准 C++,特别是当使用 C++ 标准程序库算法函数诸如 sort 和 find.用户经常希望能够在算法函数调用的附近定义一个临时的述部函数( ...
随机推荐
- linux 常用命令(五)——(centos7-centos6.8)JDK安装
1.安装jdk前先检测系统是否带有OpenJDK:若存在则删除 查看: java -version 查询出OpenJDK相关的文件:rpm -qa | grep java 删除OpenJDK相关的文件 ...
- Mybatis笔记(3)
一.多表查询 1.1 一对一查询 订单和用户(一个订单属于一个) Order实体类有user属性 配置resultMap(OrderMap) <select id="findAll&q ...
- eclipse建立c语言工程以及成功下载到FPGA芯片过程遇到的各种问题以及解决方法详解
推荐大家预先建立好一个工程目录文件夹,确实挺好用,参考正点原子的pdf教程,如下图所示, 我们eclipse在software文件夹建立一个workspace即可 选择用helloworld模板建立工 ...
- thymeleaf+layui加载页面渲染时报错
将freemaker替换成thymeleaf时出现以下问题: org.thymeleaf.exceptions.TemplateProcessingException: Could not parse ...
- Docker基本指令
镜像操作 检索:docker search 关键字 eg:docker search redis 拉取:docker pull 镜像名称:tag :tag可选的 tag表示标签,多为软件版本,默认是l ...
- Spring AOP 事务配置(实现转账事务)
1. 事务特性 事务特性:ACID 原子性:整体 [原子性是指事务包含的所有操作要么全部成功,要么全部失败] 一致性:数据 [一个事务执行之前和执行之后都必须处于一致性状态] 隔离性:并发 [对于任意 ...
- GO安装golang.org/x/net扩展库
在学习golang过程中,有部分示例代码使用到了非标准库golang.org/x/net/html相关的库函数,但是标准代码库中没有该库,因此需要自己安装: 我这里使用git下载源码进行的安装. 为了 ...
- jsp&mvc开发模式&jstl标签&三层架构
目录 jsp 概念 原理 jsp 的脚本 jsp的内置对象 指令 注释 mvc:开发模式 jsp演变历史 mvc 优缺点 El表达式 JSTL 标签 练习 三层架构:软件设计架构 案例:用户信息列表展 ...
- C# 获取应用程序内存
double usedMemory = 0; Process p = Process.GetProcesses().Where(x => x.ProcessName.Co ...
- java版gRPC实战之五:双向流
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...