征文|「数据库中间件ShardingSphere-ShardingJdbc使用(二)读写分离」

数据库中间件ShardingSphere-ShardingJdbc使用(二)读写分离

背景:

简单的分库、分表有时候并不能有效抵挡大流量的查询,除去缓存的存在,仅仅考虑数据库层面上。可以搭建主从复制架构,可以使写操作在主库进行,主库和从库之间通过异步复制、半同步复制保持数据一致。所有的读操作都在主库的N个从库上进行。通过负载均衡使得每一次查询均匀的落在每一个从库上

由于硬件资源有限,为了模拟主从读写分离,在一台机器上搭建多个MySQL实例,并配置主从关系。如果不知道怎么部署、配置,可参考单机部署MySQL多实例主从复制搭建

上一篇文章已经有了两个主库,3306、3310。为3306实例部署两个从库,3307、3308。

Sharding-Jdbc读写分离也仅需要简单的配置即可使用

一、配置文件修改:

server:
  port: 8999
spring:
  application:
    name: mybatis-demo
  shardingsphere:
    datasource:
      # 数据库的别名
      names: ds0,ds1,ds0-slave0,ds0-slave1
      ds0:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/dhb?serverTimezone=UTC
        password: 12345
        username: root
      ds0-slave0:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3307/dhb?serverTimezone=UTC
        password: 12345
        username: root
      ds0-slave1:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3308/dhb?serverTimezone=UTC
        password: 12345
        username: root
      ds1:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3310/dhb?serverTimezone=UTC
        password: 12345
        username: root
    sharding:
      # 默认分库策略
      default-database-strategy:
        inline:
          sharding-column: id
          algorithm-expression: ds$->{id % 2}
      # 默认分表策略
      default-table-strategy:
        inline:
          sharding-column: age
          algorithm-expression: user_$->{age % 2}
      # 数据节点
      tables:
        user:
          actual-data-nodes: ds$->{0..1}.user_$->{0..1}
      # 默认数据库
      default-data-source-name: ds0
      master-slave-rules:
        ds0:
          master-data-source-name: ds0
          slave-data-source-names: ds0-slave0,ds0-slave1
          #从库负载均衡算法类型,可选值:ROUND_ROBIN,RANDOM。
          #若`load-balance-algorithm-class-name`存在则忽略该配置
          load-balance-algorithm-type: ROUND_ROBIN
          #从库负载均衡算法类名称。该类需实现MasterSlaveLoadBalanceAlgorithm接口且提供无参数构造器
          #load-balance-algorithm-class-name=
    props:
      # 打印SQL
      sql.show: true
      check:
        table:
          metadata:
          # 是否在启动时检查分表元数据一致性
          enabled: true
  aop:
    proxy-target-class: false
    # 因为Druid数据源和默认的数据源冲突,添加此配置
  main:
    allow-bean-definition-overriding: true

mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      logic-not-delete-value: 0
      logic-delete-value: 1
  mapper-locations: classpath:/mapper/*.xml
  typeAliasesPackage: com.example.mybatis.demomybatis.entity

[image]

读写分离主要配置在master-salve-rules配置下面,关于读数据时的从库负载均衡策略可使用 ROUND_ROBIN、RANDOM两种。如果这两种不能满足需求,还可以自定义负载均衡算法,实现MasterSlaveLoadBalanceAlogorithm接口。更多细节可参考官方读写分离文档部分

二、测试:

分别进行四次查询,可以看到sharding-jdbc每一次都是在两个从库之间切换,如下图:

[image]​

总的来说,无论是数据分片、还是读写分离,sharding-sphere都帮我们屏蔽了底层细节,并且让我们使用起来就像对单表操作一样。特别方便

疑惑:

在读写分离时,第一次的查询总是很慢,目前还不知道什么原因,哪位同学知道原因希望留言一下,十分感谢!

示例代码已放到GitHub上,如有需要,请自取。示例代码地址

状态:原创(CSDN博主
JackSparrow414

2 个赞
京ICP备2021015875号