ShardingSphere-JDBC不详细的理解

143 阅读4分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路。

@[toc] ShardingSphere:官方文档

ShardingSphere-JDBC简介

sharding-JDBC定位为轻量级Java框架,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。

  • 适用于任何基于 JDBC 的 ORM 框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template 或直接使用 JDBC。
  • 支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP 等。
  • 支持任意实现 JDBC 规范的数据库,目前支持 MySQL,Oracle,SQLServer,PostgreSQL 以及任何遵循 SQL92 标准的数据库。 在这里插入图片描述

功能列表

数据分片

  • 分库 & 分表
  • 读写分离
  • 分片策略定制化
  • 无中心化分布式主键

分布式事务

  • 标准化事务接口
  • XA 强一致事务
  • 柔性事务

数据库治理

  • 分布式治理
  • 弹性伸缩
  • 可视化链路追踪
  • 数据加密

读写分离 主从复制

在这里插入图片描述

1. 配置服务器,mysql配置主从复制

  1. Master节点配置 /etc/my.cnf(master节点执行)
vim /etc/my.cnf

[mysqld]
## 同一局域网内要唯一
server-id=100
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
## 复制过滤,不需要备份的数据库,不输出(mysql库一般不同步)
binlog_ignore_db=mysql
## 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed

修改mysql配置文件后,需要重新启动:service mysqld restart

  1. Slave节点配置/etc/my.cnf(slave节点执行)
vim /etc/my.cnf


[mysqld]
## 设置server_id,注意要唯一
server-id=102
## 开启二进制日志功能,以备Slave作为其他Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
## 复制过滤:不需要备份的数据库,不输出(mysql库一般不同步)
binlog-ignore-db=mysql
## 如果需要同步函数或者存储过程
log_bin_trust_function_creators=true
## 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

修改mysql配置文件后,需要重新启动:service mysqld restart

  1. 在master服务器授权slave服务器可以同步权限(master节点执行)
mysql -uroot -p 密码
## 授予slave服务器可以同步master服务
grant replication slave, replication client on *.* to 'root'@'slave服务的ip' identified by 'slave服务器的密码';
flush privileges;

## 查看mysql现在又哪些用户及对应的IP权限(可以不执行,只是一个查看)
select user,host from mysql.user;
  1. 查看master服务的binlog文件名和位置(master节点执行)
show master status;

在这里插入图片描述 日志文件名:mysql-bin.000003 复制的位置:1070

  1. slave进行关联master节点(slave节点执行) 进入到slave节点: mysql -uroot -p 密码 开始绑定
change master to master_host='master服务器ip',master_user='root',master_password='master密码',master_port=3306,master_log_file='mysql-bin.000003',master_log_pos=1070;

在这里插入图片描述 application文件配置

#默认数据源,主要用于写 如果未配置读写分离的情况下。默认使用这个
sharding.jdbc.config.sharding.default-data-source-name=ds0

#配置主从策略
#负载均衡策略  随机和轮询 random /round_robin
sharding.jdbc.config.masterslave.load-balance-algorithm-type=round_robin
sharding.jdbc.config.masterslave.name=db1s1
sharding.jdbc.config.masterslave.master-data-source-name=ds0
# sharding.jdbc.config.masterslave.slave-data-source-names=ds1,ds2...可以有多个从库配置
sharding.jdbc.config.masterslave.slave-data-source-names=ds1,ds2

MySql分库分表原理

水平拆分:根据数据的离散存储,根据时间,地区,业务进行拆分。 垂直才分:把一个表根据业务维度进行拆分。分表

只有数据量达到一定的级别,才能使用。

# 类名是否能重复
spring:
  main:
    allow-bean-definition-overriding: true
    # 打印sql
  shardingsphere:
    props:
      sql:
        show: true
        # 数据源
    datasource:
      names: ds0,ds1
      ds0:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://121.196.105.121:3306/ksd_order_db?useUnicode=true&characterEncoding=utf8&tinyIntlisBit=false&useSSL=false&serverTimezone=GMT%2B8
        username: root
        password: admin_admin
        maxPoolSize: 100
        minPoolSize: 5
      ds1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://47.99.114.37:3306/ksd_order_db?useUnicode=true&characterEncoding=utf8&tinyIntlisBit=false&useSSL=false&serverTimezone=GMT%2B8
        username: root
        password: admin_admin
        maxPoolSize: 100
        minPoolSize: 5
        # 默认数据源
    sharding:
      default-data-source-name: ds0
      # 配置默认数据源ds1
      tables:
        # ksd_user逻辑表名
        ksd_user:
          key-generator:
            #主键的列名
            column: id
            type: SNOWFLAKE    # 雪花算法
          #数据节点:数据源$->{0,N}.逻辑表名$->{0..N}
          actual-data-nodes: ds$->{0..1}.ksd_user$->{0..1}
          # 拆分库策略,也就是什么样子的数据放入放到哪个数据库中
          database-strategy:
            standard:
              shardingColumn: birthday    #使用自定义的方法分库
              preciseAlgorithmClassName: com.zdpower.shardingjdbc.config.BirthdayAlgorithm
#            inline:
#              sharding-column: age # 分片字段(分片键)
#              algorithm-expression: ds$->{age % 2} # 分片算法表达式
          table-strategy:
            inline:
              sharding-column: age # 分片字段(分片键)
              algorithm-expression: ksd_user$->{age % 2} # 分片算法表达式

事务管理

在同一个数据库操作的时候,可以使用这个注解

@Transactional(rollbackFor = Exception.class)

分布式事务解决方案

@ShardingTransactionType(TransactionType.XA)
@Transactional(rollbackFor = Exception.class)