Sharding-Sphere:Sharding-Proxy分库分表

1.Sharding-Sphere说明,它提供3款产品,以下是其中两款
  • 1.Sharding-JDBC 分库分表、读写分离(参考前两篇文章
  • 2.Sharding-Proxy 分库分表、读写分离,它和mycat类似,属于中间件代理层,它类似一个数据库,代理后面的分库分表的多个数据库,它屏蔽了后端多个数据库的复杂性,应用开发时直接连接 Sharding-Proxy 即可
2.Sharding-JDBC与Sharding-Proxy对比
  • 1.如果你的应用只读写分离、或少量的分出了几个库,使用Sharding-JDBC即可,简单、方便
  • 2.如果你的应用有进行服务化,且有很多服务,每个服务连接所有数据库,以MYSQL为例,分库分表后有20个数据库,有100个服务需要连接,每个服务的连接池设置10个连接,那么每个MYSQL实例将要提供 20 * 100 * 10=20000个连接,mysql 默认连接数是 100,最大连接数是 16384,那么连接数不够用,如果你购买的云数据库,只能升级配置,来提供更多的连接数,将来你的服务更多怎么办,使用proxy代理,应用服务只要连接Sharding-Proxy代理层来解决连接数问题,但代理会有点性能损失
  • 3.Sharding-Proxy连接数消耗低,可以支持很多服务进行连接,支持任意开发语言,但是会有一定性能损耗,因为多了一层代理

在这里插入图片描述

3.Sharding-Proxy架构图

在这里插入图片描述

4.安装、运行Sharding-Proxy
  • 1.下载Sharding-Proxy:https://shardingsphere.apache.org/document/current/cn/downloads/
  • 2.按使用手册,配置、启动Sharding-Proxy:https://shardingsphere.apache.org/document/current/cn/manual/sharding-proxy/usage/
  • 3.上传服务器,解压,进入conf目录,有2个重要的配置文件:server.yaml 和 config-sharding.yaml
    在这里插入图片描述
  • 4.配置 server.yaml ,把下面的配置的 # 注释打开,改为符合自己的配置
# 应用连接 Sharding-Proxy 时需要的账户和密码
authentication:
  username: root
  password: root

props:
  max.connections.size.per.query: 1
  acceptor.size: 4  #  CPU核心数 * 2.
  executor.size: 2  # CPU核心数
  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
  sql.show: false
  • 5.配置 config-sharding.yaml ,把最下面mysql的注释改为符合自己的配置
# 应用连接 Sharding-Proxy 的数据库名称
schemaName: sharding_db

dataSources:
  ds0:
    url: jdbc:mysql://localhost:3306/ds0?useUnicode=true&characterEncoding=UTF-8&useSSL=false
    username: root
    password: 123456
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 30
  ds1:
    url: jdbc:mysql://localhost:3306/ds1?useUnicode=true&characterEncoding=UTF-8&useSSL=false
    username: root
    password: 123456
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 30

shardingRule:
  tables:
    t_order:
      actualDataNodes: ds${0..1}.t_order${0..1}
      tableStrategy:
        inline:
          shardingColumn: order_id
          algorithmExpression: t_order${order_id % 2}
#      keyGenerator:
#        type: SNOWFLAKE
#        column: order_id
    t_order_item:
      actualDataNodes: ds${0..1}.t_order_item${0..1}
      tableStrategy:
        inline:
          shardingColumn: order_id
          algorithmExpression: t_order_item${order_id % 2}
#      keyGenerator:
#        type: SNOWFLAKE
#        column: order_item_id
  bindingTables:
    - t_order,t_order_item
  defaultDatabaseStrategy:
    inline:
      shardingColumn: member_id
      algorithmExpression: ds${member_id % 2}
  defaultTableStrategy:
    none:
  • 6.启动 Sharding-Proxy ,如果是windows系统,双击 start.bat,启动后sharding-proxy目录会有日志文件 logs/stdout.log
cd /usr/local/sharding-proxy/bin
sh start.sh
 
#默认端口 3307 ,可自定义端口使用
sh start.sh 3308

#查看日志观察启动是否成功
tail -f /usr/local/sharding-proxy/logs/stdout.log

在这里插入图片描述

  • 7.使用 Navicat Mysql 客户端连接 Sharding-Proxy,然后创建表,该代理层会根据分库分表规则自动在后端对应的分库中创建表
    在这里插入图片描述
    在这里插入图片描述
5.SpringBoot接入 Sharing-Proxy
  • 1.新建项目,引入依赖,以spring-boot-starter-data-jpa操作sharding-proxy为例:
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.47</version>
</dependency>
<dependency>
	<groupId>com.zaxxer</groupId>
	<artifactId>HikariCP</artifactId>
	<version>3.3.0</version>
</dependency>
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<optional>true</optional>
</dependency>
  • 2.修改application.properties,数据库连接地址为 sharding-proxy 代理地址
server.port=8073
spring.jpa.hibernate.ddl-auto=none
spring.jpa.database=mysql
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

# sharding-proxy 上配置的地址、帐号、密码
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3307/sharding_db?useUnicode=true&characterEncoding=UTF-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root

# Hikari will use the above plus the following to setup connection pooling
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.maximum-pool-size=25
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=HikariCP
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.connection-test-query=SELECT 1
  • 3.JPA实现增删改查
@Data
@Entity
@Table(name = "t_order")
public class Order {

    @Id
    @Column(name = "order_id")
    private Long orderId;

    @Column(name = "member_id")
    private Long memberId;

    @Column(name = "order_code")
    private String orderCode;

    @Column(name = "order_amount")
    private String orderAmount;
}


@Repository
public inte
rface OrderRepository extends JpaRepository<Order , Long> {

}
  • 4.OrderController提供数据操作接口
@RestController
@RequestMapping("order")
public class OrderController {

    @Autowired private OrderRepository orderRepository;

    @RequestMapping("add")
    public Order add(){
        Order order = new Order();
        order.setOrderId(IdWorker.getLongId());
        order.setMemberId(IdWorker.getLongId());
        order.setCreateTime(new Date());
        order.setOrderAmount("330.2");
        order.setOrderCode("abc");
        order.setStatus("1");
        return orderRepository.save(order);
    }

    @GetMapping("findById/{orderId}")
    public Order findById(@PathVariable long orderId){
        return orderRepository.findById(orderId).get();
    }

    @GetMapping("findAll")
    public List<Order> findAll(){
        return orderRepository.findAll();
    }
}
  • 5.启动项目,验证这些接口,与对应的数据是否按分库分表规则插入
    新增order,http://localhost:8073/order/add ,多新增几条数据,在sharding-proxy代理层查询order表,可以看到结果
    在这里插入图片描述
    查询接口 http://localhost:8073/order/findById/132835303097508506
    在这里插入图片描述
    查询所有 http://localhost:8073/order/findAll
    在这里插入图片描述
  • 6.单独连接后端的ds0、ds1数据库,查看刚刚新增的数据是否分到这两个库中了,可以看到确实分库分表了。
    在这里插入图片描述

好了,使用 sharding-proxy 代理进行分库分表验证成功,源码下载

[外链图片转存失败(img-wKtOuN5z-1567735700218)(http://zy.csxiuneng.com/images/1235854.jpg)]

相关推荐
<p> ShardingSphere:SpringBoot2+MybatisPlus+读写分离+分库分表 </p> <p> <strong>课程目标</strong> </p> <p> 快速的掌握读写分离+分表的实战,即插即用适用人群IT从业人员,开发人员,Java从业者,互联网从业者,性能调优人群课程简介 </p><p> <span>ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈。</span> </p> <p>它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成,shardingSphere定位为关系型数据库中间件。  </p> <p> <span><strong>Sharding-JDBC</strong></span> </p> <p style="color:rgb(66,66,66);font-size:14px;background-color:rgb(255,255,255);">Sharding-JDBC是Sharding-Sphere的第一个产品,也是Sharding-Sphere的前身,是当当网开源的一个产品。定位为轻量级的Java框架,在Java的JDBC层提供额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。他们均提供标准化的数据分片、读写分离、柔性事务和数据治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。Sharding-JDBC可以通过Java,YAML,Spring命名空间和Spring Boot Starter四种方式配置,开发者可根据场景选择适合的配置方式。 </p> <p style="color:rgb(66,66,66);font-size:14px;background-color:rgb(255,255,255);"><br /></p> <p> <span><strong>课程特色 </strong></span> </p> <p> <span>本章节以尽量短的时间,为使用者提供最简单的ShardingSphere的快速入门。</span><span></span> </p> <p style="color:rgb(66,66,66);font-size:14px;background-color:rgb(255,255,255);"><span style="color:#323232;"><br /></span> </p> <p style="color:rgb(66,66,66);font-size:14px;background-color:rgb(255,255,255);"><span style="color:#323232;"><strong>课程说明</strong></span> </p> <p style="color:rgb(66,66,66);font-size:14px;background-color:rgb(255,255,255);">该课程属于系列课程,分为读写分离,分库分表,不分库分表分库分表,读写分离+分库分表共5个回合。 </p> <p style="color:rgb(66,66,66);font-size:14px;background-color:rgb(255,255,255);">本课程属于其中一个回合,请各位小哥哥们注意,课程的标题哦~ </p>
<p> <strong>课程目标</strong> </p> <p> 快速的掌握分库的实战,即插即用适用人群IT从业人员,开发人员,Java从业者,互联网从业者,性能调优人群课程简介 </p> <p> <span>ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈。</span> </p> <p> 它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成,shardingSphere定位为关系型数据库中间件。  </p> <p> </p><p> <span><strong>Sharding-JDBC</strong></span> </p> <p> Sharding-JDBC是Sharding-Sphere的第一个产品,也是Sharding-Sphere的前身,是当当网开源的一个产品。定位为轻量级的Java框架,在Java的JDBC层提供额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。他们均提供标准化的数据分片、读写分离、柔性事务和数据治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。Sharding-JDBC可以通过Java,YAML,Spring命名空间和Spring Boot Starter四种方式配置,开发者可根据场景选择适合的配置方式。 </p> <p> <br /></p> <p> <span><strong>课程特色 </strong></span> </p> <p> <span>本章节以尽量短的时间,为使用者提供最简单的ShardingSphere的快速入门。</span><span></span> </p> <p> <span style="color:#323232;"><br /></span> </p> <p> <span style="color:#323232;"><strong>课程说明</strong></span> </p> <p> 该课程属于系列课程,分为读写分离,分库分表,不分库分表分库分表,读写分离+分库分表共5个回合。 </p> <p> 本课程属于其中一个回合,请各位小哥哥们注意,课程的标题哦~ </p>
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页