shading-jdbc数据库读写分离

官方文档

1. ShardingSphere

1.1 ShardingSphere简介

ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成。 他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、云原生等各种多样化的应用场景。

ShardingSphere定位为关系型数据库中间件,旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库。 它与NoSQL和NewSQL是并存而非互斥的关系。NoSQL和NewSQL作为新技术探索的前沿,放眼未来,拥抱变化,是非常值得推荐的。反之,也可以用另一种思路看待问题,放眼未来,关注不变的东西,进而抓住事物本质。 关系型数据库当今依然占有巨大市场,是各个公司核心业务的基石,未来也难于撼动,我们目前阶段更加关注在原有基础上的增量,而非颠覆。

ShardingSphere目前已经进入Apache孵化器, 欢迎通过shardingsphere的dev邮件列表与我们讨论。

1.2 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标准的数据库。

2. 读写分离简介

2.1 背景

面对日益增加的系统访问量,数据库的吞吐量面临着巨大瓶颈。 对于同一时刻有大量并发读操作和较少写操作类型的应用系统来说,将数据库拆分为主库和从库,主库负责处理事务性的增删改操作,从库负责处理查询操作,能够有效的避免由数据更新导致的行锁,使得整个系统的查询性能得到极大的改善。

通过一主多从的配置方式,可以将查询请求均匀的分散到多个数据副本,能够进一步的提升系统的处理能力。 使用多主多从的方式,不但能够提升系统的吞吐量,还能够提升系统的可用性,可以达到在任何一个数据库宕机,甚至磁盘物理损坏的情况下仍然不影响系统的正常运行。

与将数据根据分片键打散至各个数据节点的水平分片不同,读写分离则是根据SQL语义的分析,将读操作和写操作分别路由至主库与从库。

读写分离的数据节点中的数据内容是一致的,而水平分片的每个数据节点的数据内容却并不相同。将水平分片和读写分离联合使用,能够更加有效的提升系统性能。

2.2 挑战

读写分离虽然可以提升系统的吞吐量和可用性,但同时也带来了数据不一致的问题。 这包括多个主库之间的数据一致性,以及主库与从库之间的数据一致性的问题。 并且,读写分离也带来了与数据分片同样的问题,它同样会使得应用开发和运维人员对数据库的操作和运维变得更加复杂。 下图展现了将分库分表与读写分离一同使用时,应用程序与数据库集群之间的复杂拓扑关系。

2.3 目标

透明化读写分离所带来的影响,让使用方尽量像使用一个数据库一样使用主从数据库集群,是ShardingSphere读写分离模块的主要设计目标。

2.4 核心概念

2.4.1 主库

添加、更新以及删除数据操作所使用的数据库,目前仅支持单主库

2.4.2 从库

查询数据操作所使用的数据库,可支持多从库。

2.4.3 主从同步

将主库的数据异步的同步到从库的操作。由于主从同步的异步性,从库与主库的数据会短时间内不一致。(这一步由数据库层实现,一般RDS数据库提供商,都会提供读写分离的服务)

2.4.4 负载均衡策略

通过负载均衡策略将查询请求疏导至不同从库。

2.5 核心功能

  1. 提供一主多从的读写分离配置,可独立使用,也可配合分库分表使用。
  2. 独立使用读写分离支持SQL透传。
  3. 同一线程且同一数据库连接内,如有写入操作,以后的读操作均从主库读取,用于保证数据一致性。
  4. 基于Hint的强制主库路由。

2.6 不支持项

  1. 主库和从库的数据同步。
  2. 主库和从库的数据同步延迟导致的数据不一致。
  3. 主库双写或多写。

3. 读写分离Demo

3.1 添加pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.tao.learn</groupId>
    <artifactId>m1-7-sharding</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>sharding</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>11</java.version>
    </properties>

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

        <!-- JPA -->


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

        <!-- postgresql -->
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.4.1212</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.shardingsphere/sharding-jdbc-core -->
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-core</artifactId>
            <version>4.0.0-RC1</version>
        </dependency>

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

        <!-- for spring namespace -->
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-namespace</artifactId>
            <version>4.0.0-RC1</version>
        </dependency>

        <dependency>
            
