【愚公系列】2022年04月 .NET架构班 037-分布式中间件 ShardingSphere-Proxy之分表
一、ShardingSphere-Proxy实现分表
将product表分成product-0和product-1的步骤如下:
1、创建数据库
创建数据库hmms
2、在hmms数据库中使用脚本创建创建user表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`useid` int(11) NOT NULL,
`usenam` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '登录名',
`usepwd` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '登录密码',
`usestate` int(11) NULL DEFAULT 2 COMMENT '-1:删除1:注销 2:正常 3:挂失',
`usekey` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户秘钥',
`usetel` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户手机',
`createbyid` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '添加人',
`createbytime` datetime(0) NULL DEFAULT NULL COMMENT '添加时间',
`modifybyid` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人',
`modifybytime` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`useid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
3、然后在config-sharding.yaml中添加分表配置
# 3、创建客户端连接库
schemaName: hmms
#1、连接mysql
dataSources:
hmmsdatasources-0:
url: jdbc:mysql://localhost:3306/hmms?serverTimezone=UTC&useSSL=false
username: root
password: ****
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
# 2、分片规则
rules:
- !SHARDING
tables:
user: #表名
actualDataNodes: hmmsdatasources-0.user-${0..1} #分表规则
tableStrategy:
standard:
shardingColumn: useid #分片键
shardingAlgorithmName: use_MOD #分表算法
shardingAlgorithms: #分表算法
use_MOD: #取模算法
type: MOD
props:
sharding-count: 2
4、在配置文件server.yaml中账号密码
rules:
- !AUTHORITY
users:
- root@%:*****
- sharding@:sharding
provider:
type: ALL_PRIVILEGES_PERMITTED
server.yaml配置项说明
名称 | 数据类型 | 说明 | 默认值 |
---|---|---|---|
sql-show (?) | boolean | 是否在日志中打印 SQL。 打印 SQL 可以帮助开发者快速定位系统问题。日志内容包含:逻辑 SQL,真实 SQL 和 SQL 解析结果。 如果开启配置,日志将使用 Topic ShardingSphere-SQL ,日志级别是 INFO。 |
false |
sql-simple (?) | boolean | 是否在日志中打印简单风格的 SQL。 | false |
executor-size (?) | int | 用于设置任务处理线程池的大小。每个 ShardingSphereDataSource 使用一个独立的线程池,同一个 JVM 的不同数据源不共享线程池。 | infinite |
max-connections-size-per-query (?) | int | 一次查询请求在每个数据库实例中所能使用的最大连接数。 | 1 |
check-table-metadata-enabled (?) | boolean | 是否在程序启动和更新时检查分片元数据的结构一致性。 | false |
query-with-cipher-column (?) | boolean | 是否使用加密列进行查询。在有原文列的情况下,可以使用原文列进行查询。 | true |
proxy-frontend-flush-threshold (?) | int | 在 ShardingSphere-Proxy 中设置传输数据条数的 IO 刷新阈值。 | 128 |
proxy-transaction-type (?) | String | ShardingSphere-Proxy 中使用的默认事务类型。包括:LOCAL、XA 和 BASE。 | LOCAL |
proxy-opentracing-enabled (?) | boolean | 是否允许在 ShardingSphere-Proxy 中使用 OpenTracing。 | false |
proxy-hint-enabled (?) | boolean | 是否允许在 ShardingSphere-Proxy 中使用 Hint。使用 Hint 会将 Proxy 的线程处理模型由 IO 多路复用变更为每个请求一个独立的线程,会降低 Proxy 的吞吐量。 | false |
xa-transaction-manager-type (?) | String | XA 事务管理器类型。列如:Atomikos,Narayana,Bitronix。 | Atomikos |
5、添加mysql相关的连接包
mysql5.0版本:mysql-connector-java-5.1.47.jar
mysql8.0版本:mysql-connector-java-8.0.11.jar
6、启动ShardingSphere-Proxy
7、使用navicat连接
8、在代理数据库中执行插入语句
INSERT INTO `user` VALUES (1, 'admin', '202CB962AC59075B964B07152D234B70', 2, '123', '123123', 'xt', '2022-04-05 10:12:15', 'xt', NULL);
INSERT INTO `user` VALUES (2, 'admin', '202CB962AC59075B964B07152D234B70', 2, '123', '123123', 'xt', '2022-04-05 10:12:15', 'xt', NULL);
二、ShardingSphere-Proxy架构
总共6个阶段:
1、数据库选择:选择具体数据库
2、sql解析:把中间件连接解析成为真实数据库连接
3、sql路由:选择去哪一个真实数据库执行
4、sql重写:优化
5、sql执行:真实数据库获取结果
6、结果合并:从多个表或者多个库获取结果
三、ShardingSphere-Proxy分表原理
1.库分析
技术:使用ModShardingAlgorithm分片算法,ShardingSQLRouter 路由
过程:取出useid % 2 然后进行取模得到 0 1
分析:如果为0 那么, 数据就存储到第一张库,如果为1,数据就存储到第二张库
2.表分析
技术:使用ModShardingAlgorithm分片算法,ShardingSQLRouter 路由
过程:取出useid % 2 然后进行取模得到 0 1
分析:如果为0 那么, 数据就存储到第1张库第1张表,如果为1,数据就存储到第1张库第2张表
3.数据分片原理
对插入语句进行分析:
INSERT INTO seckills (Id, SeckillType, SeckillName, SeckillUrl, SeckillPrice, SeckillStock, SeckillPercent, TimeId, ProductId, SeckillLimit, SeckillDescription, SeckillIstop, SeckillStatus) VALUES(1, 1, '22', 'https://cdn.cnbj1.fds.api.mi-img.com/mi-mall/c1d6232caff62f3b59d11ee09abdb9d5.jpg', 12.00, 22222, '1', 3, 1, 1, 'iphone6是最好的', 1, 1);
技术:使用ModShardingAlgorithm分片算法,ShardingSQLRouter 路由
过程:
1、先取出ProductId % 2 然后进行取模得到 0 1
2、如果结果为0 :根据路由ShardingSQLRouter 找到真实表product-0 数据就存储到第一张库。如果结果为1:根据路由ShardingSQLRouter 找到真实表product-1数据就存储到第二张表。
- 点赞
- 收藏
- 关注作者
评论(0)