我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何通过 ShardingSphere-Proxy 落地分表分库?

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何通过 ShardingSphere-Proxy 落地分表分库?

如何通过 ShardingSphere-Proxy 落地分表分库?

参考:Sharding-Proxy的基本功能使用

1. 环境准备

  • MySql 5.7
  • apache-shardingsphere-4.1.1-sharding-proxy-bin.tar.gz
  • jdk 1.8
  • mysql-connector-java-5.1.49.jar

2. 数据库脚本准备

# 创建商品数据库
CREATE DATABASE IF NOT EXISTS `products` DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;
# 创建商品代理数据库
CREATE DATABASE IF NOT EXISTS `products-proxy` DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;

# 创建商品秒杀表
CREATE TABLE IF NOT EXISTS `seckills` (
	`Id` INT(11) NOT NULL AUTO_INCREMENT,
	`SeckillType` INT(11) NOT NULL,
	`SeckillName` TEXT NULL,
	`SeckillUrl` TEXT NULL,
	`SeckillPrice` DECIMAL(18, 2) NOT NULL,
	`SeckillStock` INT(11) NOT NULL,
	`SeckillPercent` TEXT NULL,
	`TimeId` INT(11) NOT NULL,
	`ProductId` INT(11) NOT NULL,
	`SeckillLimit` INT(11) NOT NULL,
	`SeckillDescription` TEXT NULL,
	`SeckillIstop` INT(11) NOT NULL,
	`SeckillStatus` INT(11) NOT NULL,
PRIMARY KEY (`Id`),
INDEX `ProductId` (`ProductId`)
) COLLATE = "utf8mb4_general_ci" ENGINE = INNODB AUTO_INCREMENT = 2;

# 插入秒杀商品数据
INSERT INTO `seckills`(`Id`, `SeckillType`, `SeckillName`, `SeckillUrl`, `SeckillPrice`, `SeckillStock`, `SeckillPercent`, `TimeId`, `ProductId`, `SeckillLimit`, `SeckillDescription`, `SeckillIstop`, `SeckillStatus`) VALUES (1, 1, "22", "https://img2020.cnblogs.com/blog/1191201/202007/1191201-20200720143227139-1714696954.png", 12.00, 2222, "1", 3, 1, 1, "iphone6是最好的", 1, 1);

INSERT INTO `seckills`(`Id`, `SeckillType`, `SeckillName`, `SeckillUrl`, `SeckillPrice`, `SeckillStock`, `SeckillPercent`, `TimeId`, `ProductId`, `SeckillLimit`, `SeckillDescription`, `SeckillIstop`, `SeckillStatus`) VALUES (2, 1, "22", "https://img2020.cnblogs.com/blog/1191201/202007/1191201-20200720143227139-1714696954.png", 12.00, 2222, "1", 3, 2, 1, "iphone6是最好的", 1, 1);

INSERT INTO `seckills`(`Id`, `SeckillType`, `SeckillName`, `SeckillUrl`, `SeckillPrice`, `SeckillStock`, `SeckillPercent`, `TimeId`, `ProductId`, `SeckillLimit`, `SeckillDescription`, `SeckillIstop`, `SeckillStatus`) VALUES (3, 1, "22", "https://img2020.cnblogs.com/blog/1191201/202007/1191201-20200720143227139-1714696954.png", 12.00, 2222, "1", 3, 3, 1, "iphone6是最好的", 1, 1);

INSERT INTO `seckills`(`Id`, `SeckillType`, `SeckillName`, `SeckillUrl`, `SeckillPrice`, `SeckillStock`, `SeckillPercent`, `TimeId`, `ProductId`, `SeckillLimit`, `SeckillDescription`, `SeckillIstop`, `SeckillStatus`) VALUES (4, 1, "22", "https://img2020.cnblogs.com/blog/1191201/202007/1191201-20200720143227139-1714696954.png", 12.00, 2222, "1", 3, 4, 1, "iphone6是最好的", 1, 1);