<think>好的,我现在要处理用户关于ShardingProxy的使用指南和常见问题。首先,我需要回顾一下用户提供的引用内容,确保回答准确。 用户提到了四个引用,其中引用1介绍了ShardingSphere的三个产品,包括Sharding-Proxy。引用2提到了配置参数,比如executor.size和sql.show。引用3指向官方文档和示例项目,引用4讨论了阻断路由和改写引擎。这些都是关键点。 用户的问题分为两部分:使用指南和常见问题。我需要将这两部分分开处理,结构清晰。使用指南需要涵盖安装配置、分片规则、读写分离、数据加密、分布式事务等。常见问题可能包括启动失败、SQL兼容性、性能问题、数据不一致和日志调试。 在引用中提到的配置参数(如executor.size)需要包含在配置调优部分。阻断路由属于SQL改写引擎的内容,应该在常见问题中的SQL执行部分提到。同时,要引导用户参考官方文档和示例,如引用3所述。 需要确保所有技术术语正确,比如分片策略、读写分离、分布式事务。同时,避免使用用户不可见的格式,保持回答自然。最后,生成的相关问题要围绕用户可能遇到的进一步疑问,比如性能调优、与其他组件对比、监控工具等。 检查是否有遗漏的信息,比如引用4中的阻断路由应用场景,应该在常见问题中解释。同时,确保每个部分都有对应的引用标记,例如配置参数部分引用2,阻断路由引用4,官方文档引用3。 最后,语言要简洁明了,步骤清晰,便于用户跟随操作。确保没有LaTeX格式错误,行内公式用$...$,独立公式用$$...$$,但根据用户问题,可能数学公式较少,主要关注配置和问题解决。</think>### ShardingProxy 使用指南 #### 1. 安装与配置 ShardingProxy 是 Apache ShardingSphere 的透明化数据库代理,支持通过 YAML 文件配置数据分片、读写分离等功能[^3]。 **步骤**: 1. 下载并解压 ShardingProxy 安装包; 2. 修改 `conf/server.yaml` 配置权限(如用户名、密码); 3. 在 `conf/config-*.yaml` 中定义逻辑库、数据源和分片规则; 4. 启动服务:`bin/start.sh`。 **示例配置**(数据分片): ```yaml schemaName: sharding_db dataSources: ds_0: url: jdbc:mysql://127.0.0.1:3306/db0 ds_1: url: jdbc:mysql://127.0.0.1:3306/db1 rules: - !SHARDING tables: user: actualDataNodes: ds_${0..1}.user_${0..1} databaseStrategy: standard: shardingColumn: user_id shardingAlgorithmName: database_inline tableStrategy: standard: shardingColumn: order_id shardingAlgorithmName: table_inline ``` #### 2. 核心功能 - **分片规则**:支持行表达式、自定义算法等分片策略; - **读写分离**:配置主从数据源,自动路由查询请求[^2]; - **数据加密**:通过加密算法保护敏感字段; - **分布式事务**:支持 XA 和柔性事务(BASE)。 #### 3. 性能调优 - 调整 `executor.size` 控制并发线程数; - 开启 `sql.show` 查看实际执行的 SQL 语句。 --- ### ShardingProxy 常见问题 #### 1. 启动失败 - **原因**:端口冲突或配置语法错误; - **解决**:检查 `server.yaml` 端口设置,使用 YAML 语法校验工具。 #### 2. SQL 执行报错 - **原因**:不支持的 SQL 语法(如复杂子查询); - **解决**:参考官方 SQL 兼容性列表,或启用 `sql.show` 分析路由结果[^4]。 #### 3. 性能瓶颈 - **原因**:分片键设计不合理或线程池过小; - **解决**:优化分片策略,调整 `executor.size` 参数。 #### 4. 数据不一致 - **原因**:主从同步延迟或事务未生效; - **解决**:检查主从复制状态,使用强一致性分布式事务。 #### 5. 日志调试 - 开启 Debug 模式:修改 `logback.xml` 中日志级别为 `DEBUG`。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值