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 标准的数据库。
SpringBoot整 ShardingSphere-JDBC实现读写分离_第1张图片

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.原理
SpringBoot整 ShardingSphere-JDBC实现读写分离_第2张图片
SpringBoot整 ShardingSphere-JDBC实现读写分离_第3张图片
SpringBoot整 ShardingSphere-JDBC实现读写分离_第4张图片
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;

SpringBoot整 ShardingSphere-JDBC实现读写分离_第5张图片
从服务器配置关联日志关系**(从服务器执行)**

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;

SpringBoot整 ShardingSphere-JDBC实现读写分离_第6张图片
如果两个为YES证明配置成功
接下来可以直接在主库里面新建一个数据库,此时会自动同步到从库
SpringBoot整 ShardingSphere-JDBC实现读写分离_第7张图片

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

新建一个SpringBoot工程

<dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>

        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
            <version>5.1.4version>
            <scope>runtimescope>
        dependency>
        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
            <optional>trueoptional>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
        dependency>

        <dependency>
            <groupId>com.baomidougroupId>
            <artifactId>mybatis-plus-boot-starterartifactId>
            <version>3.4.2version>
        dependency>

        <dependency>
            <groupId>org.apache.shardingspheregroupId>
            <artifactId>sharding-jdbc-spring-boot-starterartifactId>
            <version>4.0.0-RC1version>
        dependency>

        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>druid-spring-boot-starterartifactId>
            <version>1.1.14version>
        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测试 执行结果
SpringBoot整 ShardingSphere-JDBC实现读写分离_第8张图片
测试成功! 。。。。待续(分库分表策列、分布式主键配置、事务管理…)

你可能感兴趣的:(数据库,linux,java,spring,boot)