【愚公系列】2022年04月 .NET架构班 037-分布式中间件 ShardingSphere-Proxy之分表

举报
愚公搬代码 发表于 2022/04/05 18:34:27 2022/04/05
【摘要】 一、ShardingSphere-Proxy实现分表将product表分成product-0和product-1的步骤如下:1、创建数据库创建数据库hmms2、在hmms数据库中使用脚本创建创建user表SET NAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;-- ------------------------------ Table structure...

一、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数据就存储到第二张表。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。