3. 配置 ShardingSphere-Proxy

  • 解压 ShardingSphere 到 apache-shardingsphere-4.1.1-sharding-proxy-bin 文件夹

    • 有些 jar 包名称过长导致解压失败,运行时会缺包报错,如:

      Starting the Sharding-Proxy ...
      Exception in thread "main" Cannot create property=orchestration for JavaBean=org.apache.shardingsphere.shardingproxy.config.yaml.YamlProxyServerConfiguration@1517365b
       in "reader", line 24, column 1:
          orchestration:
          ^
      Type org.apache.shardingsphere.orchestration.center.yaml.config.YamlCenterRepositoryConfiguration not present
       in "reader", line 25, column 3:
            orchestration_ds:
      
    • 推荐到 linux 系统下通过 tar -zxvf apache-shardingsphere-4.1.1-sharding-proxy-bin.tar.gz 命令解压

  • 复制 mysql-connector-java-5.1.49.jar 到 ShardingSphere 的 bin 目录中

  • 修改 conf 目录下的 config-sharding.yaml 配置文件:

    # 3. 创建客户端连接库
    schemaName: products-proxy
    
    # 1. 设置 MySQL 数据源
    dataSources:
      ds:
        url: jdbc:mysql://127.0.0.1:3306/products?serverTimezone=UTC&useSSL=false
        username: root
        password: 1010
        connectionTimeoutMilliseconds: 30000
        idleTimeoutMilliseconds: 60000
        maxLifetimeMilliseconds: 1800000
        maxPoolSize: 50
    
    # 2. 设置分片规则 - 分表
    shardingRule:
      tables:
        seckills: # 逻辑表名
          actualDataNodes: ds.seckills_${0..1} # 分 2 张表
          tableStrategy: # 分表策略
            inline:
              shardingColumn: ProductId # 分表字段
              algorithmExpression: seckills_${ProductId % 2} # 对 ProductId 取模分表
    
  • 修改 conf 目录下的 server.yaml 配置文件:

    authentication:
      users:
        root:
          password: 123456
        sharding:
          password: sharding 
          authorizedSchemas: products-proxy
    
    props:
      max.connections.size.per.query: 1
      acceptor.size: 16  # The default value is available processors count * 2.
      executor.size: 16  # Infinite by default.
      proxy.frontend.flush.threshold: 128  # The default value is 128.
        # LOCAL: Proxy will run with LOCAL transaction.
        # XA: Proxy will run with XA transaction.
        # BASE: Proxy will run with B.A.S.E transaction.
      proxy.transaction.type: LOCAL
      proxy.opentracing.enabled: false
      proxy.hint.enabled: false
      query.with.cipher.column: true
      sql.show: false
      allow.range.query.with.inline.sharding: false
    
  • 启动 ShardingSphere-Proxy

    D:ProgramJavaapache-shardingsphere-4.1.1-sharding-proxy-binin>start.bat
    
    # 通过启动日志查看代理数据库的默认端口是 3307
    
    # 新建 mysql 和  mysql-proxy 两个连接备用
    
  • 在 mysql 连接中,新建 productsproducts-proxy数据库

  • 刷新 mysql-proxy 连接,就会看到数据库已经同步过来

  • 打开 mysql-proxy 连接下的 products-proxy 数据库,执行创建 seckills 表的语句

  • 打开 mysql 连接下的 products 数据库,就会发现 sekills_0seckills_1 两张拆分的表

分表原理解析

  • 根据什么原理来分表:表的字段值
  • 如何根据字段值分表:
    • 取模运算(整数类型)
    • hash 运算:先对字符串进行 hash 得到一个值,然后根据 hash 值取模
    • 范围值:0 ~ 10000,10001 ~ 20000,...

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何通过 ShardingSphere-Proxy 落地分表分库?

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何通过 ShardingSphere-Proxy 落地分表分库?

参考:Sharding-Proxy的基本功能使用1. 环境准备MySql 5.7apache-shardingsphere-4.1.1-sharding-proxy-bin.tar.gzjdk 1.8mysql-connector-java-5.1.49.ja
如何通过 ShardingSphere-Proxy 落地分表分库?
2020-01-15

如何通过ODBC在Oracle中管理大数据表分区

在Oracle数据库中,您可以通过ODBC连接来管理大数据表的分区。以下是一些步骤来通过ODBC在Oracle中管理大数据表分区:首先,确保您已经安装了适当的ODBC驱动程序,并且已经建立了与Oracle数据库的连接。通过ODBC连接到Or
如何通过ODBC在Oracle中管理大数据表分区
2024-07-16

如何通过一条数据库语句做数据分析

如何通过一条数据库语句做数据分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。定义物理数据源添加 SQL 数据集时首要任务就是先在 [web 应用根目录]/WEB-INF/ra
2023-06-04

如何通过索引优化PHP与MySQL的数据分片和分库查询?

在大型web应用中,为了提高性能和可伸缩性,常常需要将数据存储在多个数据库实例中,这就需要进行数据分片和分库查询。然而,随着数据量的增加,分片查询可能会导致查询性能下降的问题。为了解决这个问题,我们可以通过优化索引来改善查询性能。本文将详细
2023-10-21

如何通过AmazonAurora实现数据库的分布式事务处理

Amazon Aurora是一个关系型数据库服务,其支持分布式事务处理。要通过Amazon Aurora实现数据库的分布式事务处理,可以按照以下步骤进行操作:使用Amazon Aurora的集群功能: Amazon Aurora支持在多个数
如何通过AmazonAurora实现数据库的分布式事务处理
2024-04-09

如何通过zabbix获取数据库连接的信息及部分扩展

本篇内容介绍了“如何通过zabbix获取数据库连接的信息及部分扩展”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!背景随着应用系统的不断增加,
2023-06-20

如何通过索引提升PHP与MySQL的地理位置查询和分页查询的效率?

在开发Web应用程序时,经常会遇到需要进行地理位置查询和分页查询的需求。由于数据量的增加和查询复杂性的提升,这些查询操作可能会变得越来越慢。为了提升查询效率,我们可以使用索引来优化查询,特别是对于PHP与MySQL的地理位置查询和分页查询。
2023-10-21

如何通过SQL语句在MongoDB中实现分布式数据库的部署和管理?

如何通过SQL语句在MongoDB中实现分布式数据库的部署和管理?摘要:本文将介绍如何通过SQL语句在MongoDB中实现分布式数据库的部署和管理。首先,我们将简要介绍MongoDB以及其分布式特性。然后,我们会逐步介绍如何使用SQL语句来
如何通过SQL语句在MongoDB中实现分布式数据库的部署和管理?
2023-12-18

编程热搜

目录