SpringBoot整 ShardingSphere-JDBC实现读写分离

1 简介

官网:http://shardingsphere.apache.org/index_zh.html
Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。 它们均提供标准化的数据水平扩展、分布式事务和分布式治理等功能
Apache ShardingSphere 5.x 版本开始致力于可插拔架构,项目的功能组件能够灵活的以可插拔的方式进行扩展。 目前,数据分片、读写分离、数据加密、影子库压测等功能,以及 MySQL、PostgreSQL、SQLServer、Oracle 等 SQL 与协议的支持,均通过插件的方式织入项目。 开发者能够像使用积木一样定制属于自己的独特系统。

2.ShardingSphere-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 标准的数据库。
ShardingSphere-JDBC

3.准备工作

1.分别找两台服务器 创建两个数据源(服务器centos7.3 数据库MySql 5.7.34-log)
2.MySQL配置过程

配置 MySQL拓展源

[root@izj3n2w98pz7akz ~]# rpm -ivh  https://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/mysql57-community-release-el7-10.noarch.rpm

Yum安装mysql

[root@izj3n2w98pz7akz ~]# yum install mysql-community-server -y

启动mysql

[root@izj3n2w98pz7akz ~]# systemctl start mysqld

查看mysql启动状态,active 代表激活的 也就是启动

[root@izj3n2w98pz7akz ~]# systemctl status  mysqld

查看数据库密码

[root@izj3n2w98pz7akz ~]# grep "password" /var/log/mysqld.log

登录MySQL

[root@izj3n2w98pz7akz ~]# mysql -uroot -p-puMnQj39<&K93

设置密码等级

mysql> set global validate_password_policy=LOW;

设置密码长度

mysql> set global validate_password_length=5;

重置密码

mysql> set password for root@localhost = password ('qq123');

远程授权登录

mysql> grant all on *.* to  root@'%' identified by 'qq123';

刷新

mysql> flush privileges;

此时数据库已经配置好并且可以远程登录,可以用Navicat尝试登录一下

3.配置MySQL主从复制环境搭建

1.原理
主库和从库
1
主从复制同步原理
Master 主库负责数据写入 通过一个二进制日志文件(Binary log)这个日志文件会把数据库一些增删改的操作记录下来,通过TCP连接 IO线程同步到从库中继日志文件,中继日志文件通过Replay(重刷机制)重新执行一次sql语句。(原理大概意思就是 把一个主机的sql执行记录复制到另外一个主机上在执行一次,来实现数据库同步)
注意:ShardingJDBC 不能完成主从复制(数据层面) 可以完成读写分离(业务层面),用读写分离肯定需要用到主从复制,保持数据一致性。

2 搭建mysql主从复制环境

配置主库

vim /etc/my.cnf
[mysqld]
server-id = 1         	  # 节点ID,确保唯一 一般设置为IP
log-bin = mysql-bin        #开启mysql的binlog日志功能 可以随便取,最好有含义
sync_binlog = 1            #控制数据库的binlog刷到磁盘上去 , 0 不控制,性能最好,1每次事物提交都会刷到日志文件中,性能最差,最安全
binlog_format = mixed      #binlog日志格式,mysql默认采用statement,建议使用mixed
binlog_cache_size = 4m     #binlog缓存大小  为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog-ignore-db=mysql     #不需要备份的数据库不生成日志文件的数据库,多个忽略数据库可以用逗号拼接,或者 复制这句话,写多行

配置从库

vim /etc/my.cnf
[mysqld]
server-id = 2
log-bin=mysql-slave-bin
relay-log = mysql-relay-bin
##复制过滤 不需要备份的数据库 
binlog-ignore-db=mysql
###需要同步函数或者存取过程
log_bin_trust_function_creators=true
binlog_cache_size = 4m
binlog_format = mixed

重启数据库服务(配置完成后主库和从库都重启一下数据库服务)

systemctl restart mysqld

主服务器授权从服务器可以同步权限**(主服务器执行)**

grant replication slave,replication client on *.* to 'root'@'主服务ip' identified by 'qq123'

检查是否授权成功

mysql> flush privileges;
mysql>select user,host from mysql.user;

查看主服务器二进制日志文件

mysql> show master status;

在这里插入图片描述
从服务器配置关联日志关系**(从服务器执行)**

change master to master_host='主服务器ip',master_user='root',master_password='qq123',master_port=3306,master_log_file='mysql-bin.000001',master_log_pos=926;

配置完成后启动从服务器

start leave;

查看连接状态

mysql> show slave status\G;

在这里插入图片描述
如果两个为YES证明配置成功
接下来可以直接在主库里面新建一个数据库,此时会自动同步到从库

4.Spring Boot整合ShardingSphere-JDBC实现读写分离

新建一个SpringBoot工程

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.4</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.0.0-RC1</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.14</version>
        </dependency>

application.yml

server:
  port: 8088

spring:
  main: #允许相同bean名称覆盖
    allow-bean-definition-overriding: true
  shardingsphere:
    datasource:
      names: db0,db1
      db0:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://主库ip:3306/sharding?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT&useSSL=false
        username: root
        password: qq123
        type: com.alibaba.druid.pool.DruidDataSource

      db1:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://从库ip:3306/sharding?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT&useSSL=false
        username: root
        password: qq123
        type: com.alibaba.druid.pool.DruidDataSource


    sharding:
      ##配置默认数据源 主要用于写
      default-data-source-name: db0
    masterslave:
      name: ms
      #配置主库 主要用于写 只可以配置一个
      master-data-source-name: db0
      #配置主库 主要用于读取 可以配置多个
      slave-data-source-names: db1
      load-balance-algorithm-type: round_robin
    props:
      sql:
        show: true

# mybatis-plus配置
mybatis-plus:
  mapper-locations: classpath*:/mappers/*.xml
  configuration:
    call-setters-on-nulls: true
  type-aliases-package: com.xhl.shardingjdbc.model

写一个简单的demo测试 执行结果
结果
测试成功! 。。。。待续(分库分表策列、分布式主键配置、事务管理…)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为您提供一个完整的Spring Boot 2.7.9集成ShardingSphere-JDBC 5.3.2的方案,包括MySQL8的数据库和properties格式的配置文件,只做分离,不进行分库分表。 首先,您需要在pom.xml中添加以下依赖: ``` <dependency> <groupId>io.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>5.3.2</version> </dependency> ``` 然后,在application.properties文件中添加以下配置: ``` # 数据源配置 spring.shardingsphere.datasource.names=ds0,ds1 spring.shardingsphere.datasource.ds0.type=com.zaxxer.hikari.HikariDataSource spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.cj.jdbc.Driver spring.shardingsphere.datasource.ds0.jdbc-url=jdbc:mysql://localhost:3306/db0?useUnicode=true&characterEncoding=UTF-8&useSSL=false spring.shardingsphere.datasource.ds0.username=root spring.shardingsphere.datasource.ds0.password=root spring.shardingsphere.datasource.ds1.type=com.zaxxer.hikari.HikariDataSource spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver spring.shardingsphere.datasource.ds1.jdbc-url=jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=UTF-8&useSSL=false spring.shardingsphere.datasource.ds1.username=root spring.shardingsphere.datasource.ds1.password=root # 分片规则配置 spring.shardingsphere.sharding.default-database-strategy.inline.sharding-column=id spring.shardingsphere.sharding.default-database-strategy.inline.algorithm-expression=ds$->{id % 2} # 分离配置 spring.shardingsphere.sharding.master-slave-rules.ds0.master-data-source-name=ds0 spring.shardingsphere.sharding.master-slave-rules.ds0.slave-data-source-names=ds1 spring.shardingsphere.sharding.master-slave-rules.ds1.master-data-source-name=ds1 spring.shardingsphere.sharding.master-slave-rules.ds1.slave-data-source-names=ds0 ``` 这里我们配置了两个数据源,并且在分片规则配置中使用了取模算法来将数据分到两个数据源中,实现分离。 接下来,您只需要按照上述步骤配置好项目并启动,即可使用该方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值